Ford-Fulkerson - algoritmi ratkaisee ongelman löytää maksimivirtaus liikenneverkossa .
Algoritmin idea on seuraava. Virtausarvoksi asetetaan aluksi 0: kaikille . Virtauksen määrää lisätään sitten iteratiivisesti etsimällä lisäyspolkua (polku lähteestä nieluun, jota pitkin voidaan lähettää lisää virtausta). Prosessi toistetaan, kunnes lisäyspolku löytyy.
On tärkeää, että algoritmi ei määritä tarkasti, mitä polkua etsimme vaiheessa 2 tai miten teemme sen. Tästä syystä algoritmin on taattu konvergoivan vain kokonaislukukaistanleveydillä, mutta jopa niillä suurilla kaistanleveyksillä se voi toimia hyvin pitkään. Jos kapasiteetit ovat todellisia, algoritmi voi toimia loputtomiin konvergoimatta optimaaliseen ratkaisuun (katso esimerkki alla ).
Jos et etsi mitä tahansa polkua, vaan lyhimmän, saat Edmonds-Karp- algoritmin tai Dinits-algoritmin . Nämä algoritmit konvergoivat kaikille todellisille painoille ajallisesti ja vastaavasti.
Annettu kaavio kapasiteetilla ja virtauksella reunoille välillä - . On tarpeen löytää suurin virtaus lähteestä pesualtaaseen . Algoritmin jokaisessa vaiheessa pätevät samat ehdot kuin kaikille virroille:
Jäljellä oleva verkko on verkko, jossa on kaistanleveys ja jossa ei ole virtaa.
Tulokaavio kaistanleveydellä , lähteellä ja nielulla Lähtö Maksimivirtaus välillä -
Polku voidaan löytää esimerkiksi leveyshaulla ( Edmonds-Karp -algoritmi ) tai syvyyshaulla .
Algoritmi lisää jokaisessa vaiheessa täydentävän polkuvirran olemassa olevaan virtaan. Jos kaikkien reunojen kapasiteetit ovat kokonaislukuja, on helppo osoittaa induktiolla, että kaikkien reunojen läpi kulkevat virrat ovat aina kokonaislukuja. Siksi jokaisessa vaiheessa algoritmi lisää virtausta vähintään yhdellä, joten se konvergoi korkeintaan vaiheissa, missä f on kaavion maksimivirtaus. Jokainen vaihe on mahdollista suorittaa ajassa , missä on graafin reunojen määrä, jolloin algoritmin kokonaisajoaika on rajoitettu .
Jos ainakin yhden reunan kapasiteetti on irrationaalinen luku, niin algoritmi voi toimia loputtomiin, ilman että se välttämättä konvergoi oikeaan ratkaisuun. Alla on esimerkki.
Tarkastellaan oikealla näkyvää verkkoa, jossa lähde , nielu , reunakapasiteetit , ja kaikkien muiden reunojen kapasiteetti on yhtä suuri kuin kokonaisluku . Vakio valitaan siten, että . Käytämme polkuja taulukossa esitetystä jäännöskaaviosta ja , ja .
Vaihe | Löytyi polku | Lanka lisätty | Jäljellä olevat kapasiteetit | ||
---|---|---|---|---|---|
0 | |||||
yksi | |||||
2 | |||||
3 | |||||
neljä | |||||
5 |
Huomaa, että vaiheen 1 jälkeen sekä vaiheen 5 jälkeen reunojen jäännöskyvyt , ja niillä on muoto , ja vastaavasti joillekin luonnollisille . Tämä tarkoittaa, että voimme käyttää lisäyspolkuja , , ja äärettömän monta kertaa, ja näiden reunojen jäännöskapasiteetti on aina samassa muodossa. Kokonaisvirtaus vaiheen 5 jälkeen on . Äärettömässä ajassa kokonaisvirtaus konvergoi arvoon , kun taas maksimivirtaus on . Siten algoritmi ei vain toimi loputtomiin, vaan ei edes konvergoi optimaaliseen ratkaisuun. [yksi]
Seuraava esimerkki näyttää Ford-Fulkerson-algoritmin ensimmäiset vaiheet kuljetusverkossa, jossa on neljä solmua, lähde A ja nielu D. Tämä esimerkki osoittaa pahimman tapauksen. Käytettäessä leveyshakua algoritmi tarvitsee vain 2 vaihetta.
Polku | Kaistanleveys | Tulos |
---|---|---|
Alkuperäinen liikenneverkko | ||
1998 askeleen jälkeen... | ||
Kohdeverkko |