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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:05:26