MIP:添加一个变量来表示相等
Posted
技术标签:
【中文标题】MIP:添加一个变量来表示相等【英文标题】:MIP: Adding a Variable to Indicate Equality 【发布时间】:2019-01-18 21:47:59 【问题描述】:我正在尝试在 OR Tools Python API 中构建 MIP 模型。我有两个表达式x
和y
并且想要创建一个变量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 - b
或y - 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
【讨论】:
对不起,我应该提到x
和 y
是整数变量,不一定是二进制的,我认为这只有在它们是二进制时才有效。【参考方案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:添加一个变量来表示相等的主要内容,如果未能解决你的问题,请参考以下文章