OPL CPLEX线性规划模型报错:索引k、t不存在求助
OPL CPLEX LP模型索引报错排查与修复
错误原因总结
forall循环语法错误:OPL要求forall必须用大括号{}包裹循环体(约束),原代码中forall后未加括号,导致循环索引t/k无法作用于后续约束。- 约束结构错误:部分约束的括号位置错误(如技术容量约束的
sum与不等式的位置),且人员容量约束缺少t的循环,导致索引未定义。 - 冗余约束:
dvar float+已默认变量非负,无需额外添加X[k][t] >= 0类约束,反而引发索引识别问题。 - 符号错误:将大于等于符号
>=误写为=>。
修正后的完整代码
// Indices int K = ...; // Produktgruppe int T = ...; // Periode // Parameter float a[1..K] = ...; // Produktionskoeffizient für Produktgruppe k für die personelle Kapazität float b[1..K] = ...; // Produktionskoeffizient für Produktgruppe k für die technische Kapazität float d[1..K][1..T] = ...; // Nachfrage nach Produktgruppe p zum Zeitpunkt t float l[1..K] = ...; // Lagerkostensatz für Produktgruppe k float u[1..T] = ...; // Überstundenkostensatz in Periode t int Cmax[1..T] = ...; // Maximale technische Kapazität in Periode t int Nmax[1..T] = ...; // Maximale personelle Kapazität in Periode t int Umax[1..T] = ...; // Maximale Übersunden in Periode t // Entscheidungsvariable dvar float+ X[1..K][1..T]; // Produktionsmenge von Produktgruppe k in Periode t dvar float+ L[1..K][1..T]; // Lagermenge von Produktgruppe k in Periode t dvar float+ U[1..T]; // Genutze Überstunden in Periode t // Zielfunktion minimize sum(t in 1..T, k in 1..K) (l[k]*L[k][t]) + sum(t in 1..T) (u[t]*U[t]); // Nebenbedingungen subject to { // ctTechnische Kapazitaetsrestriktion: 技术容量约束,每个周期t都要满足 forall(t in 1..T) { sum(k in 1..K) (b[k]*X[k][t]) <= Cmax[t]; } // ctPersonelle Kapazitaetsrestriktion: 人员容量约束,每个周期t和产品组k都要满足 forall(t in 1..T, k in 1..K) { a[k]*X[k][t] - U[t] <= Nmax[t]; } // ctmaximale Ueberstundenrestriktion: 最大加班约束 forall(t in 1..T) { U[t] <= Umax[t]; } // ctLagermengenbilanz: 库存平衡约束(原代码遗漏,补充完整逻辑) forall(k in 1..K) { // 第一个周期的库存平衡 L[k][1] = X[k][1] - d[k][1]; // 后续周期的库存平衡 forall(t in 2..T) { L[k][t] = L[k][t-1] + X[k][t] - d[k][t]; } } }
关键修复点说明
forall语法修正:所有循环约束都被包裹在forall(...) {...}的大括号内,确保索引t/k能正确作用于约束中的变量。- 约束逻辑补全:补充了库存平衡约束(原代码仅定义库存变量但未关联生产与需求,这是LP模型的必要逻辑)。
- 冗余约束删除:移除了所有
X[k][t] >= 0类非负约束,因为dvar float+已自动保证变量非负。 - 符号修正:将错误的
=>替换为正确的不等式符号,同时调整了sum函数的括号位置,确保语法合规。
内容的提问来源于stack exchange,提问作者Shaho Mps
相关产品推荐
相关产品推荐

