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

Python 如何使用gurobipy编写最大化约束,python,gurobi,Python,Gurobi,我在python和 我想解决一个路由问题,但有一些约束条件我不知道如何写,如图所示: 我试过几种方法 第一次尝试:model.addConstr(a[j,k]==max_uz((b[i,k]+T[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

我在python和 我想解决一个路由问题,但有一些约束条件我不知道如何写,如图所示:

我试过几种方法

第一次尝试:
model.addConstr(a[j,k]==max_uz((b[i,k]+T[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.addConstr((c==0)>>(b[i,k]+T_ij[i,j]-(1-x[i,j,k])*M>(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,我为is 1e-6设置的eps
  • a[]和b[]是连续变量,x[]是二进制变量,T_ij[]是参数

为完整起见,请从以下地址复制答案:

您的第一次尝试几乎成功。请注意,
max_389;()

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
函数。

@dejdej感谢您的编辑!这已经在中得到了回答。