混合整数编程IF-THEN与逻辑AND操作

时间:2017-01-10 00:42:39

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

首先,这不是线性编程而是混合整数编程,因为AND约束不是线性的,也不是暗示。我还假设ab都是二进制变量。然后,您可以按如下方式重新制定问题:

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

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

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

答案 1 :(得分:2)

我发现了一种适用于IF-THEN-ELSE的配方,无论给出的问题如何。 在答案的后半部分,我正在使用@ mattmilten的答案中描述的z1, z2变量来处理AND condition

中的if statement

假设问题是以下规范:

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条件的第一部分为真。即。 X1&LT = Y2

如果z2 = 1,则if条件的第二部分为真。即。 X2&LT; = Y1

现在,使用@ 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.