有人能帮我解决这个错误吗? 当我得到错误时,我应该看哪里:gurobier错误:无法将参数转换为表达式。 我应该补充一下,我使用的是python中的Gurobi库
from gurobipy import*
m=Model('mymodel')
def label(c):
return "x" + str(c).translate(None, " '")
shifts = [1,2]
hours = [1,2]
games = ['bj', 'cr']
pits = [1,2]
order1 = [1,2]
order2 = [1,2,3]
combo, oi = multidict( {
(1,1,'bj',1,1,1): 100,
(1,1,'bj',1,1,2):200,
(1,1,'bj',1,1,3):200,
(1,1,'bj',1,2,1):50,
(1,1,'bj',1,2,2):70,
(1,1,'bj',1,2,3):70,
(1,1,'cr',1,1,1):400,
(1,1,'cr',1,1,2):450
})
combo= tuplelist(combo)
for s in shifts:
for t in hours:
for i in games:
for n in order1:
m.addConstr(quicksum(x[s,t,i,p,n,k] for s,t,i,p,n,k in combo.select(s,t,i,'*',n,'*'))- int(1)== 0, name=label((s,t,i,p,n,k))
此问题已在Gurobi 6.0.0中修复。其中
quicksum([])
返回值为0的线性表达式(而不是浮点值0.0),这就解决了最初的问题。在版本5.6.3及之前版本中的问题是使用所谓的TempConstr。在
调用addConstr时,可以使用显式的“lefthandside”、“operator”、“rightnhandside”方法:
这不会有问题。在
如果在空列表中使用TempConstr并使用
^{pr2}$quicksum
,则实际发生的情况如下:quicksum
如果列表为空,则返回0,因此您的语句为:并且
0 == 0
被转换为True
,因此您实际上调用:显然,这是Gurobi无法处理的(但它可以提供更好的错误描述)。在
总而言之:如果您使用quicksum,并且有可能列表是空的,那么您可以按照blueenvelope的建议检查列表是否为空,使用显式方法或使用小包装方法(如果这种情况经常发生):
此包装器仅适用于TempConstr as expression。在
如果您试图添加没有模型变量的约束,Gurobi会抱怨。对于某些变量组合,列表枚举将构造空列表,即:
m.addConstr(quicksum([]) - 1 == 0)
又名
m.addConstr(-1 == 0)
这是不可能的。事实上,gurobi仍然会在下面的示例中抛出一个错误,即使表达式不包含变量也是可行的。在
m.addConstr(-1 <= 0)
要解决这个问题,只需在添加约束之前检查列表是否为非空。在
相关问题 更多 >
编程相关推荐