如何使用gurobipy编写最大化约束

时间:2020-11-09 07:13:49

标签: python gurobi

我在python和 我想解决路线问题,但是有一些我不知道如何写的约束,如图所示:

image

我尝试了几种方法,

第一次尝试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] ) 运行代码,但每次都无法正常工作。

  • 请注意,M代表BigM,我设置的eps为1e-6
  • a []和b []是连续变量,x []是二进制变量,T_ij []是参数

1 个答案:

答案 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个功能。