OPL CPLEX访问元组索引数组报语法错误问题咨询
报错原因
OPL存在两套独立的语法环境,直接混用语法就会触发该报错:
- 建模层:定义tuple、集合、参数、决策变量、约束、目标函数的区域,支持
<"val1","val2">格式的tuple字面量写法 - 脚本执行层:即
execute{}包裹的代码块,采用基于JavaScript的IBM ILOG Script语法,不识别建模层的tuple字面量格式,直接在块内写<"Mon","Tue">会被判定为非法语法。
另外你提供的.dat文件中,数组最后一个元素末尾多了冗余逗号,部分低版本CPLEX会额外触发数据解析错误。
修正方法
有两种简单的修正方案,二选一即可:
方案1:建模层预定义要访问的tuple常量
在建模层提前定义需要访问的tuple对象,脚本块可以直接引用建模层定义的常量,修正后的.mod代码如下:
tuple TDayPair{ string day1; string day2; } {TDayPair} DAYS={<"Mon","Tue">,<"Thurs","Fri">}; int a[DAYS]= ...; // 建模层预定义目标tuple TDayPair monTuePair = <"Mon","Tue">; execute { writeln(a[monTuePair]); // 直接引用建模层常量,无语法问题 }
修正后的.dat代码(去掉冗余逗号):
a = #[ <"Mon","Tue">:1, <"Thurs","Fri">:2 ]#;
方案2:脚本块内从集合中查找目标tuple
如果不想额外定义常量,可以直接在脚本块内通过匹配条件从DAYS集合中取出目标tuple元素再访问,无需修改建模层的tuple定义部分,execute块修改为如下内容即可:
execute { // 从DAYS集合中匹配day1为Mon、day2为Tue的tuple元素 var target = first(DAYS, function(d){return d.day1 == "Mon" && d.day2 == "Tue";}); writeln(a[target]); }
两种方案运行后都会正常输出1,无语法报错。
内容的提问来源于stack exchange,提问作者william007
相关产品推荐
相关产品推荐

