我有以下约束我试图使用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表示法。
答案 0 :(得分:3)
首先,这不是线性编程而是混合整数编程,因为AND
约束不是线性的,也不是暗示。我还假设a
和b
都是二进制变量。然后,您可以按如下方式重新制定问题:
x1 > y2 + m*z1
y1 > x2 + m*z2
a + 1 >= z1 + z2
a <= z1
a <= z2
a - b >= 0
此处,m
需要是某个(负)下限,即m < x1-y2
和m < y1-x2
。 z1
和z2
都是二进制变量。要绕过<
不等式,您可能需要在前两个约束中添加一些小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}
然后等式(1)和(4)是多余的,then condition
或(3)被强制执行
然后等式(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.