在 python 中在 google 的 OR-Tools CP-SAT 中创建自定义约束

Creating custom constraints in google's OR-Tools CP-SAT in python

提问人:MrKhonsu 提问时间:10/29/2023 最后编辑:Laurent PerronMrKhonsu 更新时间:10/29/2023 访问量:52

问:

我刚刚开始学习约束编程,所以如果我的问题可能非常微不足道,请原谅我。

主要动机是优化我已经通过蛮力解决的问题。我在 python 或工具模块中使用 CP-SAT 求解器。

这是我面临的问题的描述 - (请注意 - CP 变量是与 CP 模块相关的变量)

我有“X”CP 变量。我想对这些变量施加的约束与这些 X 变量之间的差异数量有关。例如,我想存储所有差异 - abs(X1-X2) , abs(X3-X4), ..(其中 X1,X2,...是我最初定义的 CP 变量)在一个单独的数组中,然后执行一些计算(例如计数)来施加我的约束。

我已经意识到这根本不可能,因为在数组创建和普通 python 变量中涉及CP_variables显然是不允许的。

我究竟应该如何使用约束编程来解决这个问题?我别无选择,只能将我的约束条件浓缩到数学中吗?

如果这个问题的框架不好,我很抱歉,但我正在寻找有关如何解决这个问题的见解。文档对我来说太僵化了,有时我无法理解,而且网上没有很多这方面的资源,这无济于事。

提前致谢。

Python 优化 OR-工具 约束-编程 运筹学

评论


答:

2赞 Laurent Perron 10/29/2023 #1

您需要创建中间变量。

  x = model.NewIntVar(0, 10, 'x')
  y = model.NewIntVar(0, 10, 'y')
  diff = model.NewIntVar(-10, 10, 'diff')
  model.Add(diff == x - y)
  abs_diff = model.NewIntVar(0, 10, 'abs_diff')
  model.AddAbsEquality(abs_diff, diff)