Edmonds-Karp-algoritmi ratkaisee ongelman löytää maksimivirtaus kuljetusverkossa . Algoritmi on Ford-Fulkersonin menetelmän erikoistapaus ja toimii ajassa kaaviossa . Neuvostoliiton tiedemies E. A. Dinitz julkaisi sen ensimmäisen kerran vuonna 1970 . Myöhemmin, vuonna 1972, Edmonds ja Karp löysivät sen itsenäisesti .
Edmonds-Karp- algoritmi on muunnos Ford-Fulkerson-algoritmista , jossa jokaisessa vaiheessa valitaan lyhin komplementaarinen polku jäännösverkossa (olettaen, että kullakin reunalla on yksikköpituus). Lyhin polku löytyy leveyshakulla .
Löytääksemme kaavion lyhimmän polun käytämme leveys ensin -hakua :
Edmonds-Karp-algoritmi löytää työn aikana jokaisen täydentävän polun ajassa . Alla todistetaan, että tämän algoritmin suorittamien virtauksen lisäysten kokonaismäärä on . Edmonds-Karp-algoritmin monimutkaisuus on siis .
Kutsutaan etäisyyttä kärjestä x kärkeen y lyhimmän polun pituudeksi x :stä y :ään residuaaliverkossa mitattuna reunojen lukumäärällä. Jos sellaista polkua ei ole, pidämme etäisyyttä äärettömänä. Sanotaan, että y on lähestynyt x :ää (poikennut x :stä ), jos etäisyys x :stä y :ään on pienentynyt (lisännyt). Sanotaan, että y on lähempänä x :ää (kauempana x :stä ) kuin z , jos etäisyys x :stä y :ään on pienempi (suurempi) kuin etäisyys x :stä z :hen .
Lemma . Algoritmin aikana mikään kärki ei koskaan lähesty lähdettä. Todiste . Älkää antako näin tapahtua, silloin kun virtaus lisääntyi, jotkut huiput lähestyivät lähdettä. Kutsutaan niitä väärin. Valitsemme yhden vääristä huipuista, joka virtauksen lisäämisen jälkeen osoittautui lähinnä lähdettä (jos niitä on enemmän kuin yksi, niin mikä tahansa). Merkitse valittu huippupiste v :llä . Tarkastellaan lyhintä polkua s :stä v :ään . Merkitse tämän polun toiseksi viimeistä kärkeä u :lla , joten polku näyttää tältä . Koska u on lähempänä s: tä kuin v ja v on lähin laiton kärki s :tä , u on säännöllinen kärki. Merkitään etäisyyksiä s :stä u :hin ja v :iin ennen virtauksen kasvua ja sen jälkeen vastaavasti , , , , , meillä on:
,missä
Siksi ennen virtauksen kasvua kaari ( u , v ) puuttui jäännösverkosta. Jotta se näkyisi, lisäyspolun piti sisältää kaari ( v , u ). Mutta Edmonds-Karp-algoritmissa lisäyspolku on aina lyhin, joten
,mikä on ristiriidassa edellisen epätasa-arvon kanssa. Joten oletuksemme oli väärä. Lemma on todistettu.
Sanotaan kriittiseksi lisäyspolun reunojen sitä, jonka jäännöskapasiteetti on minimaalinen. Arvioidaan kuinka monta kertaa jokin reuna (u, v) voi olla kriittinen. Anna sen tapahtua iteraatiossa ja seuraavan kerran iteraatiossa . Ilmaisee etäisyyden s:stä y:ään iteraatiossa t, meillä on:
Huomaa, että iteraatiossa kriittinen reuna katoaa jäännösverkosta. Jotta reuna (u, v) ilmestyisi siihen uudelleen iteraation aikaan mennessä, on välttämätöntä, että jossain väliiteraatiossa valitaan lisäyspolku, joka sisältää reunan (v, u). Näin ollen
Käyttämällä aiemmin todistettua lemmaa saamme:
Koska aluksi (muuten v = s, mutta s:ään johtava reuna ei voi esiintyä lyhimmällä polulla s:stä t:hen) ja aina, kun tietysti se on pienempi kuin |V| (lyhyin polku ei sisällä syklejä ja siksi sisältää vähemmän |V|-reunoja), reuna voi olla kriittinen useimmissa tapauksissa. Koska jokainen lisäyspolku sisältää vähintään yhden kriittisen reunan ja niiden reunojen kokonaismäärä, joista saattaa joskus tulla kriittisiä (kaikki alkuperäisen verkon reunat ja niiden vastakkaiset reunat), voimme kasvattaa polkua enintään |E|·|V | yhden kerran. Siksi iteraatioiden määrä ei ylitä O(|E|·|V|), mikä oli todistettava.
Olkoon verkko, jonka lähde on kärjessä ja nielu kärjessä . Kuvassa pari kuvaa virtausta pitkin tätä reunaa ja sen läpimenoa.
Kuvataan ensimmäisessä vaiheessa leveyshakua.
Huomaa, että jonoon lisättiin peräkkäin kärjet, jotka saavutettiin A:sta tasan 1, tasan 2 askeleen ja tasan 3 askeleen. Lisäksi jokaisen kärjen pää on se kärki, joka saavutetaan A:sta tasan 1 askeleen nopeammin.
Polun kapasiteetti | Polku |
---|---|
|
|
|
|
|
|
|
|
Huomaa, että algoritmin suorituksen aikana komplementaaristen polkujen pituudet (merkitty punaisella kuvissa) eivät pienene. Tämä ominaisuus täyttyy, koska etsimme lyhintä täydentävää polkua .
Edmonds-Karp-algoritmin parannettu versio on Dinitz-algoritmi, joka vaatii operaatioita.
Kutsutaan graafin G apuääriviivatonta verkkoa , jonka lähde on s, sen aligraafia, joka sisältää vain ne reunat (u, v), joiden minimietäisyys s:stä v:ään on yhtä suurempi kuin minimietäisyys s:stä u:han.
Dinitin algoritmi:
Kaavion hakualgoritmit | ||
---|---|---|
Tietämättömät menetelmät | ||
Tietoon perustuvat menetelmät | ||
Pikanäppäimet | ||
Vähintään ulottuva puu | ||
Muut |