混合整数编程:每个条件的变量赋值(如果那么其他)

时间:2015-02-08 15:52:53

标签: optimization mathematical-optimization linear-programming scientific-computing integer-programming

我对(混合)整数编程相对较新,并且遇到了约束的制定。

在我的简化模型中,我有一个参数和两个变量,它们是正值Reals,值为321作为上限。我想表达的逻辑是:

if Parameter > Variable1:
    Variable2 = Variable1
else:
    Variable2 = Parameter

**edit** (while Variable1 is always >= Variable2)

实际上是否可以使用线性(均衡)来描述这个?

如果有帮助:对于实现我使用的是Python,Pyomo和最新的gurobi求解器。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

修改:设置Variable2等于最小最多Variable1Parameter

<强> min(Parameter,Variable1)

如果您确定Variable2“想要”在目标函数中变小,那么您只需要Variable2小于或等于Parameter和{{}} {1}}:

Variable1

<强> Variable2 <= Variable1 Variable2 <= Parameter

如果您确定max(Parameter,Variable1)“希望”在目标函数中变大,那么您只需要Variable2大于或等于Variable2和{{}} {1}}:

Parameter

在任何一种情况下:

如果将Variable1设置为严格小于Variable2 >= Variable1 Variable2 >= Parameter /严格大于Variable2的内容是最佳的,那么您也会(除了上述限制之外) )如果min(Parameter,Variable1)

,需要引入一个等于1的新二进制变量
max(Parameter,Variable1)

其中Parameter > Variable1是一个很大的数字。因此,如果Parameter - Variable1 <= M * NewVar Variable1 - Parameter <= M * (1 - NewVar) 那么M 必须等于1,而如果Parameter > Variable1NewVar 必须等于0。 / p>

<强> Parameter < Variable1

引入确保NewVar

的约束
min(Parameter,Variable1)

因此,如果Variable2 >= min(Parameter,Variable1)然后Variable2 >= Parameter - M * NewVar Variable2 >= Variable1 - M * (1 - NewVar) ,则第一个约束无效,第二个约束为Parameter > Variable1。如果NewVar = 1然后Variable2 >= Variable1,则第一个约束为Parameter < Variable1,第二个约束无效。

<强> NewVar = 0

引入确保Variable2 >= Parameter

的约束
max(Parameter,Variable1)

因此,如果Variable2 <= max(Parameter,Variable1)然后Variable2 <= NewVar * Parameter + M * (1 - NewVar) Variable2 <= Variable1 + M * NewVar ,则第一个约束显示Parameter > Variable1,第二个约束无效。如果NewVar = 1然后Variable2 <= Parameter,则第一个约束无效,第二个约束显示Parameter < Variable1

在任何一种情况下:

请注意NewVar = 0应该尽可能小,同时仍然确保在约束中触发Variable2 <= Variable1会使约束不具有约束力。我认为将它设置为M可能获得的最大值就足够了。一般来说,这些“大女士”会削弱配方并导致更长的解决时间,因此您总是希望它们尽可能小。