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
相关产品推荐
相关产品推荐

