Algoritmul Ford-Fulkerson rezolvă problema găsirii debitului maxim într-o rețea de transport .
Ideea algoritmului este următoarea. Valoarea debitului este setată inițial la 0: pentru toate . Cantitatea de flux este apoi crescută iterativ prin căutarea unei căi de creștere (o cale de la sursă la chiuvetă de -a lungul căreia poate fi trimis mai mult flux). Procesul se repetă până când poate fi găsită o cale de creștere.
Este important ca algoritmul să nu specifice exact ce cale căutăm în pasul 2 sau cum o facem. Din acest motiv, algoritmul este garantat să converge doar pentru lățimi de bandă întregi, dar chiar și pentru acestea, pentru lățimi de bandă mari, poate rula foarte mult timp. Dacă capacitățile sunt reale, algoritmul poate rula la nesfârșit fără a converge la soluția optimă (vezi exemplul de mai jos ).
Dacă nu căutați nicio cale, ci cea mai scurtă, obțineți algoritmul Edmonds-Karp sau algoritmul Dinits . Acești algoritmi converg pentru orice ponderi reale în timp și respectiv.
Dat un grafic cu capacitate și debit pentru muchiile de la până la . Este necesar să se găsească debitul maxim de la sursă la chiuvetă . La fiecare pas al algoritmului, se aplică aceleași condiții ca pentru toate fluxurile:
Rețeaua reziduală este o rețea cu lățime de bandă și fără flux.
Grafic de intrare cu lățimea de bandă , sursă și receptor Ieșire Debit maxim de la la
Calea poate fi găsită, de exemplu, prin căutare pe lățimea întâi ( algoritmul Edmonds-Karp ) sau căutarea pe adâncime în .
La fiecare pas, algoritmul adaugă un flux de cale de creștere fluxului existent. Dacă capacitățile tuturor muchiilor sunt numere întregi, este ușor de demonstrat prin inducție că fluxurile prin toate muchiile vor fi întotdeauna numere întregi. Prin urmare, la fiecare pas, algoritmul mărește debitul cu cel puțin unu, deci va converge în cel mult pași, unde f este debitul maxim din grafic. Este posibil să finalizați fiecare pas în timp , unde este numărul de muchii din grafic, apoi timpul total de rulare al algoritmului este limitat .
Dacă capacitatea a cel puțin uneia dintre muchii este un număr irațional, atunci algoritmul poate rula la nesfârșit, fără a converge neapărat către soluția corectă. Un exemplu este dat mai jos.
Luați în considerare rețeaua afișată în dreapta, cu capacități sursă , canalizare , margini și capacitatea tuturor celorlalte margini egală cu un număr întreg . Constanta este aleasă astfel încât . Folosim căile din graficul rezidual dat în tabel și , și .
Etapa | Calea găsită | S-a adăugat thread | Capacități reziduale | ||
---|---|---|---|---|---|
0 | |||||
unu | |||||
2 | |||||
3 | |||||
patru | |||||
5 |
Rețineți că după pasul 1, precum și după pasul 5, abilitățile reziduale ale muchiilor , și au forma , și , respectiv, pentru unele naturale . Aceasta înseamnă că putem folosi căile de creștere , , și de nenumărate ori, iar capacitatea reziduală a acestor margini va fi întotdeauna în aceeași formă. Debitul total după pasul 5 este . În timp infinit, debitul total va converge spre , în timp ce debitul maxim este . Astfel, algoritmul nu numai că rulează pe termen nelimitat, dar nici măcar nu converge către soluția optimă. [unu]
Următorul exemplu prezintă primii pași ai algoritmului Ford-Fulkerson într-o rețea de transport cu patru noduri, sursa A și canal D . Acest exemplu arată cel mai rău caz. Când utilizați căutarea pe lățime, algoritmul are nevoie de doar 2 pași.
cale | Lățimea de bandă | Rezultat |
---|---|---|
Rețeaua de transport inițială | ||
După pașii din 1998... | ||
Rețeaua de destinație |