You need to enable JavaScript to run this app. Gurobi中如何用多变量触发Indicator constraint及相关报错修复
优惠活动
大模型
产品
解决方案
定价
更多

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,属于多变量联合触发场景,无法直接作为指示约束的触发条件。

修复方案

通过引入辅助二元变量,将多变量触发条件绑定到单个二元变量上,再改写指示约束即可,具体步骤如下:

  1. 新增辅助二元变量z[i,j,k],用于表示多变量触发条件是否成立
# 按需调整变量定义域,和你原有arcos2的范围对齐即可
z = mdl.addVars(arcos2, vtype=GRB.BINARY, name="trigger_z")
  1. 添加线性约束绑定辅助变量与原始触发条件
    实现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
)
  1. 用辅助变量改写指示约束
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 00:15:00