【问题标题】:Mixed Integer Programming IF-THEN with Logical AND operation使用逻辑与运算的混合整数编程 IF-THEN
【发布时间】:2017-01-10 00:42:39
【问题描述】:

我尝试使用 Python 的 PuLP 模块在混合整数编程中建模以下约束:

给定线性规划变量:x1,x2,y1,y2 其中 x1、x2、y1、y2 最终求解为整数值

if (x1<=y2 and y1<=x2) then a=1 else b=0

我不确定如何处理IF condition 中的Logical AND。如果 AND 不存在,我知道我必须使用 Big-M 表示法。

【问题讨论】:

  • 我认为标签“线性规划”是合适的。是的,这是一个混合整数线性编程问题,但它仍然是线性的。

标签: python if-statement linear-programming integer-programming mixed-integer-programming


【解决方案1】:

首先,这不是线性规划,而是混合整数规划,因为AND 约束不是线性的,也不是隐含的。我还假设ab 都是二进制变量。然后,您可以将问题重新表述如下:

x1    >  y2 + m*z1
y1    >  x2 + m*z2
a + 1 >= z1 + z2
a     <= z1
a     <= z2
a - b >= 0

这里,m 需要是某个(负)下限,即m &lt; x1-y2m &lt; y1-x2z1z2 都是二进制变量。要绕过 &lt; 不等式,您可能需要在前两个约束中添加一些小的 epsilon:

x1    >= y2 + (m-eps)*z1 + eps
y1    >= x2 + (m-eps)*z2 + eps

【讨论】:

  • 谢谢!我将问题改为混合整数规划,而不是原来的(不正确的)线性规划。还为此添加了一个新标签,因为之前没有混合整数编程标签。
  • 在此,if a=1 then b=0if a=0 then b=1。仅当我们处于 else 条件时,我才想要 b=0。并且 a=1 仅当我们处于 if-then 条件时。在其他情况下,所有值都是允许的。将a-b&gt;=0 作为最后一个约束工作而不是b=1-a
  • 是的,我想你的表述是正确的。我误解了你的初始约束。
  • 您的公式不强制执行 else 条件。只有 if 条件。我在下面给出了一个更好的答案,它在前两个条件中的每一个上都使用了 (1-z) 额外条件以确保它有效。我仍然赞成您的回答,因为除了允许 AND 条件的新约束之外,我还使用了 z1、z2 概念。
【解决方案2】:

我找到了一个适用于IF-THEN-ELSE 的公式,无论给出的问题如何。 在答案的后半部分,我使用@mattmilten 的答案中描述的z1, z2 变量来处理if statement 中的AND condition

假设问题是以下规范:

if α > 0 then β >= 0 else γ >= 0

那么,

α - z * U_α <= 0          # (1)
α - (1 - z)(L_α - 1) > 0  # (2)
β - (1 - z)L_β >= 0       # (3)
γ - z * L_γ >= 0          # (4)

在哪里,

L_α, L_β, L_γ # are constant lower bounds on α, β, γ (or values smaller than the lowest value they can take) 
U_α           # is a constant lower bounds on α 
z             # is a LP variable that can take values {0,1}

如果 z==1

那么等式(1)和(4)是多余的,then condition或(3)被强制执行

如果 z==0

那么等式(2)和(3)是多余的,else condition或(4)被强制执行

针对这个问题

我们运行了两次,第一次使用 α=α1,第二次使用 α=α2。

在哪里,

α1 = y2 - x1
z1 = decision variable for α1 with values {0,1} 
α2 = y1 - x2
z2 = decision variable for α2 with values {0,1} 

β # Currently unnecessary for my particular question. 
γ # Currently unnecessary for my particular question. 

所以我们的约束变成:

α1 - z1 * U_α1 <= 0          # (1-1)
α1 - (1 - z1)(L_α1 - 1) > 0  # (1-2)
α2 - z2 * U_α2 <= 0          # (2-1)
α2 - (1 - z2)(L_α2 - 1) > 0  # (2-2)

如果 z1=1,那么我们的 if 条件的第一部分为真。 IE。 x1

如果 z2=1,那么我们的 if 条件的第二部分为真。 IE。 x2

现在,使用@mattmilten 的公式来确保这两个条件:

a + 1 >= z1 + z2
a     <= z1
a     <= z2
a - b >= 0

这确保 z1 和 z2 都必须 >= 1 才能使 a=1。如果 a=1 那么 b 可以是 b=1 或 b=0 而不会违反最后一个条件。

如果 a=0 则我们处于 else 条件,因此 b 必须为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2022-01-17
    • 1970-01-01
    • 2020-05-17
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多