在gurobipy中倒置指标约束

时间:2018-05-16 08:55:33

标签: python linear-programming gurobi

我是gurobipy的初学者。我想添加一个倒置指标约束。

指标约束只不过是依赖于二元变量,约束是否成立。 在gurobipy中,这写为

model.addConstr((x == 1) >> (y + z <= 5))

其中x是二进制变量,y和z是整数变量。该陈述表示如果x为True,则约束y + z <= 5成立。

但是我希望像这样有一个倒置约束。 如果y + z <= 5则x == 1.但是gurobi不允许声明的lhs部分是不等式。它只能是一个等于常数(0或1)的二进制变量。

因此,反向语句会抛出错误。

model.addConstr((y + z <= 5) >> (x == 1))

如何在gurobipy中重写这样的条件约束?

3 个答案:

答案 0 :(得分:1)

含义

y+z ≤ 5  ⇒  x = 1

可以改写为:

x = 0  ⇒  y+z ≥ 6

这可以直接作为指标约束实现。

这是基于命题逻辑。这称为换位:

A ⇒ B
⇔
not B ⇒ not A 

所以理论上我们有

y+z ≤ 5  ⇒  x = 1
⇔
x = 0  ⇒  y+z > 5

如果x和y是整数,我们可以说x = 0 ⇒ y+z ≥ 6如果它们是连续变量,你可以这样做:x = 0 ⇒ y+z ≥ 5.0001(实际上我会这样做:x = 0 ⇒ y+z ≥ 5并且在{y+z = 5处保持模糊不清1}})。

使用指标约束时,这是一种标准技巧。似乎不是每个人都意识到或赞赏这一点。

答案 1 :(得分:1)

指标语法是

binary expression >> linear constraint

所以你的约束无效。当y +z≤5时,您需要一个强制x为1的不同模型。假设y,z是非负整数,请尝试6x + y +z≥6。

答案 2 :(得分:0)

我认为最好的方法是使用big-M方法 让我们重新考虑您要建模的问题

If y+z <= 5 then x == 1

它等效于if y+z-5 <= 0 then x==1 从这里开始,我们需要一个逻辑,该逻辑将根据y+z-5

上的条件打开和关闭变量x
y + z - 5 <= M(1-x)

可以解决问题。请注意,如果y+z-5 <= 0是我们想要的,则x必须为1才能保持该关系。同样,如果y+z-5 >= 0

,x将被关闭(设置为0)。

我希望这对您有帮助