通过流量控制保存CPLEX的结果(通过重新生成解决更改数据)



在浏览了stackoverflow+IBM论坛+Alex Fleischer的How to Linkedin页面后,我设法用脚本运行了我的问题,在每次迭代时都更改了一个参数(流控制(。但是,我想将每次迭代的输出保存到一个唯一的excel文件中。我通读了参考资料和手册/用户指南,但我仍然不确定如何实现它。

在使用该脚本之前,我在.dat文件中为要保存的每个变量使用了SheetWrite。

如何在运行脚本时做到这一点,以便每次迭代都将其保存到新的excel文件中?(我的迭代次数有限,大约有7次运行,所以每次运行只需要7个文件(

提前谢谢。。

main{
var status = 0;
thisOplModel.generate();
var produce = thisOplModel;
var best;
var curr = Infinity;
var maxdisp = produce.allowedwindisp;
var ofile = new IloOplOutputFile("testresult.txt");
while ( maxdisp>=1 ) {
best = curr;
writeln();
writeln("Solve with maxdisp = ",maxdisp);
if ( cplex.solve() ) {
curr = cplex.getObjValue();
writeln("OBJECTIVE: ",curr);
ofile.writeln("Objective with maxdisp = ", maxdisp, " is ", curr);        
} 
else {
writeln("No solution!");
break;
}
// prepare next iteration
var def = produce.modelDefinition;
var data = produce.dataElements;
if ( produce!=thisOplModel ) {
produce.end();
}
produce = new IloOplModel(def,cplex);
maxdisp--;
data.allowedwindisp = maxdisp;
produce.addDataSource(data);
produce.generate();
}    
ofile.close();
status;}

这就是我在每次迭代中更改变量的方法,但我不确定如何从每次迭代中链接并编写新的excel文件。

EDIT这是我的解决方案,可以在每次更改数据的情况下实现一个新的excel文件(修改文件名,使其更符合Alex的示例(:这是main.mod,我将更改代码中名为delta的变量

main{
var status
var source = new IloOplModelSource("sub.mod");
var cplex = new IloCplex();
var def = new IloOplModelDefinition(source);
var best;
var current = Infinity; 

for(var delta = 0;delta<=3;delta++)
{
var opl = new IloOplModel(def,cplex);
var data2= new IloOplDataElements();
data2.fileName="reference_filename"+delta+".xlsx";
opl.addDataSource(data2);
var data1 = new IloOplDataSource("datafile4Input_param.dat");
opl.addDataSource(data1);
var data3 = new IloOplDataElements();
data3.delta_from_reference_input = delta;
opl.addDataSource(data3)
opl.generate();
best = current;
writeln();
writeln("Solve with maxdisp = ",maxdisp);
cplex.tilim = 3600;
if (cplex.solve()) {
current = cplex.getObjValue();
writeln("OBJECTIVE: ",current);
opl.postProcess();
} 
else {
writeln("No solution");
}
opl.end();
}  
status;
}

希望能有所帮助。

您应该在子模型dat部分中使用SheetWrite,不要忘记在主脚本中调用opl.postProcess

最新更新