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

OPL代码报Unknown OPL Problem Marker语法错误的修复咨询

CPLEX OPL供应商选择代码语法错误修复

问题描述

运行供应商选择场景的CPLEX OPL代码时,触发「Unknown OPL Problem Marker」语法错误,具体提示为:

语法错误,意外的'(', 期望(identifier)或'['

错误定位在final.mod文件第27行。

错误原因分析

OPL语法规则明确要求:全局作用域不允许直接编写循环执行代码,循环、赋值这类执行逻辑必须包裹在execute代码块内。原代码第27行开始的三重for循环直接暴露在全局,违反了OPL语法规范;同时循环内的赋值语句缺少分号,也会触发语法报错。

修复步骤

  1. 将全局的三重for循环包裹到execute块中
  2. 为循环内的每一条赋值语句添加分号

修复后完整代码

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ũ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:37