如何在Python MIP线性规划中实现二元变量y与连续变量x的关联约束
线性规划中二元变量与连续变量的逻辑约束实现
需求说明
要实现的逻辑约束:
连续变量
x > 0时,二元变量y = 1;x = 0时,y = 0
现有写法的问题
你之前写的约束里有非线性项(y * 10000000和x * 10000000),线性规划只支持线性表达式,这种写法会导致模型无法正常求解。
正确的线性化约束方案
要把这个逻辑转成线性约束,需要引入一个足够大的正数M(M要大于x可能取到的最大值),然后添加以下约束:
强制
x>0时y必须为1:self.model.add_constr(x <= M * y, name="x_positive_requires_y1")逻辑:如果
y=0,那x必须≤0;如果y=1,x≤M(只要M够大,这个约束不会限制x的正取值)。保证
x非负(如果你的场景里x本来就不会为负,这一步可以根据情况调整):self.model.add_constr(x >= 0, name="x_non_negative")确认
y是二元变量(如果之前已经定义过,这步可以跳过):self.model.add_var(var_type=mip.BINARY, name="y")
如果需要严格对应x>0(线性规划里没法直接表示严格大于,通常用极小正数ε近似,比如1e-6),可以再加一条约束:
self.model.add_constr(x >= ε * y, name="y1_requires_x_positive")
逻辑验证
- 当
x=0:由x <= M*y可得0 <= M*y,结合y是0/1的二元变量,y只能取0; - 当
x>0(或x≥ε):如果y=0,x >= ε*y会变成x≥0,但我们需要x>0对应y=1,所以y必须为1;y=1时,x<=M不会限制x的正取值,符合需求。
内容的提问来源于stack exchange,提问作者Jose Antonio Gomez De La Hiz
相关产品推荐
相关产品推荐

