Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using CP;
- // Pocet zamestnancu, ktere mame k dispozici
- //int Zamestnanci = ...;
- //Pocet pacientov
- int pocet_pacientov = ...;
- //Pocet typov vysetreni
- int typy_vysetrenia = ...;
- //Pocet pracovist
- int pocet_pracovist = ...;
- //Doba trvania vysetrenia daneho typu
- int trvania[1..typy_vysetrenia] = ...;
- int pracovistia[1..pocet_pracovist][1..typy_vysetrenia] = ...;
- //int precedencie[1..typy_vysetreni-1][1..2] = ...;
- tuple zavislosti{
- int Pred;
- int Po;
- }
- {zavislosti} precedencie = ...;
- // Datova struktura pro ulozeni zakazky - obsahuje udaje o jejim trvani a poctu potrebnych zamestnancu
- //tuple Zakazka {
- // int trvani;
- // int zamestnanci;
- //}
- tuple Pacient{
- int priorita;
- int vysetrenia[1..typy_vysetrenia];
- }
- Pacient pacienti[1..pocet_pacientov] = ...;
- //tuple Vysetrenie{
- // int trvanie;
- // int pracovisko;
- // int pacienti[1..pocet_pacientov];
- // int pocet_pacientov_co_potrebuju;
- //}
- //Vysetrenie vysetrenia[1..typy_vysetrenia];
- //dvar interval labaratorium[typ in 1..typy_vysetreni][1..vysetrenia[typ].pocet_pacientov_co_potrebuju];
- dvar interval casy[p in 1..pocet_pacientov][typ in 1..typy_vysetrenia] size pacienti[p].vysetrenia[typ];
- //dvar interval vysetrenie[prac in 1..pocet_pracovist][pac in 1..pocet_pacientov][typ in 1..typy_vysetrenia] size trvania[typ];
- //dvar sequence S[prac in 1..pocet_pracovist] in all(p in 1..pocet_pacientov, typ in 1..typy_vysetrenia: pacienti[p].vysetrenia[typ] == 1) vysetrenie[prac][p][typ];
- // Domenove promenne typu interval, popisuji pocatecni a koncovy cas, ve kterem bude kazda zakazka vykonana.
- // Delka (size) intervalu je pevna, rovna dobe trvani zakazky
- //dvar interval casy[1..pocet_pracovist][typ in 1..vysetrenia] size trvania[typ];
- //dvar interval vysetrenie[p in 1..pocet_pacientov][typ in pacienti[p].vysetrenia] size trvania[typ];
- //***POSLEDNA DOBRA
- //dvar interval vysetrenie[1..pocet_pacientov][typ in 1..typy_vysetrenia] size trvania[typ];
- //dvar interval vysetrenie[p in 1..pocet_pacientov][typ in 1..pacienti[p].vysetrenia] size trvania[typ];
- //dvar sequence planDelnika[d in Delnici]in all (dm in Domy, s in Schopnosti : s.delnik == d) prirazeni[dm][s];
- //Ci pacient potrebuje vysetrenie robim binarne pomocou pozicie v poli
- //dvar sequence S[1..pocet_pracovist] in all(p in 1..pocet_pacientov, typ in 1..typy_vysetrenia: pacienti[p].vysetrenia[typ] == 1) vysetrenie[p][typ];
- //POSLEDNA DOBRA*** plan pre kazdeho pacienta, aby sa neprekryvali
- //dvar sequence S in all(p in 1..pocet_pacientov, typ in 1..typy_vysetrenia: pacienti[p].vysetrenia[typ] == 1) vysetrenie[p][typ];
- //dvar interval vys[1..pocet_pacientov*typy_vysetrenia] optional;
- //dvar sequence plan_pracovista[prac in 1..pocet_pracovist] in all (typ in 1..typy_vysetrenia: pracovistia[prac][typ] == 1) vys[prac];
- //dvar interval priradenie[1..pocet_pacientov][1..pocet_pracovist];
- //int p_pracovist[1..pocet_pacientov];
- dvar sequence S[p in 1..pocet_pacientov] in casy;
- // DOPLNTE: volitelny interval pro kazdou zakazku a pracoviste
- //dvar interval prirazeni[1..pocetZakazek][1..Zamestnanci] optional;
- //dvar interval prirazeni[1..typy_vysetreni][1..pacienti] optional;
- // DOPLNTE: sekvence intervalu pro kazdeho zamestnance
- //dvar sequence pracoviste[pac in 1..pacienti] in all (typ in 1..typy_vysetreni) prirazeni[typ][pac];
- //dvar sequence pracoviste[1..pocet_pracovist] in all (pac in 1..pacienti) casy[pac][typ];
- // DOPLNTE: kumulativni funkce scitajici pocet aktualne pracujicich. Kazda zakazka do jeji hodnoty pridava
- // tolik zamestnancu, kolik potrebuje, a to prave v dobe, kdy je vykonavana
- //cumulFunction labaky = sum (p in 1..pocet_pacientov, typ in 1..typy_vysetrenia) pulse(vysetrenie[p][typ], 1);
- // Chceme praci dokoncit co nejdrive, a proto minimalizujeme cas dokonceni posledni zakazky
- //minimize max (pac in 1..pocet_pacientov) endOf(vysetrenie[pac][typy_vysetrenia]);
- subject to {
- // DOPLNTE: Nemuzeme pouzit vice zamestnancu, nez kolik jich mame k dispozici
- //labaky <= pocet_pracovist; //koli cumul funkci
- // DOPLNTE: Pro kazdou zakazku spojime interval s adekvatnim poctem intervalu jednotlivych zamestnancu
- forall (p in 1..pocet_pracovist)
- noOverlap(S[p]);
- //noOverlap(S);
- //forall (p in precedencie, pac in 1..pocet_pacientov, prac in 1..pocet_pracovist)
- // endBeforeStart(vysetrenie[pac][p.Pred], vysetrenie[pac][p.Po]);
- //alternative(casy[u],all (z in 1..Zamestnanci) prirazeni[u][z],pocetZamestnancu[u]);
- //forall (p in 1..pocet_pacientov, prac in 1..pocet_pracovist)
- // alternative(priradenie[p][prac], all (typ in 1..typy_vysetrenia: pacienti[p].vysetrenia[typ] * pracovistia[prac][typ] == 1) vysetrenie[p][typ]);
- //forall (p in 1..pocet_pacientov, typ in 1..typy_vysetrenia)
- // alternative(vysetrenie[p][typ], all (prac in 1..pocet_pracovist: pracovistia[prac][typ] * pacienti[p].vysetrenia[typ] == 0) priradenie[p][prac]);
- // alternative(vysetrenie[p][typ], all (prac in 1..pocet_pracovist) priradenie[p][prac]);
- //forall(p in 1..pacienti){
- // noOverlap(pracoviste[p]);
- // }
- // forall(pac in 1..pacienti, p in precedencie){
- // endBeforeStart(casy[pac][p.Pred], casy[pac][p.Po]);
- // }
- // DOPLNTE: Intervaly jednotliveho zamestnance se nesmeji prekryvat
- // forall(zam in 1..Zamestnanci){
- // noOverlap(zamestnanec[zam]);
- //}
- }
- //execute {
- // for (var zak = 1; zak <= pocetZakazek; zak++) {
- // writeln("Zakazka " + zak + "(" + casy[zak].start + ";" + casy[zak].end + "):");
- //for (var zam = 1; zam <= Zamestnanci; zam++) {
- // if (prirazeni[zak][zam].present) {
- // writeln("Zamestnanec " + zam);
- //}
- //}
- //writeln();
- //}
- //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement