Gurobi:使用 addConstrs() 但表达式不正确

Gurobi: Using addConstrs() but the expression is not right

本文关键字:表达式 不正确 使用 addConstrs Gurobi      更新时间:2023-10-16

我是Gurobi和Python的新手。我正在尝试解决一个简单的混合二进制问题,但有一些错误。

我定义的问题如下,

我想要变量 u[1,1], u[2,1], u[3,1] 和 u[1,2], u[2,2], u[3,2],与变量 p 相似。我想添加上面的约束,但有一些错误说我的表达式不正确。

u=m.addVars([1, 2, 3], [1, 2], vtype=GRB.BINARY)
p=m.addVars(3,2,lb=0.0)
m.addConstrs(p[i,j]<= 30*u[i,j]
for i in range(3)
for j in range(2))
m.addConstrs(p[(i,j)]>=5*u[(i,j)]
for i in range(3)
for j in range(2))

错误是这样的

line 14, in <module>
for i in range(3)
File "model.pxi", line 3062, in gurobipy.Model.addConstrs
File "/Users/Documents/pyexercise/HW4Q1.py", line 15, in <genexpr>
for j in range(2))
KeyError: (0, 0)

谁能帮我解决这个问题?谢谢!

在 Python 中,使用range(n)返回从0n-1n数字列表。因此,您的addConstrs()函数迭代键(0,0)(0,1)(1,0)(1,1)(2,0)(2,1)键。

但是,u变量按(1,1)(1,2)(2,1)(2,2)(3,1)(3,2)进行索引:

gurobi> u = m.addVars([1, 2, 3], [1, 2], vtype=GRB.BINARY)
gurobi> u.keys()
<gurobi.tuplelist (6 tuples, 2 values each):
( 1 , 1 )
( 1 , 2 )
( 2 , 1 )
( 2 , 2 )
( 3 , 1 )
( 3 , 2 )
>

您会收到KeyError,因为约束的索引与变量的索引不匹配。要解决此问题,您可以更改u变量的构造以匹配p变量的构造:

gurobi> u = m.addVars(3, 2, vtype=GRB.BINARY)
gurobi> u.keys()
<gurobi.tuplelist (6 tuples, 2 values each):
( 0 , 0 )
( 0 , 1 )
( 1 , 0 )
( 1 , 1 )
( 2 , 0 )
( 2 , 1 )
>