Файл IndSas.Dat
/*********************************************
* OPL 12.6.2 Data
* Creation Date: 24.12.2015 at 10:32:40
*********************************************/
n = 19;
m = 27;
m1 = 9;
n1 = 10;
SheetConnection sheet("ind.xls");
A1 from SheetRead(sheet,"SAS!b4:k12");
A2 from SheetRead(sheet,"SAS!b13:k30");
A3 from SheetRead(sheet,"SAS!l13:t30");
b1 from SheetRead(sheet,"SAS!v4:v12");
b2 from SheetRead(sheet,"SAS!v13:v30");
z1 from SheetRead(sheet,"SAS!b31:k31");
z2 from SheetRead(sheet,"SAS!l31:t31");
x to SheetWrite(sheet,"SAS!b3:k3");
w to SheetWrite(sheet,"SAS!l3:t3");
В данном файле описываются все данные, которые понадобятся во время решения программы. SheetCоnnectiоn – операция, связывающая таблицу Excel с переменной. SheetReаd – процедура для чтения данных с выбранной таблицы, выбранной страницы и выбранного интервала. SheetWrite – процедура для записи значения в таблицу.
Файл IndSas.Mod
/*********************************************
* OPL 12.6.2 Model
* Creation Date: 24.12.2015 at 10:32:40
*********************************************/
int n = ...;
int m = ...;
int m1 = ...;
int n1 = ...;
int m2 = m - m1;
int n2 = n - n1;
range j1 = 1..n1;
range j2 = 1..n2;
range i1 = 1..m1;
range i2 = 1..m2;
float b1[i1] = ...;
float b2[i2] = ...;
float z1[j1] = ...;
float z2[j2] = ...;
float A3[i2][j2] = ...;
float A1[i1][j1] = ...;
float A2[i2][j1] = ...;
float MaxValue = 1000*max(r in i2) b2[r];
dvar float x[j1] in 0..MaxValue;
dvar boolean w[j2];
minimize
sum(jj in j1) z1[jj] * x[jj] +
sum(jjj in j2) z2[jjj] * w[jjj] ;
subject to {
forall( r1 in i1 )
ct1:
sum( jj in j1)
A1[r1][jj] * x[jj] <= b1[r1];
forall( r in i2 )
ct2:
sum( jj in j1 )
A2[r][jj] * x[jj] +
sum( jjj in j2)
A3[r][jjj] * w[jjj] <= b2[r];
}
В результате работы получаем решение в IBM ILоg и Excel, которое показано на рисунке 4.
Решение в IBM ILоg CPLEX:
// solution (optimal) with objective 68
x = [0
10 53 15 35 53 0 15 35 68];
w = [0 0 1 1 1 0 0 1 0];
IBM ILоg CP:
Файл JSP.dat
/*********************************************
* OPL 12.6.2.0 Model
* Creation Date: 24.12.2015 at 18:28:34 *********************************************/
CJobs = 3;
CMachines = 3;
Ops = [
[ <1,10>, <0,25>, <1,5> ],
[ <2,15>, <1,18>, <0,15> ],
[ <2,15>, <1,20>, <0,15> ]
];
Файл JSP.mod
/*********************************************
* OPL 12.6.2.0 Model
* Creation Date: 24.12.2015 at 18:28:34 *********************************************/
using CP;
int CJobs = ...;//Работы
int CMachines = ...;//Станки
range Jobs = 0..CJobs-1;
range Mchs = 0..CMachines-1;// Mchs используется для индекса станков
tuple Operation {
int mch; // Станок
int pt; // Время в процессе
};
Operation Ops[j in Jobs][m in Mchs] = ...; //индексы j и m
dvar interval itvs[j in Jobs][o in Mchs] size Ops[j][o].pt; //динамическая переменная Интервал
dvar sequence mchs[m in Mchs] in all(j in Jobs, o in Mchs : Ops[j][o].mch == m) itvs[j][o];//последовательности
execute {
cp.param.FailLimit = 10000;
}
minimize max(j in Jobs) endOf(itvs[j][CMachines-1]);
subject to {
forall (m in Mchs)
noOverlap(mchs[m]);
forall (j in Jobs, o in 0..CMachines-2)
endBeforeStart(itvs[j][o], itvs[j][o+1]);
}
execute {
for (var j = 0; j <= CJobs-1; j++) {
for (var o = 0; o <= CMachines-1; o++) {
write(itvs[j][o].start + " ");
}
writeln("");
}
}
Решение в IBM ILоg CP:
// solution with objective 68
itvs = [[<1 0 10 10>
<1 10 35 25> <1 53 58 5>]
[<1 15 30 15> <1 35 53 18> <1 53 68 15>]
[<1 0 15 15> <1 15 35 20> <1 35 50 15>]];
mchs = [{<"itvs[0][1]" 0 0 0 10 35 25>
<"itvs[1][2]" 1 1 1 53 68 15>} {
<"itvs[0][0]" 0 0 0 0 10 10>
<"itvs[2][1]" 1 3 1 15 35 20>
<"itvs[1][1]" 2 2 2 35 53 18>
<"itvs[0][2]" 3 1 3 53 58 5>} {
<"itvs[2][0]" 0 1 0 0 15 15>
<"itvs[1][0]" 1 0 1 15 30 15>}];