Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pa:tmp:dn:maximum-flow-problem [2022/05/23 10:20]
darius.neatu
pa:tmp:dn:maximum-flow-problem [2022/05/23 10:20] (current)
darius.neatu
Line 1: Line 1:
-Maximum flow problem+====== ​Maximum flow problem ​======
  
-## Importanţă – aplicaţii practice+===== Importanţă – aplicaţii practice ​=====
  
 Algoritmii pentru determinarea unui flux maxim în rețele de trasnsport au multiple aplicații practice. Câteva exemple de aplicații sunt: Algoritmii pentru determinarea unui flux maxim în rețele de trasnsport au multiple aplicații practice. Câteva exemple de aplicații sunt:
  
-* Modelarea unei rețele de transport (canalizare,​ curent, petrol etc).+  ​* Modelarea unei rețele de transport (canalizare,​ curent, petrol etc). 
 +  * Planificarea zborurilor pentru avioane. 
 +  * Segmentarea imaginilor. 
 +  * Calcul clasamente (de exemplu, la baseball).
  
-* Planificarea zborurilor pentru avioane.+===== Maximum flow problem =====
  
-Segmentarea imaginilor.+Puteți consulta capitolul ​**Maximum Flow** [0] pentru mai multe definiții formale. Această secțiune sumarizează principalele notații folosite în laboratoarele de PA.
  
-* Calcul clasamente (de exemplula baseball).+Cele mai uzuale notații din laboratoarele ​de grafuri sunt descrise în [[https://​ocw.cs.pub.ro/​courses/​pa/​skel_graph|Precizări laboratoare 07-12]] (ex. $n$, $m$, $adj$, $adj\_trans$,​ $(x, y)$etc).
  
-## Maximum flow problem+Vom adăuga alte notații în continuarea celor introduse anterior.
  
-Puteți consulta capitolul **Maximum Flow** [0] pentru mai multe definiții formale. Această secțiune sumarizează principalele notații folosite în laboratoarele de PA. 
  
-Cele mai uzuale notații din laboratoarele de grafuri sunt descrise în [Precizări laboratoare 07-12](https://​ocw.cs.pub.ro/​courses/​pa/​skel_graph) (ex. $n$, $m$, $adj$, $adj\_trans$,​ $(x, y)$, etc). 
  
-Vom adăuga alte notații în continuarea celor introduse anterior.+> **Rețea de transport** / **flow network**: Este un graf orientat $G = (V, E)$ care respectă următoarele 3 proprietăți:​ 1) există două noduri speciale **S** (numit **sursă** / **source**) și **T** (numit **terminal** / **destinație** / **sink**); 2) există o funcție de capacitate $c: V x V -> R_{+}$ astfel încât $c(u, v) >= 0$ dacă arcul $(u, v)$ există, altfel $c(u, v) = 0$; 3) pentru orice nod $v \in V \setminus \{S, T\}$ există cel puțin o cale $S -> ... -> v -> ... T$.
  
->>>​ **Rețea de transport** / **flow network**: Este un graf orientat $G = (V, E)$ care respectă următoarele 3 proprietăți:​ 1) există două noduri speciale **S** (numit **sursă** / **source**) și **T** (numit **terminal** / **destinație** / **sink**); 2) există o funcție de capacitate $c: V x V -> R_{+}$ astfel încât $c(u, v) >= 0$ dacă arcul $(u, v)$ există, altfel $c(u, v) = 0$; 3) pentru orice nod $v \in V \setminus \{S, T\}$ există cel puțin o cale $S -> ... -> v -> ... T$. 
  
 <​note>​ <​note>​
 +
 Într-o rețea avem 2 noduri speciale. Vom vedea că S joacă rol de producător,​ iar T de consumator. Într-o rețea avem 2 noduri speciale. Vom vedea că S joacă rol de producător,​ iar T de consumator.
  
 În plus, pentru simplitate, vom dori ca în graf să nu avem **self-loops**. În plus, pentru simplitate, vom dori ca în graf să nu avem **self-loops**.
  
