První „výpočetní“ lekce kapitoly K5 — a schválně taková, která ještě nepotřebuje žádný nový algoritmus: celou práci odvede max flow, který umíš z K4. Notaci $P \mid \mathrm{pmtn}, r_j, \tilde{d}_j \mid$ už přečteš z minulé lekce [L5.1] Grahamova notace α|β|γ: identické paralelní procesory (počet $R$ je v instanci), preempce povolena, release times a tvrdé deadliny — a prázdné $\gamma$ = rozhodovací problém: ptáme se jen, jestli přípustný rozvrh existuje. Přesně takhle padl na zkoušce 2023 (str. 3) s pokynem “Formulate as Maximum flow problem.”
“Consider a $P \mid pmtn, r_j, \widetilde{d_j} \mid -$ problem - we have $n$ tasks which we want to assign to $R$ identical resources (processors). Each task has its own processing time $p_j$, release date $r_j$ and deadline $\widetilde{d_j}$. Preemption is allowed (including migration from one resource to another).”
Goal: “Assign all tasks to processors so that every processor will execute no more than one task at a moment and no task will be executed simultaneously on more than one processor. This can be solved as a Maximum flow problem.”
Pracovat budeme s ukázkovou instancí ze slidů 5–6 (3 paralelní identické procesory):
| task | $T_1$ | $T_2$ | $T_3$ | $T_4$ |
|---|---|---|---|---|
| $p_j$ | 1.5 | 1.25 | 2.1 | 3.6 |
| $r_j$ | 3 | 1 | 3 | 5 |
| $\widetilde{d}_j$ | 5 | 4 | 7 | 9 |
pmtn. Bez preempce by úloha musela běžet vcelku a rozvrh by byl o kombinatorickém pořadí — to tok neumí. S preempcí (včetně migrace mezi procesory) můžu úlohu krájet na libovolně malé kousky a libovolně je přeskládávat. Pak přestává být důležité kdy přesně úloha běží — stačí vědět, kolik jí běží v jednotlivých úsecích času. A „kolik čeho kam nateče“ je přesně to, co počítá tok.
Časovou osu nebudeme dělit na jednotkové slotíky — rozdělíme ji jen v bodech, kde se „něco děje“. Nejdřív se podívej na časová okna $\langle r_j, \tilde{d}_j \rangle$ všech čtyř úloh:
Seřazené sjednocení všech releasů a deadlinů: $\{3,1,3,5\} \cup \{5,4,7,9\} = \{1,3,4,5,7,9\}$ — to dá 5 intervalů $I_{1,3}, I_{3,4}, I_{4,5}, I_{5,7}, I_{7,9}$. Proč stačí tyhle body? Uvnitř intervalu se množina úloh, které smí běžet, nemění — žádná úloha tam nepřibyde ($r_j$) ani neztratí nárok běžet ($\tilde{d}_j$). Díky preempci můžu práci uvnitř intervalu libovolně přeskládat, takže o rozvrhu uvnitř intervalu rozhoduje jediné číslo na úlohu: kolik jí tam poběží. Slide 6 (EN 1:1): “Nodes $I_{1,3}, I_{3,4}, I_{4,5}, I_{5,7}$ a $I_{7,9}$ represent time interval in which the tasks can be executed (intervals are given by $r$ and $\widetilde{d}$). E.g. $I_{1,3}$ represents time interval $\langle 1, 3 \rangle$.”
Síť má stejný vrstvený půdorys, jaký znáš z [L4.5] Modelování přiřazení jako tok (vrstvená síť): $s \to$ úlohy $\to$ intervaly $\to t$. Než ti prozradím kapacity, zkus si je rozmyslet sám:
$s \to T_j$: kapacita $p_j$. Tok touto hranou = kolik práce úlohy $T_j$ se celkem naplánuje; víc než $p_j$ jí není a chceme právě $p_j$ (úloha musí být dokončená — to je definiční vlastnost rozvrhování z [L5.1]). Ruční zkouškové řešení si k tomu píše: „$LB = 0$, $UB =$ vstupní tok do úkolu.“
$I_{x,y} \to t$: kapacita $(y-x) \cdot R$. Interval délky $y-x$ nabízí na $R$ procesorech přesně $(y-x)\cdot R$ jednotek strojového času — víc práce se do něj fyzicky nevejde. Slide 6 (EN 1:1): “The upper bound for $(I_{x,y}, t)$ is the length of the interval multiplied by the number of resources.”
Kapacita = délka intervalu $y - x$. Úloha je interně sekvenční — v každém okamžiku běží nejvýš na jednom procesoru (obecné omezení z [L5.1]). Za interval délky $y-x$ tedy stihne nejvýš $y-x$ jednotek své práce, ať je procesorů kolik chce. Slide 6 (EN 1:1): “The upper bound for the $(T_j, I_{x,y})$ arc is the length of the time interval (i.e. $y - x$), since the tasks are internally sequential.”
A samozřejmě: hrana $T_j \to I_{x,y}$ v síti existuje jen tehdy, když úloha v daném intervalu smí běžet, tj. $\langle x, y\rangle \subseteq \langle r_j, \tilde{d}_j\rangle$. Celou stavbu si proklikej:
Potřebují — a je to nejčastěji zapomenutá část formulace. Bez kapacity $y-x$ na hraně $T_j \to I_{x,y}$ by tok mohl poslat třeba 3 jednotky úlohy do intervalu délky 1 — dekódováno: úloha běží na třech procesorech současně, což obecné omezení „task on at most one resource at a moment“ zakazuje. Kapacita $p_j$ na zdrojové hraně ani $(y-x)R$ na stokové tohle neuhlídají. Druhá zapomínaná věc: hrany kreslit jen do intervalů uvnitř okna $\langle r_j, \tilde{d}_j\rangle$.
Řez $A = \{s\}$ má kapacitu $\sum_j p_j$ — součet všech zdrojových hran. Podle slabé duality ([L4.4] Řez a věta max-flow/min-cut) tedy $|f| \le \sum_j p_j$ vždy. Tady konkrétně $\sum p_j = 1.5 + 1.25 + 2.1 + 3.6 = 8.45$.
Přípustný preemptivní rozvrh existuje $\iff$ maximální tok má hodnotu $|f| = \sum_j p_j$, tj. všechny hrany ze zdroje jsou nasycené — každá úloha dostala celých svých $p_j$ jednotek práce. Stejné čtecí pravidlo jako u vrstvených přiřazovacích sítí v [L4.5]. Když $|f| < \sum_j p_j$, rozvrh neexistuje a minimální řez je certifikát úzkého hrdla [L4.4] — ukáže okno, do kterého se předepsaná práce nevejde.
Protože výsledek nemusí být celočíselný! V [L4.5] kódoval tok rozhodnutí ano/ne (nominace, přiřazení) — zlomek nominace nedává smysl, proto byla celočíselnost klíčová. Tady tok kóduje množství odvedené práce a preempce dovoluje krájet úlohy na libovolně malé kousky: $f(T_j \to I_{x,y}) = 0.8$ prostě znamená „0.8 jednotky úlohy $T_j$ poběží někde uvnitř intervalu“. Zlomkový max flow se na rozvrh dekóduje úplně stejně dobře jako celočíselný.
Tok rozhoduje feasibilitu preemptivní verze problému. Jakmile $\beta$ preempci nepovoluje, množstevní pohled se rozbije (úloha musí běžet vcelku — tok neumí říct „vcelku“) a problém tvrdne: už jednostrojové nepreemptivní $1 \mid r_j, \tilde{d}_j \mid C_{max}$ je silně NP-těžké a řeší se úplně jinak (Bratleyho branch & bound — lekce [L5.9]). Než začneš kreslit síť, zkontroluj v notaci, že tam pmtn opravdu je.
Formulací úloha na písemce obvykle končí — ale opravující na ručním řešení ze zkoušky 2023 červeně připsal „chybí flow → schedule“. Umět z toku vyrobit rozvrh tedy patří k plné odpovědi (a u ústní se na to ptají). Postup:
U zadání “Formulate as Maximum flow problem” odevzdej pět věcí (srovnej se čtyřmi věcmi z [L4.5] — přibyly intervaly):
We have $n$ tasks which we want to assign to $R$ identical resources (processors). Each task has its own processing time $p_j$, release date $r_j$ and deadline $\tilde{d}_j$. Preemption is allowed (including migration from one resource to another). Every processor will execute no more than one task at a moment and no task will be executed simultaneously on more than one processor.
2 parallel identical resources:
| $T_1$ | $T_2$ | $T_3$ | $T_4$ | $T_5$ | |
|---|---|---|---|---|---|
| $p_j$ | 2.1 | 3.2 | 4.1 | 1.6 | 2 |
| $r_j$ | 0 | 2 | 0 | 5 | 5 |
| $\tilde{d}_j$ | 5 | 6 | 6 | 7 | 7 |
Formulate as Maximum flow problem.
Feasibility problém $P2 \mid \mathrm{pmtn}, r_j, \tilde{d}_j \mid$ — pět úloh s okny $\langle r_j, \tilde{d}_j\rangle$, dva identické procesory, preempce s migrací povolena. Nechtějí po tobě rozvrh hledat ručně — chtějí formulaci jako max flow: síť + kapacity + kritérium (+ čtení výsledku).
Drž se čtyř kroků lekce: (1) vypiš seřazené sjednocení $\{r_j\}\cup\{\tilde d_j\}$ a z něj intervaly; (2) nakresli tři vrstvy a rozmysli, do kterých intervalů má každá úloha hranu (okno $\langle r_j,\tilde d_j\rangle$ musí interval pokrývat celý); (3) přiřaď tři druhy kapacit — u prostředních hran si vzpomeň na sekvenčnost úloh; (4) napiš kritérium nasycení a větu o čtení rozvrhu z toku. Pozor, $R = 2$, ne 3 jako v ukázce ze slidů.
(Postup 1:1 podle ručního zkouškového řešení; značení intervalů dtto.)
1. Intervaly. $R = 2$. Důležité body určující intervaly: $\mathrm{set}(M[r_j; \tilde d_j]) = \{0, 2, 5, 6, 7\}$. Intervaly: $I_{0,2} = \langle 0;2)$, $I_{2,5} = \langle 2;5)$, $I_{5,6} = \langle 5;6)$, $I_{6,7} = \langle 6;7\rangle$ — délky $2, 3, 1, 1$.
2. Síť. Vrstvy $S \to$ úlohy $\{1,\dots,5\} \to$ intervaly $\to T$. Hrany úloha → interval jen tam, kde $\langle x,y\rangle \subseteq \langle r_j, \tilde d_j\rangle$: $T_1\,(0..5) \to I_{0,2}, I_{2,5}$; $T_2\,(2..6) \to I_{2,5}, I_{5,6}$; $T_3\,(0..6) \to I_{0,2}, I_{2,5}, I_{5,6}$; $T_4, T_5\,(5..7) \to I_{5,6}, I_{6,7}$.
3. Kapacity. Dolní meze všude $LB = 0$. $S \to$ úloha: $UB = p_j$ (2.1, 3.2, 4.1, 1.6, 2). Úloha → interval: $UB$ = délka intervalu. Interval → $T$: $UB$ = délka $\cdot R$, tedy $4, 6, 2, 2$ (ruční řešení: „upper bounds: množství volných jednotek v intervalu → délka $I \cdot R$“).
4. Kritérium. Spočti max flow. Přípustný rozvrh existuje $\iff |f| = \sum_j p_j = 2.1+3.2+4.1+1.6+2 = 13$, tj. všechny hrany ze zdroje nasycené. Čtení: $f(T_j \to I_{x,y})$ = kolik jednotek úlohy $T_j$ poběží v intervalu $\langle x,y\rangle$; uvnitř intervalu kousky rozliješ na 2 procesory (flow → schedule — bez této věty opravující strhával, viz červená poznámka na ručním řešení).
5. Dopočet feasibility + Gantt (vlastní rozšíření — ruční řešení končí formulací). Max flow hodnoty 13 skutečně dosahuje, např.:
| $f$ | $I_{0,2}$ | $I_{2,5}$ | $I_{5,6}$ | $I_{6,7}$ | $\sum$ |
|---|---|---|---|---|---|
| $T_1$ | 2 | 0.1 | — | — | 2.1 ✓ |
| $T_2$ | — | 3 | 0.2 | — | 3.2 ✓ |
| $T_3$ | 2 | 2.1 | 0 | — | 4.1 ✓ |
| $T_4$ | — | — | 0.8 | 0.8 | 1.6 ✓ |
| $T_5$ | — | — | 1 | 1 | 2 ✓ |
| do $T$ (kap.) | 4 (4) | 5.2 (6) | 2 (2) | 1.8 (2) | 13 |
Všechny prostřední hrany respektují kapacitu = délku intervalu (max 2, 3, 1, 1) a zdrojové hrany jsou nasycené → rozvrh existuje. Rozlití uvnitř intervalů dá např. tento Gantt:
Kontrola: žádná úloha neběží na dvou procesorech naráz ($T_2$ končí na $P^1$ v čase 5 a na $P^2$ běží až $\langle 5; 5.2)$) a všechna okna jsou dodržena: $C_1 = 4.2 \le 5$, $C_2 = 5.2 \le 6$, $C_3 = 4.1 \le 6$, $C_4 = 6.8 \le 7$, $C_5 = 7 \le 7$.
Úlohu T01 vyřeš celou na papír (bez koukání do řešení): body → intervaly → síť se všemi kapacitami → kritérium → věta o flow → schedule. Pak pošli fotku — zkontroluju ti ji a vytknu chyby.
Consider the problem $P \mid pmtn, r_j, \tilde{d}_j \mid$ with $R = 2$ identical processors and three tasks: $p = (2, 2, 2)$, $r = (0, 0, 0)$, $\tilde{d} = (2, 2, 4)$.
(i) Formulate the instance as a Maximum flow problem and decide whether a feasible preemptive schedule exists.
(ii) Now change $\tilde{d}_3$ from $4$ to $2$. Decide again and, if no schedule exists, give a certificate.
Miniaturní instance na procvičení celé pipeline — a hlavně druhé větve kritéria: co přesně odpovíš, když tok $\sum p_j$ nedosáhne.
(i) Body $\{0,2,4\}$ → dva intervaly. Nakresli síť a zkus zdrojové hrany nasytit. (ii) Po změně zbude jediný interval — porovnej, kolik práce do něj musí a kolik se tam vejde; pak to řekni jazykem řezu.
(i) Body $\{r_j\}\cup\{\tilde d_j\} = \{0,2,4\}$ → intervaly $I_{0,2}$ (délka 2) a $I_{2,4}$ (délka 2). Hrany: $T_1, T_2 \to I_{0,2}$; $T_3 \to I_{0,2}, I_{2,4}$. Kapacity: $s\to T_j$: 2, 2, 2; úloha→interval: délka = 2 všude; intervaly→$t$: $2\cdot 2 = 4$ a $4$.
Max flow: $T_1 = T_2 = 2$ do $I_{0,2}$ (nasytí jeho stokovou hranu na 4), $T_3 = 2$ do $I_{2,4}$. $|f| = 6 = \sum p_j$ → rozvrh existuje. Dekódování: $P^1$: $T_1\,[0,2]$, $T_3\,[2,4]$; $P^2$: $T_2\,[0,2]$.
(ii) Teď $\tilde d = (2,2,2)$: body $\{0,2\}$, jediný interval $I_{0,2}$, všechny tři úlohy vedou jen do něj. Max flow: do stoku vede jediná hrana s kapacitou $2 \cdot 2 = 4$, takže $|f| \le 4 < 6 = \sum p_j$ → rozvrh neexistuje. Certifikát = řez $A = \{s, T_1, T_2, T_3, I_{0,2}\}$ s kapacitou 4 (jediná hrana $I_{0,2} \to t$): v okně $\langle 0,2\rangle$ je předepsáno 6 jednotek práce, ale 2 procesory za 2 jednotky času nabídnou jen 4. Slovně přesně to, co by sis řekl selským rozumem — řez to jen říká certifikovaně [L4.4].
Příště začneme stavět hlavní příběh kapitoly: precedence a temporální omezení mezi úlohami a jejich graf — a nad nimi pak time-indexed ILP a celá rodina rozvrhovacích algoritmů, kterou na konci shrne referenční tabulka [L5.14].