Построение нескольких моделей (итеративно) в 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