我在python和 我想解决路线问题,但是有一些我不知道如何写的约束,如图所示:
我尝试了几种方法,
第一次尝试:model.addConstr(a[j,k] == max_((b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M), 0) )
第二次尝试:单独使用指标约束,如下所示
model.addConstr((c == 0) >> (b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M <= -eps) )
model.addConstr((c == 1) >> (b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M >= 0))
第三次尝试:model.addGenConstrMax( a[j,k], [0, b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M] )
运行代码,但每次都无法正常工作。
答案 0 :(得分:0)
为完整起见,请复制Gurobi Forum中的答案:
您的第一次尝试几乎成功。请注意,max_()
仅接受单个变量和常量作为参数,而术语(b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M)
是LinExpr
。因此,为了使您的第一种方法可行,您可以为每个术语添加辅助变量为
N = [1,2,3]
V = [4,5,6]
a = m.addVars(N,V,name="a")
b = m.addVars(N,V,name="b")
T_ij = m.addVars(N,N,name="T_")
x = m.addVars(N,N,V,name="x")
aux = m.addVars(N,N,V,name="aux")
M = 10000
for i in N:
for j in N:
for k in V:
m.addConstr(aux[i,j,k] == (b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M))
m.addConstr(a[j,k] == max_( aux[i,j,k], 0) )
第三种方法也是如此,因为max_()
只是addGenConstrMax()
函数的快捷方式。
您的第二种方法应该可以正常工作,但是我建议您使用一种
max
个功能。