Cplex передает переменную решения в другую модель, используя скрипт ILOG - PullRequest
0 голосов
/ 28 января 2020

У меня есть две отдельные модели Cplex, где вторая модель зависит от решения первой.

Я хочу решить модели, используя ILOG Script в Optimization Studio.

До сих пор я находился в следующем для моего основного файла, который контролирует выполнение обеих моделей.

// Stage 1
    var source = new IloOplModelSource("TwoStage_Stage1.mod");
    var cplex = new IloCplex();
    var def = new IloOplModelDefinition(source);
    var modelInstance = new IloOplModel(def, cplex);
    var data = new IloOplDataSource("TwoStage.dat");
    modelInstance.addDataSource(data);
    modelInstance.generate();
    cplex.solve();

    modelInstance.postProcess();

// Stage 2
    var source2 = new IloOplModelSource("TwoStage_Stage2.mod");
    var cplex2 = new IloCplex();
    var def2 = new IloOplModelDefinition(source2);
    var modelInstance2 = new IloOplModel(def2, cplex2);
    var x_fromStage1 = new IloOplDataElements(); 
    var y_fromStage1 = new IloOplDataElements(); 

    x_fromStage1.xbest = modelInstance.xbest;
    y_fromStage1.ybest = modelInstance.ybest;

    modelInstance2.addDataSource(x_fromStage1);
    modelInstance2.addDataSource(y_fromStage1);
    var data2 = new IloOplDataSource("TwoStage.dat");
    modelInstance2.addDataSource(data2);

    modelInstance2.generate();
    cplex2.solve();

На этапе 2 я пытался прочитать в решении переменных решения xbest и ybest от первой модели экземпляра. xbest и ybest не являются фактическими переменными решения из первой модели, а являются копией, которую я сделал в постобработке в первой модели, как предлагалось в нескольких других потоках. xbest - это двумерный массив, а ybest - трехмерный. Я объявил обе эти переменные в .mod-файле для второй модели как

int xbest[set1][set2];
int ybest[set3][set4][set5];

Я получаю следующие сообщения об ошибках:

  • элемент xbest не определен
  • недопустимое выражение инициализации для xbest

Я на правильном пути для передачи переменных из одной модели в другую или она работает совершенно иначе?

Большое спасибо ,

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Спасибо. Я смог сам разобраться в этом решении за несколько минут go. Решение, которое я нашел, работает следующим образом.

// Извлечение значений решения переменных решения из первой модели

Stage1_opl.x.solutionValue;
Stage1_opl.y.solutionValue;

// Добавление значений решения к элементам данных во второй модели

var Stage2_data = new IloOplDataElements();
Stage2_data.xbest = Stage1_opl.x.solutionValue;
Stage2_data.ybest = Stage1_opl.y.solutionValue;
Stage2_opl.addDataSource(Stage2_data);

И, как указал Алекс

, если вы записываете результат в .dat, вы должны заменить

int xbest[set1][set2];
 int ybest[set3][set4][set5];

на

int xbest[set1][set2]=...;
int ybest[set3][set4][set5]=...;

для чтения .dat во второй модели

необходимо изменить в файле .mod второй модели.

0 голосов
/ 29 января 2020

если вы записываете результат в .dat, тогда вы должны заменить

int xbest[set1][set2];
int ybest[set3][set4][set5];

на

int xbest[set1][set2]=...;
int ybest[set3][set4][set5]=...;

, чтобы прочитать .dat во второй модели

...