Сохранение результатов CPLEX с контролем потока (изменение данных решается с регенерацией) - PullRequest
0 голосов
/ 04 марта 2020

Просматривая stackoverflow + форум IBM + страницу Алекса Флейшера «Как подключиться», мне удается запустить свою проблему со сценарием, меняя параметр на каждой итерации (управление потоком). Однако я хочу сохранить вывод каждой итерации в уникальный файл Excel. Я прочитал ссылки и руководство / руководство пользователя, но я все еще не уверен, как этого достичь.

Перед использованием сценария я использовал SheetWrite в файле .dat для каждой переменной, которую я хочу сохранить.

Как я могу сделать это во время выполнения сценария, чтобы он сохранялся в новый файл 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 из каждой итерации.

РЕДАКТИРОВАТЬ это мое решение, чтобы получить новый файл Excel для каждого прогона с измененными данными (изменил имена файлов на будьте ближе к примерам Алекса): это 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;
}

надеюсь, это поможет.

1 Ответ

1 голос
/ 04 марта 2020

Я обратился к аналогичному вопросу на https://www.ibm.com/developerworks/community/forums/html/topic?id=755b8aa9-4f7c-42a9-9790-2f4ef160ae68

Вы должны использовать SheetWrite в части подмоделей dat и не забудьте вызвать opl.postProcess в основном скрипте

...