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

После просмотра stackoverflow + форума IBM + страницы Alex Fleischer How to Linkedin мне удалось запустить свою проблему со сценарием, изменяя параметр на каждой итерации (управление потоком). Однако я хочу сохранить результат каждой итерации в уникальный файл 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;
}

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


person gawdzilla    schedule 04.03.2020    source источник


Ответы (1)


Я задавал аналогичный вопрос на https://www.ibm.com/developerworks/community/forums/html/topic?id=755b8aa9-4f7c-42a9-9790-2f4ef160ae68

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

person Alex Fleischer    schedule 04.03.2020
comment
спасибо Алекс, я видел этот пост. как мне сделать это, чтобы не перезаписать решения в файле, определенном в файле .dat? потому что в файле .dat Sheetconnection относится к конкретному файлу Excel, чтобы получить все входные параметры. когда я делаю это один за другим, он будет записывать на лист в определенных местах. однако, когда я зацикливаюсь, я хочу, чтобы выходные данные хранились на отдельных листах ... заранее спасибо .. - person gawdzilla; 04.03.2020
comment
Вместо SheetConnection Sheet1 (file.xls); вы должны использовать SheetConnection Sheet1 (имя файла); с именем файла строка, которую вы установили из основного скрипта. В linkedin.com/pulse/how-opl-alex-fleischer вы можете использовать Изменить некоторые данные и снова решить с помощью регенерации - person Alex Fleischer; 04.03.2020
comment
Я просмотрел все ссылки ... если я правильно интерпретирую то, что вы сказали ... вы предлагаете сохранить модель как submodel.mod и выполнить управление потоком как main.mod ... а затем аналогично тому, как я меняю переменную на каждой итерации, я меняю имя файла для сохранения на каждой итерации ... я пытался, но у меня ничего не вышло. Я попытался установить имя файла в виде строки в submodel.mod, ошибка говорит, что имя файла не определено .. работа без экспорта в Excel заключается в том, чтобы записать все переменные / массив, который я хочу сохранить .. но я надеюсь, что смогу чтобы каждый раз сохранять в уникальном формате Excel .. - person gawdzilla; 05.03.2020
comment
См. ibm.com / developerworks / community / forum / html /, где вы можете увидеть, как изменить строку в SheetWrite, точно так же, как вы можете изменить строковый параметр в SheetConnection - person Alex Fleischer; 05.03.2020
comment
см. также stackoverflow .com / questions / 59074711 / - person Alex Fleischer; 05.03.2020
comment
как всегда, спасибо, Алекс, это заняло у меня немного времени ... Я отредактирую и опубликую свое решение, чтобы оно могло принести пользу другим без необходимости слишком много оглядываться. - person gawdzilla; 13.03.2020