混合整数规划:每个条件的变量赋值(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 等于 最大值 Variable1Parameter.

min(Parameter,Variable1):

如果你确定Variable2"wants"在objective函数中很小,那么你只需要要求Variable2小于等于ParameterVariable1:

Variable2 <= Variable1
Variable2 <= Parameter

max(Parameter,Variable1):

如果你确定Variable2"wants"在objective函数中很大,那么你只需要要求Variable2大于等于ParameterVariable1:

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 > Variable1NewVar 必须 等于 1,而如果 Parameter < Variable1NewVar 必须 等于 0。

min(Parameter,Variable1):

引入约束以确保 Variable2 >= min(Parameter,Variable1):

Variable2 >= Parameter - M * NewVar
Variable2 >= Variable1 - M * (1 - NewVar)

因此,如果 Parameter > Variable1NewVar = 1,第一个约束无效,第二个表示 Variable2 >= Variable1。如果 Parameter < Variable1NewVar = 0,第一个约束表示 Variable2 >= Parameter,第二个约束无效。

max(Parameter,Variable1):

引入约束以确保 Variable2 <= max(Parameter,Variable1):

Variable2 <= NewVar * Parameter + M * (1 - NewVar)
Variable2 <= Variable1 + M * NewVar

因此,如果 Parameter > Variable1NewVar = 1,第一个约束表示 Variable2 <= Parameter,第二个约束无效。如果 Parameter < Variable1 then NewVar = 0,第一个约束没有效果,第二个说 Variable2 <= Variable1.

无论哪种情况:

请注意,M 应尽可能小,同时仍确保触发约束中的 M 使约束不具有约束力。我认为将它设置为 |Parameter - Variable1| 可能获得的最大值就足够了。一般来说,这些 "big-Ms" 会削弱公式并导致更长的求解时间,因此您总是希望它们尽可能小。