Как установить ограничения по времени для подмоделей? - PullRequest
1 голос
/ 27 марта 2019

Я хочу ограничить все время выполнения 1800 с для данной конфигурации, которая состоит из основной проблемы, из-за которой вызываются подзадачи: 1 и 2. В дополнение к этому, можете ли вы сказать мне, как установить ограничение по времени для разных подмоделей? Например, если я хочу ограничить время выполнения подзадачи 1 до 500 с и подзадачи 2 до 800 с. Я использовал строку execute {cplex.tilim = 1800;}, как показано в описании кода, но программа работает более 1800 с.




 //-----------------Main-problem.mod-------------------------------
 //variables definition here

 execute {cplex.tilim= 1800;}
 Objective function;

 subject to {
     Constraints:1-7
       }

 execute FillDuals {
     Dual of constraint 1;
         }       
 }   

 main{
 thisOplModel.settings.mainEndEnabled = true;
 thisOplModel.generate();
 var masterDef = thisOplModel.modelDefinition;
 var masterCplex = cplex;
 var masterData = thisOplModel.dataElements;
 var masterOpl = new IloOplModel(masterDef,masterCplex);
 masterOpl.addDataSource(masterData);
 masterOpl.generate();
 masterCplex.solve();
 masterOpl.postProcess();

 //\**************Calling Sub-Problem 1*********************************
 var SubSource1 = new IloOplModelSource("Sub-Problem1.mod");
 var Sub1Def = new IloOplModelDefinition(SubSource1);
 var Sub1Def = thisOplModel.modelDefinition;
 var Sub1Cplex = cplex;
 var Sub1Data = thisOplModel.dataElements;
 var Sub1Opl = new IloOplModel(Sub1Def,Sub1Cplex);
 Sub1Opl.addDataSource(Sub1Data);
 Sub1Opl.generate();
 Sub1Cplex.solve();
 //\****************************************************************

 //\*******************Calling Sub-Problem2*********************************
 var SubSource2 = new IloOplModelSource("Sub-Problem2.mod");
 var Sub2Def = new IloOplModelDefinition(SubSource2);
 var Sub2Def = thisOplModel.modelDefinition;
 var Sub2Cplex = cplex;
 var Sub2Data = thisOplModel.dataElements;
 var Sub2Opl = new IloOplModel(Sub2Def,Sub2Cplex);
 Sub1Opl.addDataSource(Sub2Data);
 Sub2Opl.generate();
 Sub2Cplex.solve();
 //\****************************************************************

 } //end of main

 //--------------------Sub-Problem1.mod------------------------
 variables and constants definition;
 Objective function;
 subject to {
     Constraints:
       }
 //SubOpl1 doesnt have main function main{}

  //-------------------Sub-Problem2.mod----------------------
 variables and constants definitions;
 Objective function;
 subject to {
     Constraints:
       }
 //SubOpl2 doesnt have main function main{}
 //-------------------------------------------------------

1 Ответ

1 голос
/ 27 марта 2019

вы можете установить ограничение по времени, как вы делали в препроцессе, но вы также можете сделать это в основном блоке:

Вы можете изменить

Sub1Opl.generate();
Sub1Cplex.solve();

на

Sub1Opl.generate();
Sub1Cplex.tilim=60;
Sub1Cplex.solve();

если вам нужно, чтобы Sub1CPLEX остановился через 60 с

уважает

Примечание: этот лимит времени применяется к решению cplex, так что если вам нужно общее время 1800 с для многихрешает, вам нужно использовать меньшее время для каждого решения

...