纸浆添加约束,即至少一个LpAffineExpression等于1

时间:2018-12-19 01:22:58

标签: python linear-programming pulp

说我有一个这样定义的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进行分组的方法,这样就只需要满足一个条件即可。

1 个答案:

答案 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)的上限和下限。