GurobiError:无法将参数转换为表达式

2024-09-28 20:56:42 发布

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

有人能帮我解决这个错误吗? 当我得到错误时,我应该看哪里: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))

Tags: infor参数表达式错误labelgamescr
2条回答

此问题已在Gurobi 6.0.0中修复。其中quicksum([])返回值为0的线性表达式(而不是浮点值0.0),这就解决了最初的问题。在

版本5.6.3及之前版本中的问题是使用所谓的TempConstr。在

调用addConstr时,可以使用显式的“lefthandside”、“operator”、“rightnhandside”方法:

m.addConstr(quicksum([]), GRB.EQUAL, 0)

这不会有问题。在

如果在空列表中使用TempConstr并使用quicksum,则实际发生的情况如下:

^{pr2}$

quicksum如果列表为空,则返回0,因此您的语句为:

m.addConstr(0 == 0)

并且0 == 0被转换为True,因此您实际上调用:

m.addConstr(True)

显然,这是Gurobi无法处理的(但它可以提供更好的错误描述)。在

总而言之:如果您使用quicksum,并且有可能列表是空的,那么您可以按照blueenvelope的建议检查列表是否为空,使用显式方法或使用小包装方法(如果这种情况经常发生):

def add_constr(model, expression, name=""):
    if expression is True:
        return model.addConstr(0, GRB.EQUAL, 0, name)
    elif expression is False:
        raise Exception('`False` as constraint for {}'.format(name))
    else:
        return model.addConstr(expression, name)

此包装器仅适用于TempConstr as expression。在

如果您试图添加没有模型变量的约束,Gurobi会抱怨。对于某些变量组合,列表枚举将构造空列表,即:

m.addConstr(quicksum([]) - 1 == 0)

又名

m.addConstr(-1 == 0)

这是不可能的。事实上,gurobi仍然会在下面的示例中抛出一个错误,即使表达式不包含变量也是可行的。在

m.addConstr(-1 <= 0)

要解决这个问题,只需在添加约束之前检查列表是否为非空。在

相关问题 更多 >