Изменить размер массива при генерации новой модели CPLEX OPL - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть модель оптимизации, которую я хочу реализовать в IBM CPLEX Optimization Studio 12.10. Я написал код модели в OPL, и первая реализация работает. Теперь я хотел бы повторить модель несколько раз, чтобы увидеть, как изменяется время разрешения в зависимости от размерности параметров.

В файле .mod я определил три набора:

  • int numSet1 = ...;
  • int numSet2 = ...;
  • int numSet3 = ...;
  • диапазон Set1 = 1..numSet1;
  • диапазон Set2 = 1..numSet2;
  • диапазон Set3 = 1..numSet3 ;

И четыре параметра:

  • float Par1 [Set1] = ...;
  • float Par2 [Set1] [Set2] = .. .;
  • float Par3 [Set1] = ...;
  • float Par4 [Set1] [Set2] [Set3] = ...;

In В файле .dat я определил начальные значения для этих наборов и параметров.

То, что я хотел бы сделать сейчас, это определить в управлении потоком код, который позволяет мне изменять размеры наборов и, следовательно, параметров, и сохранять время разрешения для каждого разрешения :

main {
    var mod = thisOplModel.modelDefinition; 
    var dat = thisOplModel.dataElements; 
    for (var sizenumSet1 = 2; sizenumSet1 <= 10; sizenumSet1 += 2) {
    for (var sizenumSet2 = 1; sizenumSet2 <= 5; sizenumSet2 +=1) {
      for (var sizenumSet3 = 1; sizenumSet3 <=5; sizenumSet3 +=1) {
        var MyCplex = new IloCplex(); 
        var opl = new IloOplModel(mod, MyCplex); 
        dat.changenumSet1=sizenumSet1; 
        dat.changenumSet2=sizenumSet2; 
        dat.changenumSet3=sizenumSet3; 
        opl.addDataSource(dat); 
        opl.generate(); 
        if (MyCplex.solve()) {
         writeln("Solution: ", MyCplex.getObjValue(),
        " / sizeSet1: ", sizenumSet1,
        " / sizeSet2: ", sizenumSet2,
        " / sizeSet3: ", sizenumSet3,
        " / time: ", MyCplex.getCplexTime());
        }    
        opl.end(); 
        MyCplex.end(); 
        }
    }
    }         
}

Когда я запускаю этот код, я получаю следующий список ошибок:

  • Ошибка выполнения основного. Ошибка обработки модели OPL
  • Индекс выходит за пределы массива Par4 (1) (1): 3
  • Ошибка времени выполнения сценария: (при генерации) Ошибка обработки модели OPL

Как я могу решить это? Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 07 февраля 2020

В

dat.changenumSet1=sizenumSet1;
dat.changenumSet2=sizenumSet2;
dat.changenumSet3=sizenumSet3;

вы меняете неправильные элементы. Вы должны изменить

dat.numSet1=sizenumSet1;
dat.numSet2=sizenumSet2;
dat.numSet3=sizenumSet3;

Более того, похоже, вам не хватает обновлений для массивов Par. Эти массивы увеличиваются с каждой итерацией, поэтому необходимо предоставить больше данных для них.

...