混合整数规划:每个条件的变量赋值(if then else)
Mixed integer programming: variable assignment per condition (if then else)
我对(混合)整数规划比较陌生,并且受困于约束的制定。
在我的简化模型中,我有一个参数和两个变量,它们是正实数,上限值为 321。我想表达的逻辑在这里:
if Parameter > Variable1:
Variable2 = Variable1
else:
Variable2 = Parameter
**edit** (while Variable1 is always >= Variable2)
是否真的可以使用线性入(等式)来描述这个?
如果有帮助:我正在使用 Python、Pyomo 和最新的 gurobi 求解器来实现。
感谢您的帮助!
编辑:设置 Variable2
等于 或 最大值 Variable1
和 Parameter
.
min(Parameter,Variable1)
:
如果你确定Variable2
"wants"在objective函数中很小,那么你只需要要求Variable2
小于等于Parameter
和 Variable1
:
Variable2 <= Variable1
Variable2 <= Parameter
max(Parameter,Variable1)
:
如果你确定Variable2
"wants"在objective函数中很大,那么你只需要要求Variable2
大于等于Parameter
和 Variable1
:
Variable2 >= Variable1
Variable2 >= Parameter
无论哪种情况:
如果有可能将 Variable2
设置为严格小于 min(Parameter,Variable1)
/ 严格大于 max(Parameter,Variable1)
的值,那么您也将(除了上面的约束)需要引入一个新的二进制变量,如果 Parameter > Variable1
:
等于 1
Parameter - Variable1 <= M * NewVar
Variable1 - Parameter <= M * (1 - NewVar)
其中 M
是一个大数字。因此,如果 Parameter > Variable1
则 NewVar
必须 等于 1,而如果 Parameter < Variable1
则 NewVar
必须 等于 0。
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
then NewVar = 0
,第一个约束没有效果,第二个说 Variable2 <= Variable1
.
无论哪种情况:
请注意,M
应尽可能小,同时仍确保触发约束中的 M
使约束不具有约束力。我认为将它设置为 |Parameter - Variable1|
可能获得的最大值就足够了。一般来说,这些 "big-Ms" 会削弱公式并导致更长的求解时间,因此您总是希望它们尽可能小。
我对(混合)整数规划比较陌生,并且受困于约束的制定。
在我的简化模型中,我有一个参数和两个变量,它们是正实数,上限值为 321。我想表达的逻辑在这里:
if Parameter > Variable1:
Variable2 = Variable1
else:
Variable2 = Parameter
**edit** (while Variable1 is always >= Variable2)
是否真的可以使用线性入(等式)来描述这个?
如果有帮助:我正在使用 Python、Pyomo 和最新的 gurobi 求解器来实现。
感谢您的帮助!
编辑:设置 Variable2
等于 或 最大值 Variable1
和 Parameter
.
min(Parameter,Variable1)
:
如果你确定Variable2
"wants"在objective函数中很小,那么你只需要要求Variable2
小于等于Parameter
和 Variable1
:
Variable2 <= Variable1
Variable2 <= Parameter
max(Parameter,Variable1)
:
如果你确定Variable2
"wants"在objective函数中很大,那么你只需要要求Variable2
大于等于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
是一个大数字。因此,如果 Parameter > Variable1
则 NewVar
必须 等于 1,而如果 Parameter < Variable1
则 NewVar
必须 等于 0。
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
then NewVar = 0
,第一个约束没有效果,第二个说 Variable2 <= Variable1
.
无论哪种情况:
请注意,M
应尽可能小,同时仍确保触发约束中的 M
使约束不具有约束力。我认为将它设置为 |Parameter - Variable1|
可能获得的最大值就足够了。一般来说,这些 "big-Ms" 会削弱公式并导致更长的求解时间,因此您总是希望它们尽可能小。