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

CPLEX OPL中writeln函数脚本解析错误求助

解决CPLEX OPL execute块中writeln的"missing ')'"错误

错误原因

OPL的模型定义部分(变量、目标函数、约束)和execute脚本块使用两套独立语法:

  • 模型里的sum(...)是数学表达式语法,用于定义优化目标和约束;
  • execute块属于脚本执行环境,不支持直接使用模型的sum(...)语法,解析器会将其误判为不完整的函数调用,从而抛出"missing ')'"错误。

你的代码中,第二、第三个writeln直接嵌入了模型的sum表达式,这是导致错误的核心原因。

解决方案

方案一:在execute块中用脚本循环计算总和

改用OPL脚本的循环语法累加计算,替代模型的sum表达式:

// Execute block for results
execute {
    writeln("Selected Towers: ");
    for (t in cellTowers)
        if (x[t] > 0.5)
            writeln("Tower ", t, " is selected.");

    // 计算总覆盖人口
    var totalPop = 0;
    for (t in cellTowers) {
        for (r in Regions) {
            totalPop += Population[r] * Coverage[t][r] * x[t];
        }
    }
    writeln("Total Population Covered: ", totalPop);

    // 计算总成本
    var totalCost = 0;
    for (t in cellTowers) {
        totalCost += Cost[t] * x[t];
    }
    writeln("Total Cost: ", totalCost);
}

方案二:在模型部分预定义总和变量

在模型中用dexpr定义两个派生变量,存储总覆盖人口和总成本的计算结果,execute块直接调用这些变量即可:

// 在模型部分(execute块之前)添加派生变量
dexpr float totalPopulationCovered = sum(t in cellTowers, r in Regions) Population[r] * Coverage[t][r] * x[t];
dexpr float totalCost = sum(t in cellTowers) Cost[t] * x[t];

// Execute block for results
execute {
    writeln("Selected Towers: ");
    for (t in cellTowers)
        if (x[t] > 0.5)
            writeln("Tower ", t, " is selected.");

    writeln("Total Population Covered: ", totalPopulationCovered);
    writeln("Total Cost: ", totalCost);
}

两种方案都能解决语法解析错误,方案二更简洁,还能复用模型中的计算逻辑。

内容的提问来源于stack exchange,提问作者lim kiat tsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:04:57