You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Gurobi/Python添加约束时出现‘Missing constraint index’错误原因

KeyError: 'Missing constraint index' in Gurobi/Python: 原因与修复方案

这个错误的根源非常明确——你误用了Gurobi的约束添加方法:

你写的是m.addConstrs()(复数形式),但这个方法是用来批量添加多个约束的,它要求输入的表达式是一个带有索引的生成器(比如遍历某个集合生成多个约束),这样Gurobi才能为每个约束分配对应的索引。但你现在要添加的是单个约束,用addConstrs()的话,Gurobi找不到用来标识这个约束的索引,就会抛出KeyError: 'Missing constraint index'

修复步骤

m.addConstrs()改成m.addConstr()(单数形式),这才是用来添加单个约束的方法。另外还要注意代码末尾缺少了闭合的括号,补上后代码就能正常运行了。

修正后的完整代码:

from gurobipy import Model, GRB, quicksum  # 记得导入需要的类和函数

N_SERVERS = 5 #number of servers
C_SERVER = [1]*N_SERVERS
N_NODES = 3 #number of nodes
C_NODES = [2]*N_NODES
#create model
m = Model("mip1")
#declare variables
x = m.addVars(len(C_SERVER), vtype=GRB.BINARY, name = "x")
y = m.addVars(len(C_NODES), vtype=GRB.BINARY, name = "y")
m.update()
# 改用addConstr,补全闭合括号,同时给约束命名方便后续调试
m.addConstr(quicksum(x[i]*C_SERVER[i] for i in range(len(x))) + quicksum(y[j]*C_NODES[j] for j in range(len(y))) == quicksum(C_SERVER), name="total_cost_balance")

额外提示

  • 给约束加上name参数,后续调试或者查看模型结构时,能更方便地识别对应的约束。
  • 在新版本的Gurobi中,m.update()其实不是必须的,因为addVarsaddConstr会自动触发模型更新,不过保留也不会有问题。
  • 如果确实需要批量添加多个约束,再使用addConstrs(),示例如下:
# 示例:给每个节点j添加y[j] ≤ 1的约束
m.addConstrs((y[j] <= 1 for j in range(len(y))), name="node_upper_limit")

内容的提问来源于stack exchange,提问作者cherryp

火山引擎 最新活动