cplex - 如何从 IBM ILOG CPLEX 导出每个可行的解决方案?
问题描述
目前,我正在使用 IBM ILOG CPLEX 使用其 OPL 解决调度问题。我只能使用 sheetWrite 命令导出最优解,但我想导出每个可行解的结果,而不仅仅是最优解。知道我正在使用 CP 求解器并且我对可行解决方案的数量没有任何先验知识,您能否就如何做到这一点提出建议。
在此先感谢穆罕默德
解决方案
您可以做的是依靠流量控制主块。
你可以添加
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
推荐阅读
- ios - 如何从 JSON iOS swift 中解决字符周围的未终止字符串或字符周围的无效字符串?
- c# - 如何根据字符串值使用 UWP Frame.Navigate()
- c - 在一个套接字上接收来自多个组的多播流量时出现问题
- javascript - 注册或未注册 HTML 自定义 URL 方案检测
- java - Android后台HTTP请求不起作用?
- java - TCP Java Socket 自定义超时不适用于 docker
- javascript - 当字段为字段不工作时,Sweetalert 弹出消息
- swift - 调用中的额外参数“where”
- android - 在颤振中热重载后更新更改?
- mysql - 在 datetimefield 中记录两种不同的日期格式 - 我们想要一种格式