我需要在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());
}目前,在脚本日志中,我获得了所有矩阵(从1x2到100x2)作为解决方案。
我只想计算(并打印)矩阵1x2、10x2、20x2、.、90x2和100x2。
本质上,我希望打印每个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);
}现在,我在row = {10, 20, 30}中获得了正确的值,在main.mod中获得了正确的值。
在sub.mod行和col中是集合。我需要用这些值作为矩阵的维度。第一个矩阵是10x10,第二个20x20,等等。
如何访问集合内的值以便创建这些矩阵?
不好意思问了这么多问题,但我对CPLEX真的很陌生。
发布于 2020-02-14 13:55:31
你可以用模
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发布于 2020-02-19 10:29:07
您可以稍微重写您的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.rowSet替换data2.row,用data2.colSet替换data2.col。
https://stackoverflow.com/questions/60224712
复制相似问题