我对(混合)整数编程相对较新,并且遇到了约束的制定。
在我的简化模型中,我有一个参数和两个变量,它们是正值Reals,值为321作为上限。我想表达的逻辑是:
if Parameter > Variable1:
Variable2 = Variable1
else:
Variable2 = Parameter
**edit** (while Variable1 is always >= Variable2)
实际上是否可以使用线性(均衡)来描述这个?
如果有帮助:对于实现我使用的是Python,Pyomo和最新的gurobi求解器。
感谢您的帮助!
答案 0 :(得分:1)
修改:设置Variable2
等于最小或最多Variable1
和Parameter
。
<强> 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)
:
max(Parameter,Variable1)
其中Parameter > Variable1
是一个很大的数字。因此,如果Parameter - Variable1 <= M * NewVar
Variable1 - Parameter <= M * (1 - NewVar)
那么M
必须等于1,而如果Parameter > Variable1
则NewVar
必须等于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
可能获得的最大值就足够了。一般来说,这些“大女士”会削弱配方并导致更长的解决时间,因此您总是希望它们尽可能小。