如何处理Gurobi约束中的绝对值

时间:2019-10-29 17:31:03

标签: gurobi

我想处理Gurobi约束中的绝对值。这是我的代码abc.lp。但是我没有解决办法。

Maximize
  v0 + v1 + v2



SubjeCt To
C1: 3 v0 + v1 + v2 <=   72

C2: 2 v0 + 3 v1 + 2 v2 <= 80

C3: abs_(v0 - v1) + abs_(v1 - v2) >= 10

Integers 
v0 v1 v2
End

1 个答案:

答案 0 :(得分:1)

abs_函数是Gurobi Python API的一部分,不适用于LP文件。 (读取LP文件时,求解程序将您的C3约束解释为线性约束,其中包含四个变量,分别为名称abs_(v0v1)abs_(v1和{{1} }。)

此外,请注意,绝对值约束只能采用v2)的形式。因此,您将必须定义一些辅助变量来对上面的约束进行建模。

在Python API中,您可以按如下所示对约束var1 = abs_(var2)进行建模:

C3

在LP文件中,您可以在“常规约束”部分中看到绝对值约束:

a = model.addVars(4, name="a")   # auxiliary variables
model.addConstr(a[0] == v0 - v1)
model.addConstr(a[1] == v1 - v2)
model.addConstr(a[2] == abs_(a[0]))
model.addConstr(a[3] == abs_(a[1]))

model.addConstr(a[2] + a[3] >= 10)