我正在尝试用C ++编写Benders分解代码来解决设施位置问题。它是一个两阶段随机编程示例,需求参数取决于场景。我之前在AMPL中编写了类似的代码,它的运行文件开始如下:
option solver cplexamp;
option omit_zero_rows 1;
option display_eps .000001;
option solver_msg 0;
option show_boundto1 0;
problem Master: r, y, theta,
Master_Cost, Cut_Defn, Open_Facilities_Facility_Capacity, Number_of_Facilities_Per_Node;
problem Sub{s in 1..NSec}:
{k in 1..K, (i,j) in LINKS} x[k,s,i,j],
{k in 1..K, i in 1..nnodes} z[k,s,i],
{k in 1..K, i in 1..nnodes} w[k,s,i],
BSP_Cost[s],
{i in 1..nnodes, k in 1..K} Flow_Conservation[i,k,s],
{(i,j) in LINKS} Arc_Capacity[i,j,s];
let nCUT := 0;
let {s in 1..NSec} theta[s] := 0;
let {k in 1..K, i in 1..nnodes} R[k,i] := 0;
param GAP default Infinity;
param newGAP;
但是,在C ++中,我不知道如何构建关于场景的子问题(构建模型)。 (我应该为s
)索引的每个场景构建一个模型
以下是我的代码的子问题生成部分(模型数量);但是,我意识到这是错误的,因为它只是为一个大问题而不是子问题添加约束。
IloModel model_sub(env);
IloObjective Objective_sub(env);
model_sub.add(Objective_sub);
for (int s=0; s<S; s++){
for (int i=0; i<I; i++){
for (int j=0; j<J; j++){
model_sub.add(MU[i][s] + Beta[j][s] <= c[j][i]);
}
}
}
IloCplex cplex_sub(model_sub);
感谢任何帮助,非常感谢。
注意:This link的代码只能使用一个子问题(单个方案)。这基本上是我试图复制(或基于我的代码),如果有人感兴趣。如果你还有一个多场景Benders代码的链接或文件,那也是非常慷慨的。
再次感谢。
答案 0 :(得分:0)
您可以为每个方案设置一个IloModel
,或者为您的子问题设置一个IloModel
,但每次需要解决特定方案的问题时都要对其进行修改。