Optimointiteoriassa ja graafiteoriassa maksimivirtausongelmana on löytää sellainen virtaus kuljetusverkon läpi , että lähteestä tulevien virtausten summa tai vastaavasti nielulle menevien virtausten summa on maksimi .
Maksimivirtausongelma on erikoistapaus vaikeammista ongelmista, kuten kiertohäiriöstä .
Kun Yhdysvallat astui toiseen maailmansotaan vuonna 1941, matemaatikko George Bernard Dantzig liittyi Yhdysvaltain ilmavoimien tilastotoimistoon Washington DC :ssä . Vuodesta 1941 vuoteen 1946 hän johti Combat Analysis Branchia, jossa hän työskenteli erilaisten matemaattisten ongelmien parissa. [1] [2] Myöhemmin, Danzigin työn avulla, maksimivirtausongelma ratkaistiin ensin ilmasillan valmistelun aikana Länsi-Berliinin saarron aikana , joka tapahtui vuosina 1948-1949. [3] [4] [5]
Vuonna 1951 George Dantzig muotoili ensimmäisen kerran ongelman yleisesti. [6]
Vuonna 1955 Lester Ford ja Delbert Ray Fulkerson rakensivat ensimmäisen algoritmin, joka oli erityisesti suunniteltu ratkaisemaan tämä ongelma . Heidän algoritmiaan kutsuttiin Ford-Fulkerson-algoritmiksi . [7] [8]
Jatkossa ongelman ratkaisua parannettiin monta kertaa.
Vuonna 2010 tutkijat Jonathan Kelner ja Aleksander Mądry MIT :stä sekä kollegansa Daniel Spielman Yalen yliopistosta ja Shen- Hua Teng Etelä -Kalifornian yliopistosta osoittivat toisen parannuksen algoritmiin ensimmäistä kertaa 10 vuoteen. [3] [9] [10]
Kun otetaan huomioon liikenneverkko , jossa on lähde , nielu ja kapasiteetti .
Virtauksen arvo on lähteestä lähtevien virtojen summa . Artikkelissa " Liikenneverkko " todistetaan , että se on yhtä suuri kuin viemäriin menevien virtausten summa .Maksimivirtauksen ongelmana on löytää sellainen virtaus, jossa virtauksen arvo on maksimi.
Seuraavassa taulukossa on lueteltu joitakin algoritmeja ongelman ratkaisemiseksi.
Menetelmä | Monimutkaisuus | Kuvaus |
---|---|---|
Lineaarinen ohjelmointi | Riippuu tietystä algoritmista. Simplex -menetelmässä se on eksponentiaalinen. | Esitä maksimivirtausongelma lineaarisena ohjelmointitehtävänä. Muuttujat ovat virtaukset reunoja pitkin ja rajoituksia ovat virtauksen säilyminen ja läpimenon rajoittaminen. |
Ford-Fulkerson-algoritmi | Riippuu lisäävän polun hakualgoritmista. Vaatii tällaisia hakuja. | Etsi mikä tahansa lisäävä polku. Lisää virtausta sen kaikkia reunoja pitkin niiden jäännöskapasiteetin vähimmäismäärällä. Toista niin kauan kuin lisäävä polku on olemassa. Algoritmi toimii vain kokonaislukujen kaistanleveyksillä. Muuten se voi jatkua loputtomiin ilman, että se konvergoi oikeaan vastaukseen. |
Edmonds-Karp-algoritmi | Suoritamme Ford-Fulkerson-algoritmin ja valitsemme joka kerta lyhimmän lisäyspolun (löytyy leveyshaulla ). | |
Dinitin algoritmi | tai yksikkökapasiteeteille käyttämällä Slethorin ja Tarjanin dynaamisia puita [11] | Edmonds-Karp-algoritmin parannus (mutta kronologisesti löydetty aiemmin). Jokaisessa iteraatiossa määritämme etäisyydet lähteestä kaikkiin jäännösverkon kärkiin käyttämällä leveyshakua. Rakennamme graafin, joka sisältää vain ne jäännösverkon reunat, joilla tämä etäisyys kasvaa 1:llä. Jätetään graafista pois kaikki umpikujapisteet, joiden reunat osuvat niihin, kunnes kaikki kärjet muuttuvat ei-umpikuiksi. (Umpikuja on kärki, paitsi lähde ja nielu, joka ei sisällä yhtä reunaa tai josta ei tule yhtään reunaa.) Tuloksena olevasta graafista löydämme lyhimmän lisäyspolun (se on mikä tahansa polku s:stä kohtaan t). Jätetään pois jäännösverkosta reuna, jolla on pienin kapasiteetti, jätetään jälleen pois umpikujapisteet ja niin edelleen, kunnes on olemassa lisäyspolku. |
Preflow Push Algorithm | Toimii esivirtauksella virran sijaan. Erona on se, että missä tahansa kärjessä u, paitsi lähde ja nielu, siihen tulevien virtausten summan tulee olla tiukasti nolla (virtauksen säilymisehto) ja esivirtauksen osalta sen ei-negatiivinen. Tätä summaa kutsutaan ylivirtaukseksi kärkeen, ja huippupisteen, jolla on positiivinen ylivirtaus, sanotaan olevan ylivuoto . Lisäksi algoritmi tallentaa jokaiselle kärjelle lisäominaisuuden, korkeuden , joka on ei-negatiivinen kokonaisluku. Algoritmi käyttää kahta operaatiota: push , kun virtausta pitkin ylemmästä alempaan kärkeen menevää reunaa kasvatetaan suurimmalla mahdollisella määrällä ja lift , kun nostetaan ylivuotava kärki, josta työntäminen on mahdotonta riittämättömän korkeuden vuoksi. . Työntäminen on mahdollista, kun reuna kuuluu jäännösverkkoon, johtaa korkeammasta kärjestä alempaan ja alkuperäinen kärki on ylivuoto. Nosto on mahdollista, kun nostettava kärki on täynnä, mutta yksikään kärkipisteistä, joihin jäännösverkon reunat johtavat siitä, ei ole sitä alempana. Se suoritetaan korkeudelle, joka on 1 suurempi kuin näiden kärkien korkeuksien minimi. Aluksi lähteen korkeus on V, kaikkia lähteestä lähteviä reunoja pitkin suurimmat mahdolliset virtaukset ja loput korkeudet ja virtaukset ovat nollia. Työntö- ja nostotoiminnot suoritetaan niin kauan kuin mahdollista. | |
Algoritmi "nostaa alkuun" | tai käyttämällä dynaamisia puita | Edellisen algoritmin muunnelma, joka määrittää työntö- ja nostotoimintojen järjestyksen erityisellä tavalla. |
Binäärinen estovirtaalgoritmi [1] |
Katso tarkempi luettelo kohdista [2] ja Luettelo algoritmeista maksimivirtauksen löytämiseksi .
Jos läpimenot ovat kokonaislukuja, myös maksimivirtaus on kokonaisluku.
Lause seuraa esimerkiksi Ford–Fulkersonin lausetta .
Jotkut maksimivirtausongelman yleistykset voidaan helposti pelkistää alkuperäiseen ongelmaan.
Jos lähdettä on useampi kuin yksi, lisää uusi kärkipiste S, josta teemme ainoan lähteen. Jokaiseen vanhaan lähteeseen lisätään reunat, joilla on ääretön kapasiteetti S:stä.
Vastaavasti, jos nieluja on useampi kuin yksi, lisäämme uuden kärjen T, josta teemme ainoan nielun. Lisäämme T:hen jokaisesta vanhasta pesualtaasta äärettömän kapasiteetin reunat.
Jokainen suuntaamaton reuna (u, v) korvataan parilla suunnattuja reunoja (u, v) ja (v, u).
Jaamme kukin rajallisella kapasiteetilla oleva kärki v kahdeksi kärjeksi v sisään ja v ulos . Kaikki reunat, jotka sisältyvät v:ään ennen jakamista, sisältyvät nyt v : ään . Kaikki reunat, jotka olivat peräisin v:stä ennen jakamista, ovat nyt peräisin v: stä ulos . Lisää reuna (v in ,v out ), jonka kapasiteetti on .
Tässä tehtävänlauseen versiossa kunkin reunan virtauksen arvoa rajoittaa lisäksi alhaalta funktio . Siten minkään reunan virtausarvo ei voi ylittää sen kapasiteettia, mutta se ei voi olla pienempi kuin määritetty minimi, ts. . Ongelman ratkaisemiseksi on tarpeen muuttaa alkuperäinen liikenneverkko liikenneverkoksi seuraavasti:
Kohdassa B määritellään virtaus, joka täyttää ehdon reunojen läpimenon rajoittamisesta alhaalta, jos ja vain, jos on määritelty maksimivirtaus, jossa kaikki muodon ja reunat ovat "kylläisiä". Tämän rakenteen ansiosta algoritmi alhaalta rajatun virtauksen löytämiseksi on seuraava:
Tämä tehtävän muunnos on identtinen edellisen kanssa sillä erolla, että kullekin reunalle virtausarvo voi olla myös yhtä suuri , ts. tai . Huolimatta pienestä ehdon muutoksesta, tähän ongelmaan ei ole polynomiratkaisua, jos luokat P ja NP eivät ole samat . Todisteeksi väitteelle voidaan antaa polynomipelkistys Exact-3-SAT- ongelmalle .