OPL CPLEX开发遇数组索引越界错误,寻求技术支持
OPL CPLEX数组索引越界问题解决
错误信息
数组"x(8)"索引越界:2
问题代码
{int}s={}; range M = 1..5; tuple link { key int N; int fromnode; int tonode; }; main{ var source = new IloOplModelSource("subset.mod"); var cplex = new IloCplex(); var def = new IloOplModelDefinition(source); var output = new Array(3); for (var i=1; i<=5; i++) { output[i] = new Array(3); for(var j=6; j<=12; j++) { output[i][j] = 0.0; } } for(var iter=6;iter<=12;iter++) { cplex.tilim=300; var opl = new IloOplModel(def,cplex); var data= new IloOplDataElements(); data.N=thisOplModel.s; data.N.add(iter); data.M=thisOplModel.M; data.Links=thisOplModel.Links; opl.addDataSource(data); opl.generate(); if (iter!=6){ for (var r in data.N){ for (var k in data.M){ if (output[k][r]==1){ opl.x[k][r].LB=output[k][r]; opl.x[k][r].UB=output[k][r]; writeln("xds[",k,"]","[",r,"]"," = ",output[k][r]); }}} } opl.postProcess(); for (var k in data.M){ for (var r in data.N){ output[k][r]=opl.x[k][r].solutionValue; } } data.end(); opl.end(); } }
错误原因分析
- 数组初始化长度不足:
output数组初始化时,外层new Array(3)仅创建长度为3的数组,却要访问索引1-5的元素;内层output[i] = new Array(3)同样长度不够,后续要给索引6-12赋值,必然触发索引越界。OPL中Array对象索引默认从0开始,new Array(n)生成的数组最大索引为n-1,无法容纳需求的6-12范围索引。 - 集合N动态扩展与数组不匹配:循环中
data.N每次添加iter(6到12),导致N集合元素逐步扩展为{6}, {6,7}, ..., {6,7,...,12},但output数组第二个维度长度不足,无法存储对应r(6-12)的变量值,访问output[k][r]时触发越界。
解决步骤
修正output数组初始化:根据需求的索引范围(
k∈1..5,r∈6..12),创建足够大的数组:// 外层数组覆盖k=1到5,长度设为6(索引0-5,使用1-5) var output = new Array(6); for (var i=1; i<=5; i++) { // 内层数组覆盖r=6到12,长度设为13(索引0-12,使用6-12) output[i] = new Array(13); for(var j=6; j<=12; j++) { output[i][j] = 0.0; } }检查subset.mod中x变量的定义:确保
x变量维度与M和N集合匹配,比如:dvar boolean x[M][N];若
N是动态扩展集合,OPL会自动适配变量维度,但需保证output数组索引范围能覆盖N的所有元素。循环中索引访问校验:在访问
output[k][r]前增加索引范围判断,避免意外越界:if (k >=1 && k <=5 && r >=6 && r <=12) { output[k][r] = opl.x[k][r].solutionValue; }
内容的提问来源于stack exchange,提问作者yalan
相关产品推荐
相关产品推荐

