MILP 中 min(0,x1-x2) 的 Pyomo 线性化

问题描述 投票:0回答:1

我在 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。

我找到了不同的方法来线性化最小/最大函数,但没有一个适合我的目的。 非常感谢您的帮助!

linear-programming pyomo linearization
1个回答
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 中,使用其析取编程工具可能会更容易。

© www.soinside.com 2019 - 2024. All rights reserved.