Edmonds-Karp-algoritmi

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 .

Algoritmi

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 .

Kuvaus

  1. Nollaamme kaikki streamit. Jäljellä oleva verkko on aluksi sama kuin alkuperäinen verkko.
  2. Jäännösverkosta löydämme lyhimmän 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 reunoille. Jos siitä tulee nollasta poikkeava, lisäämme jäännösverkkoon reunan, ja jos siitä tulee nolla, poistamme sen.
  4. Palaamme vaiheeseen 2.

Löytääksemme kaavion lyhimmän polun käytämme leveys ensin -hakua :

  1. Luomme jonon pisteistä O. Aluksi O koostuu yhdestä pisteestä s .
  2. Merkitsemme kärjet s käydyiksi, ilman vanhempia ja kaikki loput vierailemattomiksi.
  3. Niin kauan kuin jono ei ole tyhjä, suorita seuraavat vaiheet:
    1. Poista ensimmäinen kärki jonosta u .
    2. Suorita seuraavat vaiheet kaikille kaarille ( u , v ), jotka lähtevät kärjestä u ja joiden kärjessä v ei ole vielä käynyt:
      1. Merkitsemme vertexin v :n käydyksi, jossa on vanhempi u .
      2. Lisää kärkipiste v jonon loppuun.
      3. Jos v = t , sulje molemmat silmukat: olemme löytäneet lyhimmän polun.
  4. Jos jono on tyhjä, palautetaan vastaus, että polkua ei ole ollenkaan ja pysähdymme.
  5. Jos ei, siirrymme paikasta t paikkaan s , joka kerta menemällä vanhemman luo. Palaamme polun käänteisessä järjestyksessä.

Vaikeus

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 .

Todiste

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.

Esimerkki

Olkoon verkko, jonka lähde on kärjessä ja nielu kärjessä . Kuvassa pari kuvaa virtausta pitkin tätä reunaa ja sen läpimenoa.

Leveys ensimmäinen haku

Kuvataan ensimmäisessä vaiheessa leveyshakua.

  1. Jono koostuu yhdestä pisteestä A. Huippupisteessä A on vieraillut. Ei ole ylätasoa.
  2. Jono koostuu (alusta loppuun) pisteistä B ja D. Käytetään kärkeissä A, B, D. Pisteillä B, D on vanhempi A.
  3. Jono koostuu pisteistä D ja C. Vierailevat A, B, C, D. Vertiselillä B, D on vanhempi A, kärjessä C on pää B.
  4. Jono koostuu pisteistä C, E, F. Vierailevat A, B, C, D, E, F. Verticeillä B, D on emo A, kärjessä C on vanhempi B, kärjeissä E, F on vanhempi D.
  5. Vertex C poistetaan jonosta: sen reunat johtavat vain jo vierailtuihin pisteisiin.
  6. Reuna (E,G) löytyy ja silmukka pysähtyy. Pistepisteet (F,G) ovat jonossa. Kaikki huippupisteet käyty. Pisteillä B, D on emo A, kärjessä C on emo B, kärjessä E, F on yläpäässä D ja kärjessä G on emo E.
  7. Menemme vanhemman mukana: . Palaamme kuluneen polun käänteisessä järjestyksessä: .

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.

Perusalgoritmi

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 .

Dinitzin algoritmi

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:

  1. Rakennamme jäännösgraafista minimaalisen ääriviivattoman verkon.
  2. Niin kauan kuin verkossa on polku pisteestä s paikkaan t, suorita seuraavat vaiheet:
    1. Etsi lyhin polku s:stä t:hen. Jos sitä ei ole, poistu silmukasta.
    2. Jäännösverkon löydetyltä polulta etsimme reunaa, jonka kapasiteetti on minimi .
    3. Jokaiselle löydetyn polun reunalle lisäämme virtausta :lla ja vastakkaiseen suuntaan vähennämme sitä .
    4. Poistamme kaikki reunat, jotka ovat saavuttaneet kylläisyyden.
    5. Poistamme kaikki umpikujat (eli kärjet, paitsi nielu, josta ei kulje reunat, ja kärjet, paitsi lähteen, johon ei tule kulmia) sekä kaikki niihin liittyvät reunat.
    6. Toista edellinen vaihe niin kauan kuin on jotain poistettavaa.
  3. Jos löydetty virta ei ole nolla, lisää se kokonaisvirtaan ja palaa vaiheeseen 1.

Linkit

Kirjallisuus