具有步骤 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());
}
目前,在脚本日志中,我获得了所有矩阵(从 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);
}
现在,我在 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。然后 row
和 col
被构造为具有所需元素数量的范围。然后可以使用这些来初始化数组。
请注意,在 main.mod
中,您必须将 data2.row
替换为 data2.rowSet
,将 data2.col
替换为 data2.colSet
。
我需要在 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);
}
现在,我在 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。然后 row
和 col
被构造为具有所需元素数量的范围。然后可以使用这些来初始化数组。
请注意,在 main.mod
中,您必须将 data2.row
替换为 data2.rowSet
,将 data2.col
替换为 data2.colSet
。