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

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];
        }
    }
}

关键修复点说明

  1. forall语法修正:所有循环约束都被包裹在forall(...) {...}的大括号内,确保索引t/k能正确作用于约束中的变量。
  2. 约束逻辑补全:补充了库存平衡约束(原代码仅定义库存变量但未关联生产与需求,这是LP模型的必要逻辑)。
  3. 冗余约束删除:移除了所有X[k][t] >= 0类非负约束,因为dvar float+已自动保证变量非负。
  4. 符号修正:将错误的=>替换为正确的不等式符号,同时调整了sum函数的括号位置,确保语法合规。

内容的提问来源于stack exchange,提问作者Shaho Mps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:35:17