You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:线性化形如‘若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方法+辅助二元变量来实现纯线性约束:

  1. 引入两个辅助二元变量x和y(取值仅为0或1);
  2. 选择一个足够大的正整数M(建议取a和b的最大可能取值,确保M大于a与b的最大差值);
  3. 添加以下4条约束:
    • a ≥ b + 1 - M * x
    • b ≥ a + 1 - M * y
    • x + y ≤ 1 - c
    • x ∈ {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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:27:37