Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.61 KB | None | 0 0
  1. using CP;
  2.  
  3. // Pocet zamestnancu, ktere mame k dispozici
  4. //int Zamestnanci = ...;
  5. //Pocet pacientov
  6. int pocet_pacientov = ...;
  7.  
  8. //Pocet typov vysetreni
  9. int typy_vysetrenia = ...;
  10.  
  11. //Pocet pracovist
  12. int pocet_pracovist = ...;
  13.  
  14. //Doba trvania vysetrenia daneho typu
  15. int trvania[1..typy_vysetrenia] = ...;
  16.  
  17. int pracovistia[1..pocet_pracovist][1..typy_vysetrenia] = ...;
  18.  
  19.  
  20. //int precedencie[1..typy_vysetreni-1][1..2] = ...;
  21.  
  22. tuple zavislosti{
  23. int Pred;
  24. int Po;
  25. }
  26.  
  27. {zavislosti} precedencie = ...;
  28.  
  29.  
  30. // Datova struktura pro ulozeni zakazky - obsahuje udaje o jejim trvani a poctu potrebnych zamestnancu
  31. //tuple Zakazka {
  32. // int trvani;
  33. // int zamestnanci;
  34. //}
  35.  
  36. tuple Pacient{
  37. int priorita;
  38. int vysetrenia[1..typy_vysetrenia];
  39. }
  40.  
  41. Pacient pacienti[1..pocet_pacientov] = ...;
  42.  
  43. //tuple Vysetrenie{
  44. // int trvanie;
  45. // int pracovisko;
  46. // int pacienti[1..pocet_pacientov];
  47. // int pocet_pacientov_co_potrebuju;
  48. //}
  49.  
  50. //Vysetrenie vysetrenia[1..typy_vysetrenia];
  51.  
  52. //dvar interval labaratorium[typ in 1..typy_vysetreni][1..vysetrenia[typ].pocet_pacientov_co_potrebuju];
  53. dvar interval casy[p in 1..pocet_pacientov][typ in 1..typy_vysetrenia] size pacienti[p].vysetrenia[typ];
  54.  
  55.  
  56. //dvar interval vysetrenie[prac in 1..pocet_pracovist][pac in 1..pocet_pacientov][typ in 1..typy_vysetrenia] size trvania[typ];
  57. //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];
  58.  
  59.  
  60. // Domenove promenne typu interval, popisuji pocatecni a koncovy cas, ve kterem bude kazda zakazka vykonana.
  61. // Delka (size) intervalu je pevna, rovna dobe trvani zakazky
  62. //dvar interval casy[1..pocet_pracovist][typ in 1..vysetrenia] size trvania[typ];
  63. //dvar interval vysetrenie[p in 1..pocet_pacientov][typ in pacienti[p].vysetrenia] size trvania[typ];
  64. //***POSLEDNA DOBRA
  65. //dvar interval vysetrenie[1..pocet_pacientov][typ in 1..typy_vysetrenia] size trvania[typ];
  66.  
  67.  
  68.  
  69. //dvar interval vysetrenie[p in 1..pocet_pacientov][typ in 1..pacienti[p].vysetrenia] size trvania[typ];
  70.  
  71. //dvar sequence planDelnika[d in Delnici]in all (dm in Domy, s in Schopnosti : s.delnik == d) prirazeni[dm][s];
  72. //Ci pacient potrebuje vysetrenie robim binarne pomocou pozicie v poli
  73. //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];
  74.  
  75. //POSLEDNA DOBRA*** plan pre kazdeho pacienta, aby sa neprekryvali
  76. //dvar sequence S in all(p in 1..pocet_pacientov, typ in 1..typy_vysetrenia: pacienti[p].vysetrenia[typ] == 1) vysetrenie[p][typ];
  77.  
  78.  
  79. //dvar interval vys[1..pocet_pacientov*typy_vysetrenia] optional;
  80. //dvar sequence plan_pracovista[prac in 1..pocet_pracovist] in all (typ in 1..typy_vysetrenia: pracovistia[prac][typ] == 1) vys[prac];
  81. //dvar interval priradenie[1..pocet_pacientov][1..pocet_pracovist];
  82. //int p_pracovist[1..pocet_pacientov];
  83. dvar sequence S[p in 1..pocet_pacientov] in casy;
  84.  
  85. // DOPLNTE: volitelny interval pro kazdou zakazku a pracoviste
  86. //dvar interval prirazeni[1..pocetZakazek][1..Zamestnanci] optional;
  87. //dvar interval prirazeni[1..typy_vysetreni][1..pacienti] optional;
  88. // DOPLNTE: sekvence intervalu pro kazdeho zamestnance
  89. //dvar sequence pracoviste[pac in 1..pacienti] in all (typ in 1..typy_vysetreni) prirazeni[typ][pac];
  90. //dvar sequence pracoviste[1..pocet_pracovist] in all (pac in 1..pacienti) casy[pac][typ];
  91.  
  92. // DOPLNTE: kumulativni funkce scitajici pocet aktualne pracujicich. Kazda zakazka do jeji hodnoty pridava
  93. // tolik zamestnancu, kolik potrebuje, a to prave v dobe, kdy je vykonavana
  94. //cumulFunction labaky = sum (p in 1..pocet_pacientov, typ in 1..typy_vysetrenia) pulse(vysetrenie[p][typ], 1);
  95. // Chceme praci dokoncit co nejdrive, a proto minimalizujeme cas dokonceni posledni zakazky
  96. //minimize max (pac in 1..pocet_pacientov) endOf(vysetrenie[pac][typy_vysetrenia]);
  97.  
  98. subject to {
  99. // DOPLNTE: Nemuzeme pouzit vice zamestnancu, nez kolik jich mame k dispozici
  100. //labaky <= pocet_pracovist; //koli cumul funkci
  101. // DOPLNTE: Pro kazdou zakazku spojime interval s adekvatnim poctem intervalu jednotlivych zamestnancu
  102. forall (p in 1..pocet_pracovist)
  103. noOverlap(S[p]);
  104.  
  105.  
  106.  
  107. //noOverlap(S);
  108. //forall (p in precedencie, pac in 1..pocet_pacientov, prac in 1..pocet_pracovist)
  109. // endBeforeStart(vysetrenie[pac][p.Pred], vysetrenie[pac][p.Po]);
  110.  
  111. //alternative(casy[u],all (z in 1..Zamestnanci) prirazeni[u][z],pocetZamestnancu[u]);
  112. //forall (p in 1..pocet_pacientov, prac in 1..pocet_pracovist)
  113. // alternative(priradenie[p][prac], all (typ in 1..typy_vysetrenia: pacienti[p].vysetrenia[typ] * pracovistia[prac][typ] == 1) vysetrenie[p][typ]);
  114. //forall (p in 1..pocet_pacientov, typ in 1..typy_vysetrenia)
  115. // alternative(vysetrenie[p][typ], all (prac in 1..pocet_pracovist: pracovistia[prac][typ] * pacienti[p].vysetrenia[typ] == 0) priradenie[p][prac]);
  116. // alternative(vysetrenie[p][typ], all (prac in 1..pocet_pracovist) priradenie[p][prac]);
  117.  
  118.  
  119. //forall(p in 1..pacienti){
  120. // noOverlap(pracoviste[p]);
  121. // }
  122.  
  123. // forall(pac in 1..pacienti, p in precedencie){
  124. // endBeforeStart(casy[pac][p.Pred], casy[pac][p.Po]);
  125. // }
  126.  
  127. // DOPLNTE: Intervaly jednotliveho zamestnance se nesmeji prekryvat
  128. // forall(zam in 1..Zamestnanci){
  129. // noOverlap(zamestnanec[zam]);
  130. //}
  131.  
  132.  
  133. }
  134.  
  135. //execute {
  136. // for (var zak = 1; zak <= pocetZakazek; zak++) {
  137. // writeln("Zakazka " + zak + "(" + casy[zak].start + ";" + casy[zak].end + "):");
  138. //for (var zam = 1; zam <= Zamestnanci; zam++) {
  139. // if (prirazeni[zak][zam].present) {
  140. // writeln("Zamestnanec " + zam);
  141. //}
  142. //}
  143. //writeln();
  144. //}
  145. //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement