Изграждане на множество модели (итеративно) в C++ (разлагане на Benders с множество сценарии)

Опитвам се да напиша код за разлагане на 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 с множество сценарии, това също би било невероятно щедро.

Благодаря отново.


person herol    schedule 01.11.2016    source източник


Отговори (1)


Можете или да имате един IloModel за сценарий, или да имате единичен IloModel за вашия подпроблем, но да го променяте всеки път, когато трябва да разрешите проблем за определен сценарий.

person vitaut    schedule 02.11.2016
comment
Конструирането на един подпроблем и актуализирането му всеки път за всеки сценарий не е нещото, което търся. Всъщност трябва да конструирам един IloModel за сценарий и питам как да направя това. - person herol; 02.11.2016