IBM CPLEX ILOG调度代码报错:noOverlap函数不存在求助
CPLEX调度代码报错:"函数noOverlap不存在" 解决方案
问题概述
使用IBM CPLEX ILOG开发调度模型时,触发错误提示:函数noOverlap不存在。以下是问题代码、配套数据及修复方案。
原始代码(含问题)
int N=...; int M=...; int R=...; // 数据结构 range Jobs = 0..N; // 包含虚拟作业0 range Machines = 1..M; range Resources = 1..R; // 参数(需根据实际数据定义) int processingTime[Jobs][Machines] = ...; int readyTime[Jobs] = ...; int setupTime[Jobs][Jobs][Machines] = ...; // 决策变量 dvar interval Xim[Jobs][Machines] optional size processingTime[N][M]; // 索引错误:应使用processingTime[i][j] dvar interval Zi[Jobs] size processingTime[N][M]; // 索引错误:应使用对应作业的处理时间 dvar sequence seqMachines[Machines] in all(i in Jobs, j in Machines : machineEligibility[i][j] == 1) Xim[i][j]; // 决策表达式 dexpr int Cmax = max(i in Jobs) endOf(Zi[i]); // 目标函数 minimize Cmax; // 约束条件 subject to { // 优先级约束 forall(p in precedenceConstraints) endBeforeStart(Zi[p.pred], Zi[p.succ]); // 约束(9):作业开始时间(含换型时间) forall(i in Jobs, j in Machines : machineEligibility[i][j] == 1) startOf(Xim[i][j]) >= readyTime[i] + typeOfPrev(seqMachines[j], Xim[i][j], 0, 0, setupTime[typeOfPrev(seqMachines[j], Xim[i][j], 0, 0)][i][j]); // 约束(10):资源累积约束 forall(v in Resources) cumulative(Zi, resourceNeed[Jobs][v], resourceAvail[v]); // 索引错误:应使用resourceNeed[i][v] // 约束(11):机器使用约束(原代码误用cumulative) forall(m in Machines) cumulative(all(i in Jobs : machineEligibility[i][m] == 1) pulse(Xim[i][m], 1), 1); // 约束(12):基于优先级的作业最早开始时间 forall(i in Jobs) startOf(Zi[i]) >= max(p in precedenceConstraints: p.succ == i) endOf(Zi[p.pred]); // 约束(13):Cmax下界约束 Cmax >= LB; } // 执行并打印结果 execute { cp.startNewSearch(); while (cp.next()) { writeln("Solution:"); for(var i in Jobs) { if (cp.isPresent(Zi[i])) writeln("Job ", i, ": Start = ", cp.startOf(Zi[i]), ", End = ", cp.endOf(Zi[i])); } } cp.endSearch(); }
配套数据参数
// 各作业就绪时间
readyTime = [0, 1, 2];// 作业i转作业j的机器换型时间
setupTime = [
[[0, 0, 0], [0, 1, 2], [0, 1, 1]], // 作业0→其他,机器1/2
[[0, 0, 0], [0, 1, 2], [0, 1, 1]], // 作业1→其他,机器1/2
[[0, 0, 0], [0, 1, 2], [0, 1, 1]] // 作业2→其他,机器1/2
];// 作业资源需求量
resourceNeed = [
[0], // 虚拟作业0
[2], // 作业1
[1] // 作业2
];// 资源可用量
resourceAvail = [3];// 机器适配矩阵(1=可加工,0=不可)
machineEligibility = [
[1, 1], // 作业0适配所有机器
[1, 0], // 作业1仅适配机器1
[0, 1] // 作业2仅适配机器2
];// 优先级约束(作业1需先于作业2完成)
precedenceConstraints = {<1, 2>};// Cmax下界
LB = 5;
错误原因及修复方案
核心错误
- 未正确调用noOverlap约束:代码定义了机器作业序列
seqMachines,但未使用noOverlap约束确保同一机器上的作业区间不重叠,反而误用cumulative实现机器互斥,导致CPLEX无法识别所需的noOverlap逻辑; - 变量索引错误:
interval变量的size参数使用了固定范围processingTime[N][M],而非动态索引processingTime[i][j];资源累积约束中resourceNeed[Jobs][v]应为resourceNeed[i][v]。
修复步骤
- 替换机器互斥约束:将原约束(11)的
cumulative调用改为noOverlap(seqMachines[m]),这是CPLEX单机器调度中确保作业不重叠的标准用法:forall(m in Machines) noOverlap(seqMachines[m]); - 修正索引错误:
- 将
Xim的size改为processingTime[i][j]; - 将
Zi的size改为对应作业的处理时间(例如processingTime[i][k],其中k是作业i的可选机器,或单独定义作业总处理时间参数); - 将资源累积约束中的
resourceNeed[Jobs][v]改为resourceNeed[i][v];
- 将
- 清理无效代码:删除原代码开头的
fo和中间的孤立字符i。
修复后的完整约束(11)
// 约束(11):机器使用约束——同一时间一台机器仅处理一个作业 forall(m in Machines) noOverlap(seqMachines[m]);
内容的提问来源于stack exchange,提问作者berkay orkun
相关产品推荐
相关产品推荐

