如何在MILP/MIP中建模含二进制变量的if-then-else逻辑?
混合整数线性规划逻辑建模方案
针对你需要实现的逻辑(二进制变量y,连续变量x₁、x₂,固定参数k₁):
if y == 1 then:
x₂ = k₁*x₁
else (y == 0):
x₂ = 0
你最初的思路核心问题是大M必须为固定常数,不能依赖变量x₁——线性规划约束中的系数和常数项都必须是定值,否则约束会变成非线性,不符合MILP的要求。以下是正确的线性建模方法:
关键前提
实际MILP问题中,连续变量x₁必然存在明确的可行域上下界(否则问题无界,不具备求解意义)。假设:
x₁的上界为U₁(即x₁ ≤ U₁)x₁的下界为L₁(通常取非负值0)
线性约束组
取大M值为M = |k₁| * (U₁ - L₁)(若k₁非负且L₁=0,可简化为M = k₁*U₁),添加以下4个线性约束:
x₂ ≤ k₁*x₁ + M*(1 - y) x₂ ≥ k₁*x₁ - M*(1 - y) x₂ ≤ M*y x₂ ≥ -M*y
约束逻辑验证
- 当
y=1时:
后两个约束变为x₂ ≤ M和x₂ ≥ -M(因M足够大,不对x₂形成有效限制);前两个约束合并为x₂ = k₁*x₁,完全符合逻辑要求。 - 当
y=0时:
前两个约束变为x₂ ≤ M和x₂ ≥ -M(约束宽松,无实际限制);后两个约束合并为x₂ = 0,满足逻辑规则。
额外说明
如果x₁和k₁均非负,可去掉x₂ ≥ -M*y这个约束(因x₂本身非负),进一步简化为3个约束,但核心逻辑不变。
内容的提问来源于stack exchange,提问作者sirob
相关产品推荐
相关产品推荐

