Gurobi:使用addConstrs()但是表达式不是righ

2024-07-03 06:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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)

有人能帮我吗?谢谢!你知道吗


Tags: infor定义表达式错误line二进制range
1条回答
网友
1楼 · 发布于 2024-07-03 06:28:25

在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 )
>

相关问题 更多 >