You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:24:04