Можно ли изменить переменную диапазона? - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно решить модель, в которой у меня есть массив размером 1..118, но я хочу решить его только для некоторых значений (например, 1..9,11..60,62..115 и 117..118). Числа, которые я исключил, - это те, для которых я не хочу решать проблему, потому что они будут возвращать решение без значения и, следовательно, не представляют для меня интереса.

Я не могу изменить исходный массив, так как я буду использовать его для решения упрощенной версии проблемы с позициями, не занятыми ранее.

Есть ли возможный способ сделать это?

1 Ответ

2 голосов
/ 28 мая 2019

позвольте мне привести пример того, как установить диапазон с помощью управления потоком в OPL:

У вас есть первая модель sub.mod

int minOfx = ...;
int maxOfx = ...;
range r=minOfx..maxOfx;
dvar float x1 in r;
dvar float x2 in r;

maximize x2-x1;
subject to {

}

execute
{
writeln("x2-x1= ",x2-x1);
}

, а затем у вас есть основноймодель

main {
  var source = new IloOplModelSource("sub.mod");
  var cplex = new IloCplex();
  var def = new IloOplModelDefinition(source);



  for(var k=1;k<=10;k++)
  {
  var opl = new IloOplModel(def,cplex);

  var data2= new IloOplDataElements();
  data2.minOfx=(k-1)*(k-1);
  data2.maxOfx=k*k;
  opl.addDataSource(data2);
  opl.generate();

  if (cplex.solve()) {  
     opl.postProcess();

  } else {
     writeln("No solution");
  }
 opl.end();
}  

}

Когда вы запустите основную модель, вы получите

x2-x1= 1
x2-x1= 3
x2-x1= 5
x2-x1= 7
x2-x1= 9
x2-x1= 11
x2-x1= 13
x2-x1= 15
x2-x1= 17
x2-x1= 19

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

...