【问题标题】:inverted indicator constraint in gurobipygurobipy中的倒置指标约束
【发布时间】:2019-08-15 00:20:11
【问题描述】:

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

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

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

其中 x 是二进制变量,y 和 z 是整数变量。该语句表示如果 x 为 True,则约束 y+z

但我想有一个像这样的倒置约束。 如果 y+z

所以倒置的语句会抛出错误。

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

任何想法如何在 gurobipy 中重写这样的条件约束?!

【问题讨论】:

    标签: python linear-programming gurobi


    【解决方案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 保持模棱两可)。

    这是使用指标约束时的一种标准技巧。似乎不是每个人都知道或欣赏这一点。

    【讨论】:

    • 这只是不等式的逆。我试过这个。但对我不起作用
    • 数学上我所做的是正确的。我假设你执行错了。
    【解决方案2】:

    指标语法是

    binary expression >> linear constraint
    

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

    【讨论】:

      【解决方案3】:

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

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

      相当于if y+z-5 &lt;= 0 then x==1 从这里我们需要一个逻辑来根据y+z-5上的条件打开和关闭变量x

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

      会成功的。请注意,如果y+z-5 &lt;= 0 这是我们想要的,x 需要为 1 才能保持关系。同样,如果y+z-5 &gt;= 0,x 将被关闭(设置为 0)

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多