OPL代码报Unknown OPL Problem Marker语法错误的修复咨询
CPLEX OPL供应商选择代码语法错误修复
问题描述
运行供应商选择场景的CPLEX OPL代码时,触发「Unknown OPL Problem Marker」语法错误,具体提示为:
语法错误,意外的'(', 期望(identifier)或'['
错误定位在final.mod文件第27行。
错误原因分析
OPL语法规则明确要求:全局作用域不允许直接编写循环执行代码,循环、赋值这类执行逻辑必须包裹在execute代码块内。原代码第27行开始的三重for循环直接暴露在全局,违反了OPL语法规范;同时循环内的赋值语句缺少分号,也会触发语法报错。
修复步骤
- 将全局的三重for循环包裹到
execute块中 - 为循环内的每一条赋值语句添加分号
修复后完整代码
using CP; int numI = 4; int numP = 3; int B = 90000000; // 定义集合 range I = 1..numI; // 供应商集合 range P = 1..numP; // 产品集合 // 定义参数 float v[I][P]; // 每个供应商生产单位产品的成本 float f[I][P]; // 从供应商i采购的固定成本 float u1[I][I]; float u2[I][I]; float u3[I][I]; int C[I][P]; // 供应商i的产能(可满足总需求的比例) float MOQ[I][P]; // 供应商i的最小订货量(占总需求的百分比) int D[1][P]; // 全年各产品的需求量 int Nmax[P] = [2,2,2]; int Nstr[P]=[1,1,1]; int strat[I][P]; float u[I][I][P]; // 修复:将循环逻辑放入execute块,补充分号 execute { for (int i in I) for (int j in I) for (int p in P) if (p == 1) u[i][j][p] = u1[i][j]; else if (p == 2) u[i][j][p] = u2[i][j]; else u[i][j][p] = u3[i][j]; } // 定义决策变量 dvar boolean y[I][P]; // 表示供应商i是否生产产品p的二元变量 dvar float+ x[I][P]; // 从供应商i采购的需求占比 // 目标表达式 dexpr float Z = sum(i in I, p in P) (D[1][p]*v[i][p]*x[i][p]) + sum(i in I, p in P) (f[i][p]*y[i][p]); dexpr float K = sum(i in I, j in I, p in P) u[i][j][p]*x[i][p]*x[j][p]; minimize staticLex(Z, K); // 约束条件 subject to { forall(p in P) { sum(i in I) x[i][p] == 1; sum(i in I) (D[1][p]*v[i][p]*x[i][p] + f[i][p]*y[i][p]) <= B; 2 <= sum(i in I) y[i][p]; sum(i in I) y[i][p] <= Nmax[p]; Nstr[p] <= sum(i in I) y[i][p]*strat[i][p]; } forall(i in I, p in P) { x[i][p] <= C[i][p]*y[i][p]; MOQ[i][p]*y[i][p] <= x[i][p]; 0<= x[i][p] <= 1; 0<= y[i][p] <= 1; 0<= C[i][p] <= 1; 0<= MOQ[i][p] <= 1; 0<= strat[i][p] <= 1; } }
额外注意事项
- 代码中所有参数(如
v[I][P]、f[I][P]等)需要在.dat文件中提供具体数值,否则模型无法求解 staticLex用于多目标优化,确保先最小化Z再最小化K,符合数学模型要求
内容的提问来源于stack exchange,提问作者Trí Vũ
相关产品推荐
相关产品推荐

