【问题标题】:How to write a maximize constraint using gurobipy如何使用 gurobipy 编写最大化约束
【发布时间】:2020-11-16 17:16:14
【问题描述】:

我在 python 上使用 gurobi 和 我想解决一个路线问题,但是有一些限制我不知道怎么写,如图:

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[]是参数

【问题讨论】:

标签: python gurobi


【解决方案1】:

为了完整起见,请复制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 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多