Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*********************************************
- * OPL 12.6.1.0 Model
- * Author: afro
- * Creation Date: 25-05-2016 at 21:23:31
- *********************************************/
- // liczba zadań
- int n = ...;
- // liczba typów zasobów
- int p = ...;
- // zbiór zadań
- range Tasks = 1..n;
- // zbiór zasobów
- range Resources = 1..p;
- // czas wykonania każdego zadania
- int time[Tasks] = ...;
- // liczba jednostek czasu
- int nT = sum(t in Tasks) time[t];
- // limit każdego z zasobów
- int N[Resources] = ...;
- // liczba zasobów potrzebna do wykonania każdego zadania
- int res[Tasks][Resources] = ...;
- // macierz ograniczeń oparta na grafie, w wierszach są zadania,
- //które muszą zostać wykonane najpierw
- int cM[Tasks][Tasks] = ...;
- // zbiór jednostek czasu
- range MaxTime = 1..nT;
- // czas rozpoczęcia zadania
- dvar float sT[Tasks];
- // binarny grafik reprezentujacy wykonywane zadania w jednostce czasu
- dvar boolean schedule[Tasks][MaxTime];
- // czas zakończenia zadania
- //dvar int eT[Tasks];
- // zasoby potrzebne w jednostce czasu
- //dvar int ResInTime[Resources][MaxTime];
- minimize max(t in Tasks) (sT[t] + time[t]);
- subject to {
- forall(t in Tasks)
- first:
- // ustalenie kolejności na podstawie grafu
- sT[t] == (max(cT in Tasks) (cM[t,cT]*(sT[cT] + time[cT])));
- forall(t in Tasks)
- second:
- // ustawienie jedynek na przedziale start time - end time
- (sum(tU in MaxTime) ((schedule[t][tU] == 1) && (tU >= sT[t]) && (tU <= (sT[t] + time[t])))) == time[t];
- forall(t in Tasks)
- third1:
- // powiązanie sT ze schedule
- (max(tU in MaxTime) (tU*schedule[t][tU]) - time[t]) == sT[t];
- forall(t in Tasks)
- third2:
- // powiązanie eT ze schedule
- (max(tU in MaxTime) (tU*schedule[t][tU])) == (sT[t] + time[t]);
- forall(tU in MaxTime)
- {
- third3:
- // ograniczenie zasobów, sumowanie zasobów kolumnami
- forall(r in Resources)
- {
- // bezpośrednie ograniczenie zasobów, bez przypisania do zmiennej
- // dla 32 kończy się, dla 31 i mniej się nie kończy
- // ogólne ograniczenie to N[r]
- (sum(t in Tasks) (schedule[t][tU]*res[t][r])) <= 34;
- }
- };
- }
- execute {
- writeln("Hello ", sT[8] + time[8]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement