Опитвам се да напиша код за разлагане на Benders на C++, за да реша проблем с местоположението на съоръжението. Това е двуетапен пример за стохастично програмиране и параметрите на търсенето зависят от сценариите. Написах подобен код в 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
)
По-долу е частта за генериране на подпроблеми от моя код (броят на моделите); обаче разбрах, че това е грешно, защото добавя само ограничения към един голям проблем вместо 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);
Всяка помощ се оценява, благодаря много.
Забележка: Тази връзка има код, който работи с само един подпроблем (единичен сценарий). Това е основно това, което се опитвам да възпроизведа (или да базирам кода си), ако някой се интересува. Ако имате и връзка или файл с код на Benders с множество сценарии, това също би било невероятно щедро.
Благодаря отново.