Gurobi中如何用多变量触发Indicator constraint及相关报错修复
Gurobi多变量触发指示约束报错修复方案
报错原因
报错提示
Indicator constraints can only be triggered by a single binary variable at a given value的核心逻辑是:Gurobi原生指示约束的触发条件仅支持单个二元变量取固定0/1值,不支持多变量运算表达式作为触发判据。
你当前代码中的触发条件x[i,j,k] - t[i,j,k] == 1等价于同时满足x[i,j,k] = 1且t[i,j,k] = 0,属于多变量联合触发场景,无法直接作为指示约束的触发条件。
修复方案
通过引入辅助二元变量,将多变量触发条件绑定到单个二元变量上,再改写指示约束即可,具体步骤如下:
- 新增辅助二元变量
z[i,j,k],用于表示多变量触发条件是否成立
# 按需调整变量定义域,和你原有arcos2的范围对齐即可 z = mdl.addVars(arcos2, vtype=GRB.BINARY, name="trigger_z")
- 添加线性约束绑定辅助变量与原始触发条件
实现z[i,j,k] = 1等价于x[i,j,k] = 1 且 t[i,j,k] = 0:
mdl.addConstrs( z[i,j,k] <= x[i,j,k] for i,j,k in arcos2 if i!=0 and j!=0 ) mdl.addConstrs( z[i,j,k] <= 1 - t[i,j,k] for i,j,k in arcos2 if i!=0 and j!=0 ) # 若仅需要单向触发(x和t满足条件时z必须为1,不需要z为1时反推x和t的取值),可省略下面这条约束 mdl.addConstrs( z[i,j,k] >= x[i,j,k] - t[i,j,k] for i,j,k in arcos2 if i!=0 and j!=0 )
- 用辅助变量改写指示约束
mdl.addConstrs( (z[i,j,k] == 1) >> (d2[j,k] == d2[i,k] - d[i,j]) for i, j, k in arcos2 if i != 0 and j != 0 )
内容的提问来源于stack exchange,提问作者Phan Thi Kim Phung
相关产品推荐
相关产品推荐

