我在 pyomo 中制定的 MILP 中有一个约束。 这是它的一般表述:
定义约束(m,t): 返回 (m.y[t] <= max(0,m.x1[t] - m.x2[t])) model.constraint_c = pyo.Constraint(model.timeindex, rule=constraint)
y、x1 和 x2 是时间索引的非负实数变量。
用自己的话说:仅当 (x1-x2) 为正数时,y 才应为 (x1-x2),否则 y=0。
我找到了不同的方法来线性化最小/最大函数,但没有一个适合我的目的。 非常感谢您的帮助!
y ≤ max(0, x1-x2)
是非凸的,所以你需要二进制变量(或相关的东西)。一个公式是:
y ≤ M⋅δ
y ≤ x1-x2+M⋅(1-δ)
δ ∈ {0,1}
其中M是一个足够大的常数。你需要仔细考虑M的大小。
如果你没有好的界限(并且 M 变得很大),那么最好使用 SOS1 集。例如:
y ≤ s1
y ≤ x1-x2+s2
s1,s2 ≥ 0
s1,s2 ∈ SOS1
在 Pyomo 中,使用其析取编程工具可能会更容易。