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)
的下限和上限。
假设我有一个定义如下的 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)
的下限和上限。