0

我对(混合)整数编程比较陌生,并且被约束的公式所困扰。

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

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

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

实际上是否可以使用线性(等式)来描述这一点?

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

谢谢你的帮助!

4

1 回答 1

1

编辑:设置Variable2等于和的最小值最大值。Variable1Parameter

min(Parameter,Variable1)

如果您确定Variable2“希望”在目标函数中很小,那么您只需要要求Variable2小于或等于两者ParameterVariable1

Variable2 <= Variable1
Variable2 <= Parameter

max(Parameter,Variable1)

如果您确定Variable2“希望”在目标函数中很大,那么您只需要要求Variable2大于或等于两者ParameterVariable1

Variable2 >= Variable1
Variable2 >= Parameter

在任一情况下:

如果有可能将其设置Variable2为严格小于min(Parameter,Variable1)/严格大于 的值是最佳的max(Parameter,Variable1),那么(除了上述约束之外)您还需要引入一个等于 1 的新二进制变量,如果Parameter > Variable1

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

哪里M是大数。因此,如果Parameter > Variable1thenNewVar 必须等于 1,而 if Parameter < Variable1thenNewVar 必须等于 0。

min(Parameter,Variable1)

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

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

所以,如果Parameter > Variable1then NewVar = 1,第一个约束没有效果,第二个说Variable2 >= Variable1。如果Parameter < Variable1then NewVar = 0,则第一个约束Variable2 >= Parameter为 ,而第二个约束无效。

max(Parameter,Variable1)

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

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

因此,如果Parameter > Variable1then NewVar = 1,则第一个约束Variable2 <= Parameter为 ,而第二个约束无效。如果Parameter < Variable1then NewVar = 0,第一个约束没有效果,第二个说Variable2 <= Variable1

在任一情况下:

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

于 2015-02-08T21:25:08.310 回答