MIP:添加一个变量来表示相等

Posted

技术标签:

【中文标题】MIP:添加一个变量来表示相等【英文标题】:MIP: Adding a Variable to Indicate Equality 【发布时间】:2019-01-18 21:47:59 【问题描述】:

我正在尝试在 OR Tools Python API 中构建 MIP 模型。我有两个表达式xy 并且想要创建一个变量b,当x == y 时等于1,否则为0。到目前为止,我尝试将-M(1 - b) <= x - y <= M(1 - b) 的约束添加到M 的某个大值,如果x != y 则强制b 为0。我被卡住的地方是添加一个约束,如果x == y,则强制b 为1。我想我想要x - y >= 1 - by - x >= 1 - b 之类的东西,但我不知道如何在逻辑上组合这样的约束。关于如何做到这一点的任何建议?还是采用一些完全不同的方法?

【问题讨论】:

关于布尔值的重要知识:False == 0 && True == 1 你的意思是我应该说b = x == y?我认为我无法以这种形式向模型添加约束。 我的意思是布尔值 True 等于数字 1,布尔值 False 等于数字 0。 【参考方案1】:

我认为以下表达式对你有用:

b <= x - y + 1
b <= y - x + 1
b >= 1-x + 1-y - 1
b >= y + x - 1

【讨论】:

对不起,我应该提到 xy 是整数变量,不一定是二进制的,我认为这只有在它们是二进制时才有效。【参考方案2】:

请注意,根据模型的性质,CP-SAT 求解器可能具有竞争力。并且它原生地提供了具体化和半具体化。

请看一下

[具体回答]https://github.com/google/or-tools/blob/master/ortools/sat/doc/channeling.md [简介]https://developers.google.com/optimization/cp/cp_solver#cp-sat_example [CP-SAT 食谱] https://github.com/google/or-tools/blob/master/ortools/sat/doc/index.md

【讨论】:

我使用 OR-tools 的原因是能够将我的模型插入到许多不同的求解器中以便比较它们。 CP-SAT 也支持这个吗? 不,CP-SAT 是一个独立的求解器。不过 minizinc 有一个后端。

以上是关于MIP:添加一个变量来表示相等的主要内容,如果未能解决你的问题,请参考以下文章

算法训练营:等式

python 中不等于怎么表示

1145.cn 百度MIP适配实例

javascript中的符号 == 和 === 的区别

如何在我们的 MIP 问题中使用 or-tools 设置像 y = max(x1,x2,x3) 这样的等式约束?

js题