首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有步骤OPL Cplex的循环

具有步骤OPL Cplex的循环
EN

Stack Overflow用户
提问于 2020-02-14 10:41:38
回答 2查看 1.1K关注 0票数 0

我需要在OPL CPLEX中编写不同维度的矩阵。

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

代码语言:javascript
复制
{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

代码语言:javascript
复制
{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

代码语言:javascript
复制
{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}中获得了正确的值,在main.mod中获得了正确的值。

sub.mod行和col中是集合。我需要用这些值作为矩阵的维度。第一个矩阵是10x10,第二个20x20,等等。

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

不好意思问了这么多问题,但我对CPLEX真的很陌生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-14 13:55:31

你可以用模

代码语言:javascript
复制
range r=1..100;

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

给出

代码语言:javascript
复制
10
20
30
40
50
60
70
80
90
100
票数 0
EN

Stack Overflow用户

发布于 2020-02-19 10:29:07

您可以稍微重写您的sub.mod以实现以下目的:

代码语言:javascript
复制
{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。然后用所需的元素数将rowcol构造为范围。然后可以使用这些来初始化数组。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60224712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档