【发布时间】: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
我需要从这个 if-else 语句中构建 MILP(混合整数线性规划)约束: 其中 beta 是一个常数。
if (a > b) then c = beta else c = 0
如何构建符合 MILP 约束的语句。有没有解决这个问题的技术。谢谢。
【问题讨论】:
标签: linear-programming integer-programming mixed-integer-programming
我假设a、b 和c 都是这里的决策变量。为了建立你的约束,你需要添加一个新的二进制变量——我们称之为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 设置为a 和b 之间的最大可能(或合理)差异。如果您的模型很小,则无关紧要,但如果您有很多这些决策变量,则可能很重要。
【讨论】: