Для l oop с шагами OPL Cplex - PullRequest
       30

Для l oop с шагами OPL Cplex

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

Мне нужно написать матрицы разных размеров в OPL Cplex. В настоящее время я написал это для l oop:

{int} row=...;
{int} col=...;
int y[row][col];

execute
{
 for (var i=1; i<=row.size; i+=10){
   for (var j in col){
     y[i][j]=i;
   }
 }
 writeln("y= ",y, 
 "/ row = ", row.size,
 "/ col = ", col.size,
 "/ time = ", cplex.getCplexTime());
}

В настоящее время в журнале сценариев я получаю в качестве решения все матрицы (от 1x2 до 100x2). Я хотел бы вычислить (и распечатать) только матрицы 1x2, 10x2, 20x2, ..., 90x2 и 100x2. По сути, я хотел бы печатать матрицу каждые 10 строк (итого 11 матриц, а не 100). Я попытался умножить row.size на 10 (или разделить его на 10, когда значение строки равно 100). Как я могу это сделать?

ОБНОВЛЕНИЕ:

main.mod

{int} set1={};
{int} set2={};
int ar[1..100][1..100];

main { 
  var source = new IloOplModelSource("sub.mod");  
  var cplex = new IloCplex();
  var def = new IloOplModelDefinition(source);
  for(var i=1;i<=30;i++) if (i % 10 == 0) { 
    for (var j=1; j<=30; j++) if (j % 10 == 0) {
        var opl = new IloOplModel(def,cplex);  
        var data2= new IloOplDataElements(); 
        data2.row=thisOplModel.set1; 
        data2.row.add(i); 
        data2.col=thisOplModel.set2; 
        data2.col.add(j);
    } 
  opl.addDataSource(data2); 
  opl.generate(); 
}
if (cplex.solve()) {  
writeln("Solution = " + cplex.getObjValue(),
"/ time = ", cplex.getCplexTime());
} else {
    writeln("No solution");
}
data2.end(); 
opl.end();
}

sub.mod

{int} row=...;
{int} col=...;
int y[row][col];


execute {

 for (var i in row) {
     for (var j in col) { 
        y[i][j]=i; 
    } 
 } 
    writeln("y= ",y, 
//    " / i= ", i,
//  "/ row = ", row,
    "/ col = ", col,
    "/ time = ", cplex.getCplexTime());
}

dvar float x;

maximize x;
subject to {
   x<=sum(i in row, j in col) y[i][j];
}

execute
{
writeln("x=",x);
}

Теперь я получаю правильные значения в row = {10, 20, 30} и col = {10, 20, 30} в main.mod. В строке sub.mod и col - наборы. Мне нужно использовать эти значения в качестве размеров матрицы. Итак, первая матрица 10х10, вторая 20х20 и т. c. Как я могу получить доступ к значениям внутри набора, чтобы я мог создать эти матрицы? Извините за многочисленные вопросы, но я действительно новичок в CPLEX.

Ответы [ 2 ]

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

Вы можете слегка переписать ваш sub.mod, чтобы начать:

{int} rowSet = ...;
{int} colSet = ...;

range row = 1..last(rowSet);
range col = 1..last(colSet);

int y[row][col];

execute {
  for (var i in row) {
    for (var j in col) {
      y[i][j] = i;
    }
  }
  writeln(y);
}

Функция last вернет последний элемент из соответствующего набора. Таким образом, в первой итерации вы получите 10, во второй 20 и в третьей 30. Затем row и col строятся как диапазон с желаемым количеством элементов. Затем их можно использовать для инициализации массива.

Обратите внимание, что в main.mod вы должны заменить data2.row на data2.rowSet и data2.col на data2.colSet.

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

вы можете использовать по модулю

range r=1..100;

execute
{
  for(var i in r) if (i % 10==0) writeln(i);
}

дает

10
20
30
40
50
60
70
80
90
100
...