MILP约束中if语句线性化:求解决策变量x与y互斥为正的约束问题
互补约束
x*y=0的MILP线性化实现方法 前提要求:你需要先确定两个决策变量的取值上下界,我们默认按你描述的「仅可取正值」场景,假设x和y均为非负变量,已知上界分别为U_x、U_y,即满足0 ≤ x ≤ U_x、0 ≤ y ≤ U_y。
具体实现步骤如下:
- 引入1个二进制辅助决策变量
b,取值约束为b ∈ {0, 1} - 新增以下两组线性约束:
x ≤ U_x * by ≤ U_y * (1 - b)
约束逻辑验证:
当
b=1时,第一组约束退化为x ≤ U_x(对x无额外限制,可在定义域内任意取值),第二组约束变为y ≤ 0,结合y非负的属性可得y=0,满足「x非零时y必须为0」的要求;
当b=0时,第一组约束变为x ≤ 0,结合x非负的属性可得x=0,第二组约束退化为y ≤ U_y(对y无额外限制),满足「y非零时x必须为0」的要求。
特殊场景适配:
- 若变量没有明确的有限上界,可结合问题实际场景设置一个足够大的合理大M值作为上界,注意不要选择过大的M,避免引发求解器数值稳定性问题。
- 若变量允许取负值,只需对应调整绑定约束即可:比如x的取值范围为
L_x ≤ x ≤ U_x,就新增x ≤ U_x * b和x ≥ L_x * b两组约束,y同理绑定(1-b)做上下界限制即可。
内容的提问来源于stack exchange,提问作者amal nammouchi
相关产品推荐
相关产品推荐

