首页 文章

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

提问于
浏览
0

我有以下约束我正在尝试使用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表示法 .

2 回答

  • 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-x2 . z1z2 都是二进制变量 . 要绕过 < 不等式,您可能需要在前两个约束中添加一些小epsilon:

    x1    >= y2 + (m-eps)*z1 + eps
    y1    >= x2 + (m-eps)*z2 + eps
    
  • 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条件的第一部分为真 . 即 . X1 <= Y2

    如果z2 = 1,则if条件的第二部分为真 . 即 . X2 <= 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 .

相关问题