Я пытаюсь написать код разложения 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 с несколькими сценариями, это также было бы удивительно щедро.
Еще раз спасибо.
Вы можете иметь один IloModel
по сценарию или есть один IloModel
для вашей подзадачи, но изменяйте ее каждый раз, когда вам нужно решить проблему для конкретного сценария.
Других решений пока нет …