首页 > 解决方案 > 如何从 IBM ILOG CPLEX 导出每个可行的解决方案?

问题描述

目前,我正在使用 IBM ILOG CPLEX 使用其 OPL 解决调度问题。我只能使用 sheetWrite 命令导出最优解,但我想导出每个可行解的结果,而不仅仅是最优解。知道我正在使用 CP 求解器并且我对可行解决方案的数量没有任何先验知识,您能否就如何做到这一点提出建议。

在此先感谢穆罕默德

标签: cplexoplcp-optimizer

解决方案


您可以做的是依靠流量控制主块。

你可以添加

main
{


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

在模型结束时,每次获得新解决方案时都会调用 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


推荐阅读