Pulp 添加至少一个 LpAffineExpression 等于 1 的约束

Pulp add constraint that at least one LpAffineExpression is equal to one

假设我有一个定义如下的 PuLP 模型: model = pulp.LpProblem('',pulp.LpMaximize)

并且我添加了一个objective功能(没关系)

现在我有一个 LpAffineExpression 对象的列表: lps = [l1, l2, l3, ...]

我想将其中一个 LpAffineExpression 的计算结果为 1 的约束添加到模型中。我该怎么做?

基本上我正在寻找的是执行以下操作的语法正确方法:

model += (l1 == 1 OR l2 == 1 OR l3 == 1 OR ...)

请注意,我不知道 lps 列表中有多少个 LpAffineExpression 对象,因此我无法将其硬编码。

换句话说,我正在寻找一种方法来将模型中的一组 LpAffineExpression 分组,这样只需要满足一个。

线性或整数规划中没有"OR"。但是,您可以使用二进制变量来模拟这样的 OR 结构。 (或者 SOS1 变量,如果大 M 不受欢迎;我不确定 Pulp 支持 SOS1 变量的范围)。

想法是:

1 - M * (1-δ(i)) <= L(i) <= 1 + M * (1-δ(i)) 
sum(i, δ(i)) >= 1 
δ(i) ∈ {0,1}
  • 显然 L(i) 是你的 l1,l2,l3,...
  • δ(i) 是一个二进制变量,表示是否 L(i)=1。我们有 δ(i)=1 ⇒ L(i)=1.
  • 常数M可以设置为L(i)的下限和上限。