首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PuLP:如何编写多变量约束?

PuLP:如何编写多变量约束?
EN

Stack Overflow用户
提问于 2021-02-12 00:37:04
回答 1查看 147关注 0票数 0

我正在尝试用Python语言解决this optimization problem问题。我使用PuLP编写了以下代码:

代码语言:javascript
复制
import pulp
D = range(0, 10)
F = range(0, 10)
x = pulp.LpVariable.dicts("x", (D), 0, 1, pulp.LpInteger)
y = pulp.LpVariable.dicts("y", (F, D), 0, 1, pulp.LpInteger)
model = pulp.LpProblem("Scheduling", pulp.LpMaximize)
model += pulp.lpSum(x[d] for d in D)
for f in F:
    model += pulp.lpSum(y[f][d] for d in D) == 1
for d in D:
    model += x[d]*pulp.lpSum(y[f][d] for f in F) == 0
model.solve()

这里的倒数第二行返回:TypeError: Non-constant expressions cannot be multiplied。我知道它会返回这个,因为它不能解决非线性优化问题。是否可以将此问题表示为适当的线性问题,以便可以使用PuLP解决?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-12 01:17:59

从数学模型开始总是一个好主意。您必须:

代码语言:javascript
复制
  min sum(d, x[d])
  sum(d,y[f,d]) = 1   ∀f
  x[d]*sum(f,y[f,d]) = 0 ∀d
  x[d],y[f,d] ∈ {0,1} 

最后一个约束是非线性的(它是二次的)。这不能由PuLP处理。约束可以解释为:

代码语言:javascript
复制
  x[d] = 0 or sum(f,y[f,d]) = 0 ∀d

或者

代码语言:javascript
复制
  x[d] = 1 ==> sum(f,y[f,d]) = 0 ∀d

这可以线性化为:

代码语言:javascript
复制
  sum(f,y[f,d]) <= (1-x[d])*M 

其中M = |F| ( F中的元素数量,即|F|=10)。你可以检查一下:

代码语言:javascript
复制
 x[d]=0 => sum(f,y[f,d]) <= M (i.e. non-binding)
 x[d]=1 => sum(f,y[f,d]) <= 0 (i.e. zero)

所以你需要用这个线性约束来代替你的二次约束。

请注意,这不是唯一的公式。您还可以将各个术语z[f,d]=x[d]*y[f,d]线性化。我会把它留作练习。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66158862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档