Bitdefender provides cybersecurity solutions with leading security efficacy, performance and ease of use to small and medium businesses, mid-market enterprises and consumers. Guided by a vision to be the world’s most trusted cybersecurity solutions provider, Bitdefender is committed to defending organizations and individuals around the globe against cyberattacks to transform and improve their digital experience.
În acest laborator vom introduce contextul pentru maximum flow problem și vom studia algoritmi care pot rezolva această problemă.
Vă rugăm să parcugeți Maximum flow problem pentru a vă familiariza cu contextul, problema și notațiile folosite.
Concepte necesare:
Pentru maximum flow problem există mai mulți algoritmi, dintre care amintim:
Puteți consulta capitolul Maximum Flow din Introduction to Algorithms [0] pentru mai multe detalii despre acești algoritmi.
În acest laborator vom studia și analiza metoda Ford-Fulkerson, apoi vom implementa algoritmul Edmonds-Karp (care este o optimizare peste Ford-Fulkerson).
Algoritmul lui Lester Randolph **Ford** Jr. și Delbert Ray **Fulkerson**, cunoscut ca și algoritmul / metoda Ford-Fulkerson este un algoritm greedy pentru calcularea fluxului maxim într-o rețea de transport.
Atât timp cât în graf încă există drumuri de ameliorare (augmenting paths), înseamnă că mai putem adauga flux in rețea prin acele drumuri. La fiecare pas alegem un drum de ameliorare, prin care adăugăm cantitatea maximă posibilă de flux.
În practică NU vom folosi direct metoda Ford-Fulkerson, ci vom folosi algoritmul Edmonds-Karp, pe care îl vom analiza în secțiunea următoare.
Algoritmul lui Jack **Edmonds** și Richard M. **Karp**, cunoscut ca și algoritmul Edmonds-Karp reprezintă o implementare concretă a metodei Ford-Fulkerson. Acest algoritm rezolvă problema drumurilor de ameliorare folosind BFS - adică drumul cel mai scurt (ca și număr de arce), pe care se poate merge ținând cont de restricția de capacitate ($f(u, v) \lt c(u, v)$).
// apply Edmonds-Karp's algorithm for computing maximum flow in network G // // nodes = list of all nodes from G // adj[node] = the adjacency list of node // example: adj[node] = {..., neigh, ...} => edge (node, neigh) // S = source in network G // T = sink in network G // f = flow in network G // c = capacity in network G // // returns: maxFlow (maximum flow in G from S to T) // Edmonds-Karp(G=(nodes, adj), S, T) { // STEP 0: initialize // * flow in network foreach (u in nodes) { foreach(v in nodes) { f[u][v] = 0; } } // * maximum total flow totalFlow = 0; // STEP 1: Start BFS for finding augmenting path(s). while (BFS finds at least one augmenting path in G) { // STEP 2.1: Compute residual capacity of augmenting path. rc = +oo; // residual capacity foreach ((u, v) in path) { rc = min(rc, c[ u ][ v ] - f[ u ][ v ]); } // STEP 2.2: Update flow on path with rc. foreach ((u, v) in path) { f[ u ][ v ] += rc; // Increase on edge (u, v). f[ v ][ u ] -= rc; // Decrease on edge (v, u). } // STEP 2.3: Update total flow. totalFlow += rc; } return totalFlow; } // Usage example: maxFlow = Edmonds-Karp(G=(nodes, adj), S, T); // Use maxFlow.
Algoritmul Edmons-Karp pornește o parcurgere BFS la fiecare pas. Pentru un drum de ameliorare găsit, calculează capacitatea reziduală a acestuia, apoi crește corespunzător fluxul pe acesta.
La fiecare pas, atunci când se crește fluxul pe un arc, se scade fluxul pe arcul invers (vom demonstra într-o subsecțiune viitoare necesitatea acestui pas pentru corectitudinea algoritmului).
Algoritmul se oprește când nu mai există drumuri de ameliorare. Fluxul pompat până atunci în rețea este maxim.
Fluxul maxim calculat cu Edmonds-Karp pentru rețeaua atașată este: 2.
Drumurile de ameliorare folosite sunt:
În această secțiune vom exemplifica de ce doar simpla incrementare a fluxului pe arcele directe nu este suficientă pentru a găsi fluxul maxim în rețea. Următoarea secțiunea conține soluția.
În această secțiune vom arăta ce face algoritmul pas cu pas și vom observa necesitatea și corectitudinea scăderii fluxului pe arcele inverse.
Pornim de la rețeaua din figura următoare:
n = 6
, m = 7
S = 1
, iar terminalul este T = 6
.c
are valorile din figură.Să vedem în continuare la ce ne ajută dacă alegem din nou, ghinionist, drumul de amelioarare $1 - 2 - 5 - 6$ și dacă de data aceasta putem corecta. Vom face acțiunile marcate în figura următoare:
Vom face acțiunile marcate în figura următoare:
Să observăm că starea finală a rețelei conține 2 unități de flux. Dacă ne uităm cu atenție, observăm că avem o unitate de flux pe drumul $1 - 2 - 4 - 6$ și alta pe $1 - 3 - 5 - 6$.
Deși Edmonds-Karp nu a ales inițial aceste 2 drumuri, s-a corectat pe parcurs, iar în final, dacă fluxul maxim trebuia să treacă pe aici, rețeaua reziduală a fost actualizată / corectată până s-a întâmplat acest lucru!
Semnificația înaintării pe un arc fictiv este că defapt cautăm să deviem fluxul de pe un drum ales anterior (de exemplu, $1 - 2 - 5 - 6$), pe o altă cale (de exemplu, porțiunea $1 - 2$ să se continue cu $2 - 4 - 6$), astfel încât să putem folosi partea eliberată (de exemplu, $5 - 6$), în construcția unui nou drum la pasul curent.
Scheletul de laborator se găsește pe pagina pa-lab::skel/lab12.
Înainte de a rezolva exercițiile, asigurați-vă că ați citit și înțeles toate precizările din secțiunea Precizari laboratoare 07-12.
Prin citirea acestor precizări vă asigurați că:
Se dă un graf orientat cu n noduri și m arce. Graful are pe arce capacitati pozitive.
Folosiși Edmonds-Karp pentru a găsi fluxul maxim între nodul sursă 1 și nodul destinație n în graful dat.
Restricții și precizări:
1s
2s
Rezultatul se va returna sub forma unui singur număr, reprezentând fluxul maxim ce poate fi trimis prin rețea.
La acest laborator, asistentul va alege 1-2 probleme din secțiunea extra.
[0] Chapter Maximum Flow, “Introduction to Algorithms”, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein.
[1] Maximal flow through a network, L.R. Ford, D.R. Fulkerson
[2] Theoretical improvements in algorithmic efficiency for network flow problems, Edmonds, Jack; Karp, Richard M.
[3] Dinitz Algorithm, Yefim Dinitz