-Tot pentru simplitate, în continuare vom discuta despre rețele în care capacitățile sunt numere **naturale**. ​+Tot pentru simplitate, în continuare vom discuta despre rețele în care capacitățile sunt numere **naturale**. 
 </​note>​ </​note>​
  
Line 37: Line 39:
 În exemplul atașat, avem o **rețea de transport** cu următoare configurație:​ În exemplul atașat, avem o **rețea de transport** cu următoare configurație:​
  
-`n = 7``m = 11` +  ​''​%%n = 7%%''​''​%%m = 11%%''​ 
-* Sursa este `S = 1`, iar terminalul este `T = 7`.  +  * Sursa este ''​%%S = 1%%''​, iar terminalul este ''​%%T = 7%%''​
-* Funcția de capacitate ​`care următorele valori: +  * Funcția de capacitate ​''​%%c%%'' ​are următorele valori: 
-  * $c[1][2] = 3$ +    * $c[1][2] = 3$ 
-  * $c[1][3] = 2$ +    * $c[1][3] = 2$ 
-  * $c[1][4] = 5$ +    * $c[1][4] = 5$ 
-  * $c[2][5] = 2$ +    * $c[2][5] = 2$ 
-  * $c[2][6] = 1$ +    * $c[2][6] = 1$ 
-  * $c[3][6] = 5$ +    * $c[3][6] = 5$ 
-  * $c[4][6] = 1$ +    * $c[4][6] = 1$ 
-  * $c[4][7] = 10$ +    * $c[4][7] = 10$ 
-  * $c[5][6] = 1$ +    * $c[5][6] = 1$ 
-  * $c[5][7] = 1$ +    * $c[5][7] = 1$ 
-  * $c[6][7] = 3$+    * $c[6][7] = 3$
  
-</​spoiler>​+</​spoiler> ​\\
  
->>> **Flux** / **flow**: O funcție $f: V x V -> R$ se numește funcție de flux într-o rețea de transport $G = (V, E)$ dacă respectă următoarele 3 proprietăți:​ 1) **restricție de capacitate** - $f(u, v) \leq c(u, v), \forall u,v \in V$; 2) **antisimetrie** - $f(u, v) = - f(v, u), \forall u,v \in V$; 3) **conservare** - $\sum f(u, v) = 0, \forall u \in V \ {S, T}, \forall v \in V$.+ 
 + 
 + 
 +> **Flux** / **flow**: O funcție $f: V x V -> R$ se numește funcție de flux într-o rețea de transport $G = (V, E)$ dacă respectă următoarele 3 proprietăți:​ 1) **restricție de capacitate** - $f(u, v) \leq c(u, v), \forall u,v \in V$; 2) **antisimetrie** - $f(u, v) = - f(v, u), \forall u,v \in V$; 3) **conservare** - $\sum f(u, v) = 0, \forall u \in V \ {S, T}, \forall v \in V$.
  
 <spoiler Exemplu> <spoiler Exemplu>
Line 62: Line 67:
 În exemplul atașat, avem o **rețea de transport** cu următoare configurație:​ În exemplul atașat, avem o **rețea de transport** cu următoare configurație:​
  
-`n = 7``m = 11` +  ​''​%%n = 7%%''​''​%%m = 11%%''​ 
-* Sursa este `S = 1`, iar terminalul este `T = 7`.  +  * Sursa este ''​%%S = 1%%''​, iar terminalul este ''​%%T = 7%%''​
-* Funcțiile de capacitate ​`cși flux `fau valorile din figură. Exemple: +  * Funcțiile de capacitate ​''​%%c%%'' ​și flux ''​%%f%%'' ​au valorile din figură. Exemple: 
-  * Arcul $(1, 2)$ are capacitatea $c(1, 2) = 3$ și fluxul curent pe acesta este $f(1, 2) = 1$. Pe desen notăm **1/3**. +    * Arcul $(1, 2)$ are capacitatea $c(1, 2) = 3$ și fluxul curent pe acesta este $f(1, 2) = 1$. Pe desen notăm **1/3**. 
-  * Arcul $(3, 6)$ are capacitatea $c(3, 6) = 5$ și fluxul curent pe acesta este $f(3, 6) = 2$. Pe desen notăm **2/5**. +    * Arcul $(3, 6)$ are capacitatea $c(3, 6) = 5$ și fluxul curent pe acesta este $f(3, 6) = 2$. Pe desen notăm **2/5**. 
-  * Arcul $(4, 7)$ are capacitatea $c(4, 7) = 10$ și fluxul curent pe acesta este $f(4, 7) = 3$. Pe desen notăm **3/10**.+    * Arcul $(4, 7)$ are capacitatea $c(4, 7) = 10$ și fluxul curent pe acesta este $f(4, 7) = 3$. Pe desen notăm **3/10**. 
 + 
 +</​spoiler>​ \\ 
  
-</​spoiler>​ 
  
 <​note>​ <​note>​
 +
 Operațiunea prin care vom aplica o anumită funcție de flux pe o rețea de transport se numește **pompare**:​ pompăm flux prin rețea / pe arcele acesteia, dinspre sursa S spre terminalul T. Operațiunea prin care vom aplica o anumită funcție de flux pe o rețea de transport se numește **pompare**:​ pompăm flux prin rețea / pe arcele acesteia, dinspre sursa S spre terminalul T.
  
 Observăm că fluxul (valorile funcției) nu este unic! Observăm că fluxul (valorile funcției) nu este unic!
 +
  
 </​note>​ </​note>​
  
->>>​ **Flux maxim** / **maximum flow**: Este o funcție de flux $f_{max}$ pentru care cantitatea de flux pompată în rețea este **maximă** posibil. 
  
-<spoiler Exemplu> + 
-Analizăm rețeaua dată în anterior exemplul.+> **Flux maxim** / **maximum flow**: Este o funcție de flux $f_{max}$ pentru care cantitatea de flux pompată în rețea este **maximă** posibil. 
 + 
 +<spoiler Exemplu> Analizăm rețeaua dată în anterior exemplul.
  
 {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-flow-example.png?​512| Exemplu}} {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-flow-example.png?​512| Exemplu}}
Line 89: Line 99:
 Observăm că pe drumurile $1 -> 4 -> 7$ / $1 -> 3 -> 6- > 7$ se mai poate pompa flux în plus. Deducem atunci că funcția de flux din figura anterioară nu reprezintă flux maxim! Observăm că pe drumurile $1 -> 4 -> 7$ / $1 -> 3 -> 6- > 7$ se mai poate pompa flux în plus. Deducem atunci că funcția de flux din figura anterioară nu reprezintă flux maxim!
  
-Un exemplu de flux maxim găsim în figura următoare: +Un exemplu de flux maxim găsim în figura următoare: {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-maximum-flow-example.png?​512| Exemplu}}
-{{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-maximum-flow-example.png?​512| Exemplu}}+
  
 Fluxul total care circulă prin rețea de la sursă la terminal este $f = 1 + 3 + 5 = 9$. Acesta este și maxim! Cum ne dăm seama? Observăm ca suma tuturor capacităților arcelor care ies din S este $3 + 2 + 5 = 10$. Arcele $(1, 2)$ și $(1, 4)$ sun saturate (nu se mai poate pompa flux în plus). Dacă s-ar pompa flux în plus prin $(1, 3)$, apoi prin $(3, 6)$, deoarece arcul $(6, 7)$ este și el saturată, atunci nu putem ajunge la destinație,​ deci nici nu putem mări fluxul în rețea. Fluxul total care circulă prin rețea de la sursă la terminal este $f = 1 + 3 + 5 = 9$. Acesta este și maxim! Cum ne dăm seama? Observăm ca suma tuturor capacităților arcelor care ies din S este $3 + 2 + 5 = 10$. Arcele $(1, 2)$ și $(1, 4)$ sun saturate (nu se mai poate pompa flux în plus). Dacă s-ar pompa flux în plus prin $(1, 3)$, apoi prin $(3, 6)$, deoarece arcul $(6, 7)$ este și el saturată, atunci nu putem ajunge la destinație,​ deci nici nu putem mări fluxul în rețea.
  
-</​spoiler>​+</​spoiler> ​\\
  
->>>​ **Capacitate reziduală** / **residual capacity**: Diferența între capacitatea arcului și valoarea fluxului curent care este pompat prin acesta - $c_R(u, v) = c(u, v) - f(u, v)$. 
  
->>>​ **Rețea reziduală** / **residual network**: O rețea reziduală pentru $G = (V, E)$ după ce s-a pompat fluxul $f$, este rețeaua $G_R = (V, E_R)$, în care păstrăm doar muchiile pe care încă se mai poate crește cantitatea de flux - $E_R = \{(u, v) \in E |  c_R(u)(v) > 0\}$. 
  
->>>​ **Drum de ameliorare** / **augmenting path**: ​ Este un drum $S -> ... -> T$ în rețeaua reziduală $G_R$ (practic este un drum pe care încă se mai poate pompa flux în plus). 
  
->>>​ **Capacitate reziduală a unui drum de ameliorare** / **residual capacity of augmenting path**: ​ Este capacitatea minimă reziduală a unui arc de pe drum **p** - $c_R(p) = min(\{c_R(u,​ v) | (u, v) \ \in \ p\})$.+**Capacitate reziduală** / **residual capacity**: Diferența între capacitatea arcului și valoarea fluxului curent care este pompat prin acesta - $c_R(u, v) = c(u, v) - f(u, v)$. 
 + 
 + 
 + 
 +**Rețea reziduală** / **residual network**: O rețea reziduală pentru $G = (V, E)$ după ce s-a pompat fluxul $f$, este rețeaua $G_R = (V, E_R)$, în care păstrăm doar muchiile pe care încă se mai poate crește cantitatea de flux - $E_R = \{(u, v) \in E | c_R(u)(v) > 0\}$. 
 + 
 + 
 + 
 +> **Drum de ameliorare** / **augmenting path**: Este un drum $S -> ... -> T$ în rețeaua reziduală $G_R$ (practic este un drum pe care încă se mai poate pompa flux în plus). 
 + 
 + 
 + 
 +> **Capacitate reziduală a unui drum de ameliorare** / **residual capacity of augmenting path**: Este capacitatea minimă reziduală a unui arc de pe drum **p** - $c_R(p) = min(\{c_R(u,​ v) | (u, v) \ \in \ p\})$.
  
 <spoiler Exemplu> <spoiler Exemplu>
Line 110: Line 128:
 În exemplul atașat, avem o **rețea de transport** cu următoarea configurație:​ În exemplul atașat, avem o **rețea de transport** cu următoarea configurație:​
  
-`n = 7``m = 11` +  ​''​%%n = 7%%''​''​%%m = 11%%''​ 
-* Sursa este `S = 1`, iar terminalul este `T = 7`.  +  * Sursa este ''​%%S = 1%%''​, iar terminalul este ''​%%T = 7%%''​
-* Funcțiile de capacitate ​`cși flux `fau valorile din figură.+  * Funcțiile de capacitate ​''​%%c%%'' ​și flux ''​%%f%%'' ​au valorile din figură.
  
 Descriere rețea: Descriere rețea:
  
-* Inițial, fluxul are valorile 0 peste tot în rețea. +  ​* Inițial, fluxul are valorile 0 peste tot în rețea. 
- +  * Enumerăm toate **drumurile de ameliorare** din rețeaua curentă: 
-* Enumerăm toate **drumurile de ameliorare** din rețeaua curentă: +    * $1 - 2 - 5 - 10$: capacitatea sa reziduală este valoarea minimă dintre $3 - 0, 2 - 0, 1 - 0$, adică **1** (pe acest drum se mai poate pompa în plus o unitate de flux). 
-  * $1 - 2 - 5 - 10$: capacitatea sa reziduală este valoarea minimă dintre $3 - 0, 2 - 0, 1 - 0$, adică **1** (pe acest drum se mai poate pompa în plus o unitate de flux). +    * $1 - 2 - 5 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $3 - 0, 2 - 0, 1 - 0, 3 - 0$, adică **1** (pe acest drum se mai poate pompa în plus o unitate de flux). 
-  * $1 - 2 - 5 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $3 - 0, 2 - 0, 1 - 0, 3 - 0$, adică **1** (pe acest drum se mai poate pompa în plus o unitate de flux). +    * $1 - 2 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $3 - 0, 1 - 0, 3 - 0$, adică **1** (pe acest drum se mai poate pompa în plus o unitate de flux). 
-  * $1 - 2 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $3 - 0, 1 - 0, 3 - 0$, adică **1** (pe acest drum se mai poate pompa în plus o unitate de flux). +    * $1 - 3 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $2 - 0, 5 - 0, 3 - 0$, adică **2** (pe acest drum se mai poate pompa în plus încă 2 unități de flux). 
-  * $1 - 3 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $2 - 0, 5 - 0, 3 - 0$, adică **2** (pe acest drum se mai poate pompa în plus încă 2 unități de flux). +    * $1 - 4 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $5 - 0, 1 - 0, 3 - 0$, adică **1** (pe acest drum se mai poate pompa în plus încă o unitate de flux). 
-  * $1 - 4 - 6 - 10$: capacitatea sa reziduală este valoarea minimă dintre $5 - 0, 1 - 0, 3 - 0$, adică **1** (pe acest drum se mai poate pompa în plus încă o unitate de flux). +    * $1 - 4 - 10$: capacitatea sa reziduală este valoarea minimă dintre $5 - 0, 10 - 0$, adică **5** (pe acest drum se mai poate pompa în plus încă 5 unități de flux).
-  * $1 - 4 - 10$: capacitatea sa reziduală este valoarea minimă dintre $5 - 0, 10 - 0$, adică **5** (pe acest drum se mai poate pompa în plus încă 5 unități de flux).+
  
 **Alegem** drumul $1 - 4 - 7$ pe care pompăm **5** unități de flux. Muchia $(1, 4)$ devinde saturată (**5/5** - capacitate reziduală **5 - 5 = 0**, prin urmare o putem șterge din rețea). Obținem rețeaua reziduală din figura următoare: **Alegem** drumul $1 - 4 - 7$ pe care pompăm **5** unități de flux. Muchia $(1, 4)$ devinde saturată (**5/5** - capacitate reziduală **5 - 5 = 0**, prin urmare o putem șterge din rețea). Obținem rețeaua reziduală din figura următoare:
  
 {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-residual-network-02.png?​512| Exemplu}} {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-residual-network-02.png?​512| Exemplu}}
- 
  
 Următorul drum de ameliorare ales este $1 - 3 - 6 - 7$, pe care pompăm în plus **2** unități de flux. Obținem următoarea rețea reziduală: Următorul drum de ameliorare ales este $1 - 3 - 6 - 7$, pe care pompăm în plus **2** unități de flux. Obținem următoarea rețea reziduală:
Line 138: Line 154:
  
 {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-residual-network-04.png?​512| Exemplu}} {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-residual-network-04.png?​512| Exemplu}}
- 
  
 Procedeul poate continua. Pe pagina laboratorului 12 se va studia un algoritm care arată concret cum să alegem drumurile de ameliorare pentru ca la final să fim siguri că fluxul pompat în rețea este maxim. Procedeul poate continua. Pe pagina laboratorului 12 se va studia un algoritm care arată concret cum să alegem drumurile de ameliorare pentru ca la final să fim siguri că fluxul pompat în rețea este maxim.
  
-</​spoiler>​+</​spoiler> ​\\
  
  
-## [Studiu de caz] k surse / p destinații+===== [Studiu de caz] k surse / p destinații ​=====
  
 **Maximum flow problem** se poate existe considerând **k** surse și **p** destinații în aceeași rețea **G**. Scopul este ca să se transporte o cantitate maximă de flux total de la sursele $S_1, S_2, ... S_k$ la terminalele $T_1, T_2, ..., T_p$. **Maximum flow problem** se poate existe considerând **k** surse și **p** destinații în aceeași rețea **G**. Scopul este ca să se transporte o cantitate maximă de flux total de la sursele $S_1, S_2, ... S_k$ la terminalele $T_1, T_2, ..., T_p$.
Line 155: Line 170:
 {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-multiple-sources-sinks.png?​512| Exemplu}} {{https://​ocw.cs.pub.ro/​courses/​_media/​pa/​new_pa/​lab12-multiple-sources-sinks.png?​512| Exemplu}}
  
-În exemplul atașat, avem o **rețea de transport** cu k surse și p terminale. Putem simplifica această problemă construind o rețea **G'** astfel: +În exemplul atașat, avem o **rețea de transport** cu k surse și p terminale. Putem simplifica această problemă construind o rețea **G** astfel:
- +
-* Se adaugă un nod fictiv **S** pe care îl unim de fiecare dintre cele **k** surse inițiale prin arce de capacitate infinită (ca în figură). +
- +
-* Se adaugă un nod fictiv **T** pe care îl unim de fiecare dintre cele **p** terminale inițiale prin arce de capacitate infinită (ca în figură).+
  
-* În noua rețea **G'** considerăm o unică sursă **S** și un unic terminal **T**.+  * Se adaugă un nod fictiv **S** pe care îl unim de fiecare dintre cele **k** surse inițiale prin arce de capacitate infinită (ca în figură). 
 +  * Se adaugă un nod fictiv **T** pe care îl unim de fiecare dintre cele **p** terminale inițiale prin arce de capacitate infinită (ca în figură). 
 +  ​* În noua rețea **G** considerăm o unică sursă **S** și un unic terminal **T**. 
 +  * Aplicăm un algoritm de determinare flux maxim în rețeaua **G’**. Fluxul de pe arce de la finalul algoritmului va reprezenta flux maxim și în rețeaua inițială **G**.
  
-* Aplicăm un algoritm de determinare flux maxim în rețeaua **G'​**. Fluxul de pe arce de la finalul algoritmului va reprezenta flux maxim și în rețeaua inițială **G**. ​+</​spoiler>​ \\
  
-</​spoiler>​ 
  
-## Maximum flow: variants+===== Maximum flow: variants ​=====
  
 Există o variantă puțin modificată a problemei curente - dacă pe muchii avem pe lângă capacitate și un cost asociat? Există o variantă puțin modificată a problemei curente - dacă pe muchii avem pe lângă capacitate și un cost asociat?
Line 173: Line 186:
 În acest caz, ne interesează să găsim un **flux maxim de cost minim** (**maximum flow minimum cost**). Problema se rezolvă în mod similar - de exemplu, algoritmul Edmonds-Karp rămăne aproximativ același, dar în locul algoritmului BFS, folosește Dijkstra pentru a determina drumurile de ameliorare. În acest caz, ne interesează să găsim un **flux maxim de cost minim** (**maximum flow minimum cost**). Problema se rezolvă în mod similar - de exemplu, algoritmul Edmonds-Karp rămăne aproximativ același, dar în locul algoritmului BFS, folosește Dijkstra pentru a determina drumurile de ameliorare.
  
-## Referințe+===== Referințe ​=====
  
 [0] Chapters **Maximum Flow**, “Introduction to Algorithms”,​ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein. [0] Chapters **Maximum Flow**, “Introduction to Algorithms”,​ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein.
  
pa/tmp/dn/maximum-flow-problem.txt · Last modified: 2022/05/23 10:20 by darius.neatu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0