CPLEX约束编程添加endBeforeStart约束报非数组类型错误如何修复
CPLEX endBeforeStart数组类型报错修复方案
报错核心原因
你对opttask的维度定义和索引逻辑使用错误:
opttask[j in Jobs][m in Machines]的第一个索引是任务ID,第二个索引是机器ID- 你的
Precedence元组中pre、post存储的是任务ID,原有约束写法将任务ID放到了机器ID的索引位置,还额外套了一层forall(j in Jobs)的无效循环,导致入参维度不匹配触发数组类型报错。 - 你需要实现的是任务全局前置约束,不需要遍历任务维度循环。
最优修复方案
直接使用你已经定义的任务主区间task[j]写约束即可,alternative约束已经保证task[j]和该任务选中的opttask区间时间完全对齐,逻辑更清晰且不会出现索引错误:
将原有错误的约束块:
forall(j in Jobs) forall(p in Precedences) endBeforeStart(opttask[j][p.pre],opttask[j][p.post]);
替换为:
forall(p in Precedences) endBeforeStart(task[p.pre], task[p.post]);
其他注意事项
- 补充
Jobs集合定义:在模型中添加Jobs = 1..nbJobs;,否则遍历Jobs会触发未定义报错 - 补全
transitionTimes定义:你的代码中noOverlap约束使用了该参数,若没有机器切换时间可定义为全0的二维数组:transitionTimes = [ [0,0], [0,0] ];
内容的提问来源于stack exchange,提问作者Willem B
相关产品推荐
相关产品推荐

