Я пытаюсь создать модель в CPLEX 12.10, используя OPL.
То, что я делал до сих пор, - это создание модели и написание части управления потоком / основной части для генерации новых моделей. У меня проблема с обновлением значений в новом массиве (размерность массивов увеличивается с каждой итерацией). У меня есть следующие параметры, размер которых зависит от значения 3 комплектов:
- float Par1 [Set1] = ...;
- float Par2 [Set1] [Set2] =. ..;
- float Par3 [Set1] = ...;
- float Par4 [Set1] [Set2] [Set3] = ...;
У меня есть следующий код в части управления потоком:
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.numSet1=sizenumSet1;
dat.numSet2=sizenumSet2;
dat.numSet3=sizenumSet3;
opl.addDataSource(dat);
opl.generate();
for (var k in sizenumSet1){
//random values for Par1[Set1]
dat.Par1[k]= 10 + Opl.rand(100);
writeln(Par1);
//random values for Par2[Set1][Set2]
for (var m in sizenumSet2){
dat.Par2[k][m]= 1 + Opl.rand(5);
writeln(Par2);
for (var j in sizenumSet3) {
//random values for Par4[Set1][Set2][Set3]
dat.Par4[k][m][j] = 1 + Opl.rand(10);
writeln(Par4);
}
}
//random values for Par3[Set1]
dat.Par3[k]= 1 + Opl.rand(5);
writeln(Par3);
}
if (MyCplex.solve()) {
writeln("Solution: ", MyCplex.getObjValue(),
" / sizeSet1: ", sizenumSet1,
" / sizeSet2: ", sizenumSet2,
" / sizeSet3: ", sizenumSet3,
" / time: ", MyCplex.getCplexTime());
}
opl.end();
MyCplex.end();
}
}
}
}
Запустив этот код, я получаю следующую ошибку:
Scripting runtime error: Index out of bound for array "Par1", "toString".
Итак, у меня есть два вопроса:
- Как решить эту ошибку?
- Как обновить значения в Par1 в соответствии с размером наборов?
Спасибо
ОБНОВЛЕНИЕ С КОДОМ:
sub.mod
//set
{int} subrow = ...;
{int} subcol = ...;
int y[subrow][subcol]=...;
//preprocessing
execute{
writeln("y=",y);
}
//decisional variables
dvar float x;
//model
maximize x;
subject to {
x<=sum(i in subrow, j in subcol) y[i][j];
}
//postprocessing
execute{
writeln("x=",x);
}
main.mod
{int} row={};
{int} col={};
int numrow = 2;
int numcol = 2;
int ar[1..numrow][1..numcol];
main {
var source = new IloOplModelSource("sub.mod");
var cplex = new IloCplex();
var def = new IloOplModelDefinition(source);
for (var dimrow=1; dimrow<=2; dimrow+=1){
for (var dimcol=1; dimcol<=2; dimcol+=1){
var opl = new IloOplModel(def,cplex);
var data2 = new IloOplDataElements();
for(var i=1; i<=dimrow; i+=1){
for(var j=1; j<=dimcol; j+=1){
data2.subrow = thisOplModel.row;
data2.subrow.add(dimrow);
data2.subcol = thisOplModel.col;
data2.subcol.add(dimcol);
data2.y = thisOplModel.ar;
data2.y[i][j] = Opl.rand(10);
}
}
}
}
opl.addDataSource(data2);
opl.generate();
if (cplex.solve()) {
writeln("OBJ = " + cplex.getObjValue());
} else {
writeln("No solution");
}
data2.end();
opl.end();
}
В конце я всегда получаю матрицу размеров, объявленных в numrow = 2 и numcol = 2. Я не могу изменить значение. Если я изменю его, и он не будет совпадать с теми, что указаны в циклах «for», то у меня будет ошибка (вне пределов).