inverted indicator constraint in gurobipy

こ雲淡風輕ζ 提交于 2021-02-10 09:52:19

问题


I am a beginner in gurobipy. I would like to add an inverted indicator constraint.

Indicator constraint is nothing but depending on a binary variable a constraint does or does not hold. In gurobipy this is written as

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

where x is a binary variable, y and z are integer variables. This statement says that if x is True then the constraint y+z <= 5 holds.

But I would like to have an inverted constraint like this. If y+z <= 5 then x == 1. But gurobi does not allow the lhs part of the statement to be an inequality. It can only be a binary variable equal to a constant (0 or 1).

So the inverted statement throws an error.

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

Any ideas how to rewrite such a conditional constraint in gurobipy?!


回答1:


The implication

y+z ≤ 5  ⇒  x = 1

can be rewritten as:

x = 0  ⇒  y+z ≥ 6

This can be directly implemented as an indicator constraint.


This is based on propositional logic. This is called transposition:

A ⇒ B
⇔
not B ⇒ not A 

So in theory we have

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

If x and y are integers we can say x = 0 ⇒ y+z ≥ 6 If they are continuous variables you could do: x = 0 ⇒ y+z ≥ 5.0001 (in practice I would do: x = 0 ⇒ y+z ≥ 5 and keep things ambiguous at y+z = 5).

This is kind of a standard trick when using indicator constraints. It seems not everyone is aware of or appreciates this.




回答2:


The indicator syntax is

binary expression >> linear constraint

So your constraint is invalid. You need a different model that forces x to 1 when y + z ≤ 5. Assuming y, z are non-negative integers, try 6x + y + z ≥ 6.




回答3:


I think the best way to go with this one is to use the big-M approach Let reconsider the problem you are trying to model

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

It is equivalent to if y+z-5 <= 0 then x==1 From here we need a logic that will turn on and off the variable x depending on the condition on the y+z-5

y + z - 5 <= M(1-x)

will do the trick. Note that the x will need to be 1 for the relationship to hold if y+z-5 <= 0 which is what we want. Similarly, x will be turned off (set to 0) if y+z-5 >= 0

I hope this helps



来源:https://stackoverflow.com/questions/50366433/inverted-indicator-constraint-in-gurobipy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!