Ford-Fulkerson-algoritmi

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 29. huhtikuuta 2022 tarkistetusta versiosta . tarkastukset vaativat 3 muokkausta .

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.

Algoritmi

Epävirallinen kuvaus

  1. Nollaamme kaikki streamit. Jäljellä oleva verkko on aluksi sama kuin alkuperäinen verkko.
  2. Jäännösverkosta löydämme minkä tahansa polun lähteestä nieluon. Jos sellaista polkua ei ole, pysähdymme.
  3. Päästämme löydetyn polun (tätä kutsutaan kasvavaksi poluksi tai kasvavaksi ketjuksi ) läpi suurimman mahdollisen virtauksen:
    1. Jäännösverkon löydetyltä polulta etsimme reunaa, jonka kapasiteetti on minimi .
    2. Jokaiselle löydetyn polun reunalle lisäämme virtausta :lla ja vastakkaiseen suuntaan vähennämme sitä .
    3. Muokkaamme jäännösverkkoa. Laskemme uuden kapasiteetin kaikille löydetyn polun reunoille sekä niitä vastakkaisille (vastasuuntaisille) reunoille. Jos siitä tulee nollasta poikkeava, lisäämme jäännösverkkoon reunan, ja jos siitä tulee nolla, poistamme sen.
  4. Palaamme vaiheeseen 2.

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.

Muodollinen kuvaus

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ä -

  1. kaikille reunoille
  2. Niin kauan kuin on polku paikasta paikkaan siten , että kaikilla reunoilla :
    1. löytö
    2. Jokaiselle reunalle

Polku voidaan löytää esimerkiksi leveyshaulla ( Edmonds-Karp -algoritmi ) tai syvyyshaulla .

Vaikeus

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.

Esimerkki ei-konvergoivasta algoritmista

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]

Esimerkki

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

Katso myös

Linkit

Kirjallisuus

Muistiinpanot

  1. Zwick, Uri. Pienimmät verkot, joissa Ford- Fulkersonin maksimivirtausproseduuri ei välttämättä pääty  //  Tietojenkäsittelyteoria : päiväkirja. - 1995. - 21. elokuuta ( nide 148 , nro 1 ). - s. 165-170 . - doi : 10.1016/0304-3975(95)00022-O .