Inom optimeringsteori och grafteori är det maximala flödesproblemet att hitta ett sådant flöde genom transportnätet att summan av flöden från källan, eller motsvarande summan av flöden till sänkan, är maximal.
Maxflödesproblemet är ett specialfall av svårare problem, såsom cirkulationsproblemet .
Efter USA:s inträde i andra världskriget 1941, anslöt sig matematikern George Bernard Dantzig till United States Air Forces statistiska kontor i Washington DC . Från 1941 till 1946 ledde han Combat Analysis Branch, där han arbetade med olika matematiska problem. [1] [2] Därefter, med hjälp av Danzigs arbete, löstes problemet med maximalt flöde först under förberedelserna av luftbron under blockaden av Västberlin , som ägde rum 1948-1949. [3] [4] [5]
1951 formulerade George Dantzig problemet först i allmänna termer. [6]
År 1955 byggde Lester Ford och Delbert Ray Fulkerson först en algoritm speciellt utformad för att lösa detta problem . Deras algoritm kallades Ford-Fulkerson-algoritmen . [7] [8]
I framtiden förbättrades lösningen av problemet många gånger.
År 2010 visade forskarna Jonathan Kelner och Aleksander Mądry från MIT tillsammans med sina kollegor Daniel Spielman från Yale University och Shen- Hua Teng från South University of California ytterligare en förbättring av algoritmen för första gången på tio år. [3] [9] [10]
Givet ett transportnät med källa , sänka och kapacitet .
Flödesvärdet är summan av flödena från källan . I artikeln " Transportnät " bevisas att det är lika med summan av flödena till avloppet .Problemet med det maximala flödet är att hitta ett sådant flöde, där flödets värde är maximalt.
Följande tabell listar några algoritmer för att lösa problemet.
Metod | Komplexitet | Beskrivning |
---|---|---|
Linjär programmering | Beror på den specifika algoritmen. För simplexmetoden är den exponentiell. | Presentera maximalt flödesproblem som ett linjärt programmeringsproblem. Variablerna är flödena längs kanterna, och begränsningarna är bevarandet av flödet och begränsningen av genomströmningen. |
Ford-Fulkerson algoritm | Beror på sökalgoritmen för utökad sökväg. Kräver sådana sökningar. | Hitta någon förstärkningsväg. Öka flödet längs alla dess kanter med ett minimum av deras restkapacitet. Upprepa så länge det finns en förstärkningsväg. Algoritmen fungerar bara för heltalsbandbredder. Annars kan det köras på obestämd tid utan att konvergera till rätt svar. |
Edmonds-Karps algoritm | Vi kör Ford-Fulkerson-algoritmen, varje gång vi väljer den kortaste förstärkningsvägen (hittad genom sökning på bredden först ). | |
Dinits algoritm | eller för enhetskapacitet med Slethor och Tarjan dynamiska träd [11] | Förbättring av Edmonds-Karp-algoritmen (men kronologiskt funnen tidigare). Vid varje iteration, med hjälp av bredd-först-sökning, bestämmer vi avstånden från källan till alla hörn i det kvarvarande nätverket. Vi konstruerar en graf som endast innehåller sådana kanter av det kvarvarande nätverket på vilka detta avstånd ökar med 1. Vi exkluderar från grafen alla återvändspunkter med kanter som faller mot dem, tills alla hörn blir icke-återvända. (En återvändsgränd är en vertex, förutom källan och sänkan, som inte inkluderar en enda kant eller från vilken inga kanter utgår.) På den resulterande grafen hittar vi den kortaste förstärkningsvägen (det kommer att vara vilken väg som helst från s till t). Vi exkluderar kanten med den minsta kapaciteten från det kvarvarande nätverket, utesluter återigen döda hörn, och så vidare tills det finns en utökad väg. |
Preflow Push Algoritm | Fungerar på ett förflöde istället för en ström. Skillnaden är att för varje vertex u, förutom för källan och sänkan, måste summan av flödena som kommer in i den för flödet vara strikt noll (flödeskonserveringsvillkoret), och för förflödet måste det vara icke-negativt. Denna summa kallas för överflödet till vertexet, och en vertex med ett positivt överflöde sägs vara överflödande . Dessutom, för varje vertex, sparar algoritmen ytterligare en egenskap, höjden , som är ett icke-negativt heltal. Algoritmen använder två operationer: push , när flödet längs en kant som går från en högre till en lägre vertex ökas med maximalt möjliga mängd, och lift , när en överfull vertex, från vilken det är omöjligt att trycka på grund av otillräcklig höjd, höjs . Pushing är möjligt när en kant tillhör det resterande nätverket, leder från en högre vertex till en lägre, och den ursprungliga vertexen svämmar över. Lyftning är möjlig när vertexet som lyfts är fullt, men ingen av de hörn som kanterna på det kvarvarande nätverket leder till är lägre än den. Det utförs upp till en höjd som är 1 större än minimum av höjderna på dessa hörn. Ursprungligen är källans höjd V, längs alla kanter som utgår från källan, maximalt möjliga flödesflöden, och de återstående höjderna och flödena är noll. Tryck- och lyftoperationerna utförs så länge som möjligt. | |
Algoritm "höja till början" | eller använda dynamiska träd | En variant av den tidigare algoritmen som definierar ordningen för push- och lyftoperationerna på ett speciellt sätt. |
Binär blockeringsflödesalgoritm [1] |
För en mer detaljerad lista, se [2] och Lista över algoritmer för att hitta det maximala flödet .
Om genomströmningarna är heltal är det maximala flödet också heltal.
Satsen följer till exempel från Ford–Fulkersons sats .
Vissa generaliseringar av problemet med maximalt flöde reduceras lätt till det ursprungliga problemet.
Om det finns mer än en källa, lägg till en ny vertex S, som vi gör till den enda källan. Vi lägger till kanter med oändlig kapacitet från S till var och en av de gamla källorna.
På samma sätt, om det finns mer än en diskbänk, lägger vi till en ny vertex T, som vi gör till den enda diskbänken. Vi lägger till kanter med oändlig kapacitet från var och en av de gamla diskbänkarna till T.
Varje oriktad kant (u, v) ersätts av ett par riktade kanter (u, v) och (v, u).
Vi delar upp varje vertex v med begränsad kapacitet i två hörn v in och v ut . Alla kanter som ingår i v före delning ingår nu i v i . Alla kanter som härstammar från v innan klyvningen kommer nu från v ut . Lägg till en kant (v in ,v out ) med kapacitet .
I den här versionen av problemformuleringen begränsas värdet av flödet för varje kant dessutom underifrån av funktionen . Således kan flödesvärdet för någon kant inte överstiga dess kapacitet, men det kan inte vara mindre än det specificerade minimumet, dvs. . För att lösa problemet är det nödvändigt att omvandla det ursprungliga transportnätet till ett transportnät enligt följande:
Ett flöde definieras i B som uppfyller villkoret att begränsa genomströmningen av kanter underifrån om och endast om ett maximalt flöde definieras där alla kanter av formen och är "mättade". Tack vare denna konstruktion kommer algoritmen för att hitta ett flöde avgränsat underifrån att vara följande:
Denna variant av problemet är identisk med den tidigare, med skillnaden att flödesvärdet för varje kant också kan vara lika med , d.v.s. eller . Trots en liten förändring i tillståndet finns det ingen polynomlösning på detta problem om klasserna P och NP inte är lika . Som ett bevis på påståendet kan man ge en polynomreduktion till Exact-3-SAT- problemet .