生成新模型时更改数组维度 CPLEX OPL
Change array dimension when generating a new model CPLEX OPL
我想在 IBM CPLEX Optimization Studio 12.10 中实施优化 model。
我在 OPL 中编写了 model 代码,第一个实现正在运行。我现在想做的是多次迭代 model 以查看解析时间如何根据参数的维度而变化。
在.mod文件中我定义了三组:
- int numSet1=...;
- int numSet2=...;
- int numSet3=...;
- 范围 Set1 = 1..numSet1;
- 范围 Set2 = 1..numSet2;
- 范围 Set3 = 1..numSet3;
还有四个参数:
- float Par1[Set1]=...;
- float Par2[Set1][Set2]=...;
- 浮动 Par3[Set1]=...;
- float Par4[Set1][Set2][Set3]=...;
在.dat 文件中,我已经为这些集合和参数定义了初始值。
我现在想做的是在流程控制中定义一个代码,允许我更改集合的维度,从而更改参数的维度,并为每个分辨率保存分辨率时间:
main {
var mod = thisOplModel.modelDefinition;
var dat = thisOplModel.dataElements;
for (var sizenumSet1 = 2; sizenumSet1 <= 10; sizenumSet1 += 2) {
for (var sizenumSet2 = 1; sizenumSet2 <= 5; sizenumSet2 +=1) {
for (var sizenumSet3 = 1; sizenumSet3 <=5; sizenumSet3 +=1) {
var MyCplex = new IloCplex();
var opl = new IloOplModel(mod, MyCplex);
dat.changenumSet1=sizenumSet1;
dat.changenumSet2=sizenumSet2;
dat.changenumSet3=sizenumSet3;
opl.addDataSource(dat);
opl.generate();
if (MyCplex.solve()) {
writeln("Solution: ", MyCplex.getObjValue(),
" / sizeSet1: ", sizenumSet1,
" / sizeSet2: ", sizenumSet2,
" / sizeSet3: ", sizenumSet3,
" / time: ", MyCplex.getCplexTime());
}
opl.end();
MyCplex.end();
}
}
}
}
当我启动此代码时,我得到的是以下错误列表:
- main 执行失败。处理 OPL model 失败
- 数组 Par4(1)(1):3 的索引超出范围
- 脚本运行时错误:(在生成中)处理 OPL model 失败
我该如何解决这个问题?
感谢您的帮助。
在
dat.changenumSet1=sizenumSet1;
dat.changenumSet2=sizenumSet2;
dat.changenumSet3=sizenumSet3;
您更改了错误的元素。你应该改变
dat.numSet1=sizenumSet1;
dat.numSet2=sizenumSet2;
dat.numSet3=sizenumSet3;
此外,您似乎缺少对 Par
数组的更新。这些数组在每次迭代中变得更大,因此需要为它们提供更多数据。
我想在 IBM CPLEX Optimization Studio 12.10 中实施优化 model。 我在 OPL 中编写了 model 代码,第一个实现正在运行。我现在想做的是多次迭代 model 以查看解析时间如何根据参数的维度而变化。
在.mod文件中我定义了三组:
- int numSet1=...;
- int numSet2=...;
- int numSet3=...;
- 范围 Set1 = 1..numSet1;
- 范围 Set2 = 1..numSet2;
- 范围 Set3 = 1..numSet3;
还有四个参数:
- float Par1[Set1]=...;
- float Par2[Set1][Set2]=...;
- 浮动 Par3[Set1]=...;
- float Par4[Set1][Set2][Set3]=...;
在.dat 文件中,我已经为这些集合和参数定义了初始值。
我现在想做的是在流程控制中定义一个代码,允许我更改集合的维度,从而更改参数的维度,并为每个分辨率保存分辨率时间:
main {
var mod = thisOplModel.modelDefinition;
var dat = thisOplModel.dataElements;
for (var sizenumSet1 = 2; sizenumSet1 <= 10; sizenumSet1 += 2) {
for (var sizenumSet2 = 1; sizenumSet2 <= 5; sizenumSet2 +=1) {
for (var sizenumSet3 = 1; sizenumSet3 <=5; sizenumSet3 +=1) {
var MyCplex = new IloCplex();
var opl = new IloOplModel(mod, MyCplex);
dat.changenumSet1=sizenumSet1;
dat.changenumSet2=sizenumSet2;
dat.changenumSet3=sizenumSet3;
opl.addDataSource(dat);
opl.generate();
if (MyCplex.solve()) {
writeln("Solution: ", MyCplex.getObjValue(),
" / sizeSet1: ", sizenumSet1,
" / sizeSet2: ", sizenumSet2,
" / sizeSet3: ", sizenumSet3,
" / time: ", MyCplex.getCplexTime());
}
opl.end();
MyCplex.end();
}
}
}
}
当我启动此代码时,我得到的是以下错误列表:
- main 执行失败。处理 OPL model 失败
- 数组 Par4(1)(1):3 的索引超出范围
- 脚本运行时错误:(在生成中)处理 OPL model 失败
我该如何解决这个问题? 感谢您的帮助。
在
dat.changenumSet1=sizenumSet1;
dat.changenumSet2=sizenumSet2;
dat.changenumSet3=sizenumSet3;
您更改了错误的元素。你应该改变
dat.numSet1=sizenumSet1;
dat.numSet2=sizenumSet2;
dat.numSet3=sizenumSet3;
此外,您似乎缺少对 Par
数组的更新。这些数组在每次迭代中变得更大,因此需要为它们提供更多数据。