主块中的 CPLEX OPL IP 间隙和模型中的执行

CPLEX OPL IP-gap in main block and execute in the model

在我的模型中,我想设置一个 IP 间隙。我在一个主块中做了这个:

main {

    thisOplModel.generate();


    cplex.epgap = 0.005; 

    if (cplex.solve()) {

        var obj = cplex.getObjValue();
        writeln("Objective function value: " + obj);
    }

}

在模型本身中,我有几个用于控制台输出和 excel 写入的执行块。 例如:

execute{
  writeln("MECHANICAL HARVESTING");
 for(var j in J){

   write("j= "+j + " ");

   for(var t in T){
     var x_out = 0;

     for(var k in K){
       for(var b in B){
         if(k == 1){x_out = x_out + x[j][t][k][b];}
       }
     }


     write(x_out + " ");
   }
   writeln("");


 }
 writeln(""); 
}               

当我 运行 模型时,我得到了一个解决方案,但是没有执行执行块。

谁能帮我解决这个问题?

你需要调用postProcess。

例如在你的代码中你应该改变

main {

    thisOplModel.generate();


    cplex.epgap = 0.005; 

    if (cplex.solve()) {

        var obj = cplex.getObjValue();
        writeln("Objective function value: " + obj);
    }

}

进入

main {

    thisOplModel.generate();


    cplex.epgap = 0.005; 

    if (cplex.solve()) {

        var obj = cplex.getObjValue();
        writeln("Objective function value: " + obj);
        thisOplModel.postProcess(); // call postProcess
    }

}