具有步骤 OPL Cplex 的 For 循环

For loop with steps OPL Cplex

我需要在 OPL CPLEX.

中编写不同维度的矩阵

目前,我写了这个for循环:

{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());
}

目前,在脚本日志中,我获得了所有矩阵(从 1x2100x2)作为解决方案。

我只想计算(和打印)矩阵 1x210x220x2、...、90x2100x2 .

基本上我想每 10 行打印一个矩阵(所以总共 11 个矩阵而不是 100)。

我尝试将 row.size 与 10 相乘(或者当行值为 100 时将其除以 10)。

我该怎么做?


更新:

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);
}

现在,我在 main.mod.

中获得 row = {10, 20, 30}col = {10, 20, 30} 中的正确值

sub.mod行和列是集合。我需要将这些值用作矩阵维度。所以第一个矩阵是 10x10,第二个矩阵是 20x20 等等。

如何访问集合中的值以便创建这些矩阵?

抱歉提出了多个问题,但我对 CPLEX 真的很陌生。

你可以使用模

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

您可以稍微重写您的 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 函数将 return 相应集合中的最后一个元素。所以在第一次迭代中你得到 10,在第二个迭代中得到 20,在第三个迭代中得到 30。然后 rowcol 被构造为具有所需元素数量的范围。然后可以使用这些来初始化数组。

请注意,在 main.mod 中,您必须将 data2.row 替换为 data2.rowSet,将 data2.col 替换为 data2.colSet