【问题标题】:Mixed Integer Linear Programming to And/Or Constraints和/或约束的混合整数线性规划
【发布时间】:2017-11-25 21:15:25
【问题描述】:

我希望使用 PuLP 来满足一组约束,但我不确定如何设置变量来实现这一点。

例如,我将如何为以下约束设置变量:

((x_1 < x_2) AND (x_1 < x_3)) OR ((x_1 > x_2) AND (x_1 > x_3))

变量 x_1 小于或大于 x_2 和 x_3。

任何帮助将不胜感激。谢谢!

【问题讨论】:

标签: python mathematical-optimization linear-programming pulp mixed-integer-programming


【解决方案1】:

约束

 ((x1 <= x2) AND (x1 <= x3)) OR ((x1 >= x2) AND (x1 >= x3))

可以只用一个额外的二进制变量来表示:

 x1 <= x2 + delta*M
 x1 <= x3 + delta*M
 x1 >= x2 - (1-delta)*M
 x1 >= x3 - (1-delta)*M
 delta in {0,1}

大多数高级求解器都有指标约束,允许我们在没有大 M 的情况下编写此代码:

 delta = 0 -> x1 <= x2
 delta = 0 -> x1 <= x3
 delta = 1 -> x1 >= x2
 delta = 1 -> x1 >= x3
 delta in {0,1}

【讨论】:

  • 我必须先通读并实施另一个答案,然后才能理解这个简化的答案。这很干净,很有帮助。谢谢!即使 LP 通常不处理不等式,我猜这对于一些小的常数值 c 可能是正确的?例如:x1 + c= c + x2 - (1-delta)M; x1 >= c + x3 - (1-delta)M; {0,1}中的增量
【解决方案2】:

首先说明:线性规划中没有&lt; 运算符。只有&lt;=。这意味着:如果你想要严格的不等式,你需要添加一些小的常数 epsilon

现在让我们假设您的任务看起来像:((x1&lt;=x2) &amp;&amp; (x1&lt;=x3)) || ((x1&gt;x2) &amp;&amp; (x1&gt;x3))&gt;&lt;= 的逻辑否定,尽管有上述情况,这仍然可以工作)。

让我们打电话给(x1&gt;x2) = z1(x1&gt;x3) = z2。那么这可以是simplified 到:(!z1 || z2) &amp;&amp; (z1 || !z2)(我在链接中使用了名称 A 和 B)。

  • 引入两个新的二进制变量z1, z2
  • 使用基于 bigM 的公式 like this page 4 为您的关系创建指标:
    • x1 &lt;= x2 + M * z1 其中 M 是一个大常数; (z1=0) -&gt; x1 &lt;= x2
    • x1 &lt;= x3 + M * z2 其中 M 是另一个大常数; (z2=0) -&gt; x1 &lt;= x3
  • 现在我们需要上面的:(!z1 || z2) &amp;&amp; (z1 || !z2)
    • 这基本上是一个!(z1 xor z2),这里是1-(z1 xor z2)(查看上面“简化”链接中的真值表),你可以关注一个非常活跃的Stackoverflow用户here来线性化xor
      • 引入另一个二进制变量z3
      • 添加线性约束
        • z3 &lt;= (1-z1) + (1-z2)
        • z3 &gt;= (1-z1) - (1-z2)
        • z3 &gt;= (1-z2) - (1-z1)
        • z3 &lt;= 2 - (1-z1) - (1-z2)
    • z3 现在是 z1 xor z2
    • 添加约束:z3 == 0

(上面可能有一些错误,但概念应该没问题。手头有代码你应该可以让它工作)

【讨论】:

  • 这太棒了!所以我们知道 z3 = !(z1 XOR z2)。有什么区别(1)引入 z3 和额外的约束来线性化 XOR,和(2)只添加 z1 == z2 的约束?
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多