说我有一个这样定义的PuLP模型:
model = pulp.LpProblem('',pulp.LpMaximize)
我添加了一个目标函数(没关系)
现在,我有LpAffineExpression
个对象的列表:
lps = [l1, l2, l3, ...]
我想将这些LpAffineExpression
之一评估为1的约束添加到模型中。
基本上,我要寻找的是语法正确的方式来执行以下操作:
model += (l1 == 1 OR l2 == 1 OR l3 == 1 OR ...)
请注意,我不知道LpAffineExpression
列表中有多少个lps
对象,因此无法对其进行硬编码。
换句话说,我正在寻找一种在模型中对一组LpAffineExpression
进行分组的方法,这样就只需要满足一个条件即可。
答案 0 :(得分:0)
在线性或整数编程中没有“ OR”。但是,您可以使用二进制变量来模拟这种OR构造。 (或者,如果不希望使用big-M则使用SOS1变量;我不确定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)
的上限和下限。