Как экспортировать каждое возможное решение из IBM ILOG CPLEX? - PullRequest
0 голосов
/ 15 апреля 2020

В настоящее время я работаю над проблемой планирования с использованием IBM ILOG CPLEX с использованием его OPL. Я могу экспортировать только оптимальное решение с помощью команды sheetWrite, но я бы хотел экспортировать результаты каждого возможного решения, а не только оптимальное решение. Не могли бы вы посоветовать, как это сделать, зная, что я использую CP Solver и у меня нет предварительных знаний о количестве возможных решений.

Заранее спасибо, Мохамед

1 Ответ

0 голосов
/ 15 апреля 2020

то, что вы могли бы сделать, - это полагаться на главный блок управления потоком.

Вы можете добавить

main
{


thisOplModel.generate();
cp.startNewSearch();
while
(cp.next()) {  thisOplModel.postProcess(); }
}

в конце вашей модели, и тогда каждый раз при вызове будет вызываться постпроцесс новое решение

Поскольку мои решения кажутся недостаточно ясными, позвольте мне привести полный пример из примера watehouse:

.mod

using CP;

tuple sol
{
  int rank;
  float obj;
}

{sol} solutions;


int Fixed        = 100;
int NbWarehouses = 100;
int NbStores     = 200;



assert( NbStores > NbWarehouses );

range Warehouses = 1..NbWarehouses;
range Stores     = 1..NbStores;
int Capacity[w in Warehouses] = 
  NbStores div NbWarehouses + 
  w % ( NbStores div NbWarehouses );
int SupplyCost[s in Stores][w in Warehouses] = 
  1 + ( ( s + 10 * w ) % 100 );
dvar int Open[Warehouses] in 0..1;
dvar int Supply[Stores][Warehouses] in 0..1;
dexpr int TotalFixedCost = sum( w in Warehouses ) Fixed * Open[w];
dexpr float TotalSupplyCost = sum( w in Warehouses, s in Stores )  SupplyCost[s][w] * Supply[s][w];
minimize TotalFixedCost + TotalSupplyCost;

subject to {
  forall( s in Stores )
    ctStoreHasOneWarehouse: 
      sum( w in Warehouses ) 
        Supply[s][w] == 1;
  forall( w in Warehouses )
    ctOpen:
      sum( s in Stores ) 
        Supply[s][w] <= Open[w] * Capacity[w];
}

execute
{
  writeln("obj=",TotalFixedCost + TotalSupplyCost);

}

 main
{
var k=0;

thisOplModel.generate();

cp.startNewSearch();
while
(cp.next() && (k<=4)) 
{  
k++;
thisOplModel.postProcess();
thisOplModel.solutions.add(k,thisOplModel.TotalFixedCost + thisOplModel.TotalSupplyCost);
 }
} 

.dat

SheetConnection sheet("iter.xlsx");
solutions to SheetWrite(sheet,"A1:B4");

запишет 4 решения в файл iter.xls

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...