在CPLEX中初始化三维数组报错,如何解决该语法错误?
CPLEX三维数组初始化错误修复方案
你在CPLEX中初始化三维数组时触发语法错误,报错信息为unexpected '[' expecting ']',错误代码如下:
int t=4; int b=3; int e=5; range time =1..t; range bus=1..b; range ev=1..e; float soci[ev][bus][time]=[[[0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]] [[0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]] [ [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]] [ [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]] [ [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]]];
错误原因
三维数组的嵌套结构中,相邻的二维数组块之间缺少逗号分隔。CPLEX的OPL语法要求同一层级的数组元素必须用逗号分隔,否则解析器无法识别数组边界,进而触发语法错误。
修正后的代码
在每一组对应ev维度的二维数组块之间添加逗号即可修复:
int t=4; int b=3; int e=5; range time =1..t; range bus=1..b; range ev=1..e; float soci[ev][bus][time]=[ [[0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]], [[0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]], [[0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]], [[0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]], [[0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7], [0.5,0.3,0.8,0.7]] ];
更简洁的初始化方式
由于你所有ev和bus维度对应的时间序列值完全相同,还可以用循环赋值简化代码,避免重复书写:
int t=4; int b=3; int e=5; range time =1..t; range bus=1..b; range ev=1..e; float soci[ev][bus][time]; // 循环赋值 execute { for(var e in ev) { for(var b in bus) { soci[e][b][1] = 0.5; soci[e][b][2] = 0.3; soci[e][b][3] = 0.8; soci[e][b][4] = 0.7; } } }
或者直接用数组推导式(OPL支持):
int t=4; int b=3; int e=5; range time =1..t; range bus=1..b; range ev=1..e; float soci[ev][bus][time] = [e in ev][b in bus][t in time: t==1?0.5 : t==2?0.3 : t==3?0.8 : 0.7];
内容的提问来源于stack exchange,提问作者haripriya
相关产品推荐
相关产品推荐

