【问题标题】:Build MILP constraint from if-else statements从 if-else 语句构建 MILP 约束
【发布时间】:2019-04-29 07:59:33
【问题描述】:

我需要从这个 if-else 语句中构建 MILP(混合整数线性规划)约束: 其中 beta 是一个常数。

if (a > b) then c = beta else c = 0

如何构建符合 MILP 约束的语句。有没有解决这个问题的技术。谢谢。

【问题讨论】:

    标签: linear-programming integer-programming mixed-integer-programming


    【解决方案1】:

    我假设abc 都是这里的决策变量。为了建立你的约束,你需要添加一个新的二进制变量——我们称之为x——如果a > b等于1,否则等于0。您还需要一个大常量M。然后添加以下约束:

    Mx >= a - b
    M(1-x) >= b - a
    x in {0,1}
    

    逻辑是:如果a > b,则x 在第一个约束条件下必须等于 1(而x 可能在第二个约束条件下等于 1)。如果b > a,则1-x 在第二个约束条件下必须等于1,即x 必须等于0(并且x 可能在第一个约束条件下等于0)。

    接下来,我们需要一个约束,如果x = 1,那么c = beta,否则,c = 0

    c = beta * x
    

    注意:上面的逻辑允许c等于0或者如果a = b等于beta;求解器将决定​​。如果a = b,你需要c等于0吗?

    另一个注意事项:在像这样的“big-M”类型的公式中,最好在保持约束有效性的同时保持M 尽可能小。在这种情况下,这意味着将M 设置为ab 之间的最大可能(或合理)差异。如果您的模型很小,则无关紧要,但如果您有很多这些决策变量,则可能很重要。

    【讨论】:

    • 非常感谢!
    • 当然可以。仅供参考,在新的 Operations Research Stack 上还有更多关于优化和建模的内容。
    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 2021-04-11
    • 1970-01-01
    • 2017-08-27
    • 2019-04-09
    • 2022-01-23
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多