Julia-Jump整数规划优化模型:矩阵与向量相乘的约束问题
解决JuMP中员工工序分配时间约束的错误问题
我用JuMP构建了一个优化模型,包含三个二进制决策变量:
X[p,s]:工序p是否分配到工位sY[a,s]:员工a是否分配到工位sZ[a,p]:员工a是否分配到工序p(取值1表示分配,0表示未分配)
需要编写约束保证每个员工被分配的总工序时间不超过节拍限制takt_lim,最初写的约束是:
@constraint(m, associate_takt[a in A, p in P], sum(Z[a, p]*Pt[p] for p in P) <= takt_lim)
后来错误地改成用value.(Z),导致报错OptimizeNotCalled():
@constraint(m, associate_takt[a in A, p in P], sum(value.(Z[a, p])*Pt[p] for p in P) <= takt_lim)
问题根源与修正
- 迭代器错误:原约束的迭代器
[a in A, p in P]会为每一对员工-工序生成约束,但我们只需要为每个员工生成一个总时间约束,迭代器应该只保留[a in A]。 - 误用
value()函数:value()是用来获取优化求解后变量的取值,在构建约束时直接使用变量Z[a,p]即可,不需要调用value()。
正确的约束写法:
@constraint(m, associate_takt[a in A], sum(Z[a, p] * Pt[p] for p in P) <= takt_lim)
解释
这个约束会对每个员工a,计算其所有被分配工序p的时间总和(Z[a,p]=1时计入Pt[p],否则不计),并确保总和不超过takt_lim,完全符合需求。
内容的提问来源于stack exchange,提问作者Brett Davis
相关产品推荐
相关产品推荐

