求助:线性化形如‘若a==b则c=1’的if-then约束(a、b为正整数,c为二元变量)
线性化“if a == b then c = 1”的约束
针对你提到的约束(a、b为正整数,c为二元0-1变量),我来帮你梳理线性化的具体方案——核心思路是排除a==b且c=0的非法组合,同时允许其他所有合法情况。
具体线性约束组(无二次项,通用可行)
我们可以用大M方法+辅助二元变量来实现纯线性约束:
- 引入两个辅助二元变量
x和y(取值仅为0或1); - 选择一个足够大的正整数
M(建议取a和b的最大可能取值,确保M大于a与b的最大差值); - 添加以下4条约束:
a ≥ b + 1 - M * xb ≥ a + 1 - M * yx + y ≤ 1 - cx ∈ {0, 1}, y ∈ {0, 1}
约束作用详解
我们分场景验证有效性:
当a == b时:
如果尝试让c=0,约束3要求x + y ≤1。此时无论x、y取什么组合:- 若
x=0,约束1变为a ≥ b+1,即0≥1,不成立; - 若
y=0,约束2变为b ≥a+1,即0≥1,不成立; - 若
x=1且y=1,约束3x+y≤1直接不成立。
所有组合都不可行,因此c只能取1,完美满足原约束要求。
若
c=1,约束3要求x+y≤0,即x=0且y=0。代入约束1和2,得到a ≥b+1-M和b≥a+1-M,由于M足够大,这两个约束自动成立,允许a==b的情况存在。- 若
当a ≠ b时:
无论c取0还是1,都能找到合法的x、y取值满足约束:- 若
a > b,当c=0时取x=0、y=1,约束1直接成立,约束2因M足够大自动成立;当c=1时取x=0、y=0,两个约束都自动成立。 - 若
b > a,同理调整x、y的取值即可。
- 若
可选简化方案(仅适用于支持二次约束的求解器)
如果你的求解器支持二次约束,也可以不用辅助变量,直接写成:(a - b) * (b - a) ≤ M * (1 - c)
这个式子利用了a==b时左边为0的性质,当c=0时强制左边≤0(即a≠b),但注意这是二次约束,通用性不如纯线性方案。
内容的提问来源于stack exchange,提问作者Unziello
相关产品推荐
相关产品推荐

