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

OPL CPLEX迭代中仅固定值为1的变量问题求助

迭代求解仅固定值为1的变量:代码问题排查与修正

感谢Alex的解答,您的方案可正常运行,但会冻结所有变量。我希望在迭代求解时仅固定值为1的变量,为此编写了如下代码,但无法正常工作,恳请协助排查问题:

main {
   var source = new IloOplModelSource("subset.mod");
   var cplex = new IloCplex();
   var def = new IloOplModelDefinition(source);
   var output=0;
      for(var iter=1;iter<=5;iter++)
      {
      var opl = new IloOplModel(def,cplex);  
      var data2= new IloOplDataElements();
    data2.M=thisOplModel.s;
    data2.M.add(iter);
    data2.N=thisOplModel.N;
    data2.Links=thisOplModel.Links;   
      opl.addDataSource(data2);
      opl.generate();
      
 for (var k in data2.M){
   for (var r in data2.Links){
     if (opl.x[k][r.N]==1){ // This line is used to select variables equal to 1 
       opl.x[k][r.N].LB=output;
       opl.x[k][r.N].UB=output;
     }
   }
 }
      if (cplex.solve()) {
        writeln("ITERATION ", iter);
        writeln('
****OBJ************');
        writeln("OBJ = " + cplex.getObjValue());
      } else {
         writeln("No solution");
      }
      opl.postProcess();            
      output=opl.x[k][r.N].solutionValue;
      writeln("x[k][1]=",opl.x[k][r.N].solutionValue);
     data2.end();
     opl.end();
    }      
    }

问题点分析

  • 变量值判断时机错误:opl.generate()之后模型还未求解,变量没有实际解的值,直接判断opl.x[k][r.N]==1永远不成立,根本不会设置任何变量的上下界。
  • output变量逻辑混乱:初始值为0,用来设置上下界完全不符合“固定值为1的变量”的需求;而且迭代末尾赋值时,k和r是外层循环最后一次的变量,无法捕获所有需要固定的变量。
  • 无跨迭代约束保留:每次迭代新建opl模型,但没把上一次解中值为1的变量记录下来,导致每次迭代都是从头开始,没有累积固定规则。

修正后的代码

main {
   var source = new IloOplModelSource("subset.mod");
   var cplex = new IloCplex();
   var def = new IloOplModelDefinition(source);
   // 用集合保存需要固定为1的变量索引(k和N的组合)
   var fixedVars = new IloSet();

   for(var iter=1; iter<=5; iter++) {
      var opl = new IloOplModel(def, cplex);  
      var data2 = new IloOplDataElements();
      data2.M = thisOplModel.s;
      data2.M.add(iter);
      data2.N = thisOplModel.N;
      data2.Links = thisOplModel.Links;   
      opl.addDataSource(data2);
      opl.generate();

      // 应用之前迭代中需要固定的变量约束
      for (var idx in fixedVars) {
         var [k, n] = idx;
         opl.x[k][n].LB = 1;
         opl.x[k][n].UB = 1;
      }

      if (cplex.solve()) {
         writeln("ITERATION ", iter);
         writeln("\n****OBJ************");
         writeln("OBJ = " + cplex.getObjValue());

         // 记录本次解中值为1的变量,加入固定集合
         for (var k in data2.M) {
            for (var r in data2.Links) {
               if (opl.x[k][r.N].solutionValue == 1) {
                  fixedVars.add([k, r.N]);
               }
            }
         }
      } else {
         writeln("No solution");
         break; // 无解时终止迭代
      }

      opl.postProcess();            
      data2.end();
      opl.end();
   }      
}

修正说明

  • 新增fixedVars集合:跨迭代保存需要固定为1的变量索引,确保每次迭代都能继承之前的约束。
  • 调整约束设置时机:模型生成后先加载历史固定约束,求解完成后再从当前解中筛选新的固定变量。
  • 正确获取变量解:用solutionValue属性获取求解后的变量实际值,替代原代码中错误的变量对象比较。
  • 移除冗余的output变量:直接用1作为固定值,贴合需求逻辑。

内容的提问来源于stack exchange,提问作者yalan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:31:32