I optimeringsteori og grafteori er det maksimale flowproblem at finde et sådant flow gennem transportnettet, at summen af strømme fra kilden, eller tilsvarende summen af strømme til vasken, er maksimal.
Det maksimale flowproblem er et særligt tilfælde af vanskeligere problemer, såsom cirkulationsproblemet .
Efter USA's indtræden i Anden Verdenskrig i 1941 sluttede matematikeren George Bernard Dantzig sig til United States Air Forces statistiske kontor i Washington DC . Fra 1941 til 1946 ledede han Combat Analysis Branch, hvor han arbejdede med forskellige matematiske problemer. [1] [2] Efterfølgende, ved hjælp af Danzigs arbejde, blev problemet med maksimal flow først løst under klargøringen af luftbroen under blokaden af Vestberlin , som fandt sted i 1948-1949. [3] [4] [5]
I 1951 formulerede George Dantzig første gang problemet i generelle vendinger. [6]
I 1955 byggede Lester Ford og Delbert Ray Fulkerson først en algoritme specielt designet til at løse dette problem . Deres algoritme blev kaldt Ford-Fulkerson-algoritmen . [7] [8]
I fremtiden blev løsningen af problemet forbedret mange gange.
I 2010 demonstrerede forskerne Jonathan Kelner og Aleksander Mądry fra MIT sammen med deres kolleger Daniel Spielman fra Yale University og Shen - Hua Teng fra South University of California endnu en forbedring af algoritmen for første gang i 10 år. [3] [9] [10]
Givet et transportnetværk med kilde , synke og kapacitet .
Værdien af flow er summen af strømmene fra kilden . I artiklen " Transportnetværk " er det bevist, at det er lig med summen af strømmene til vasken .Problemet med det maksimale flow er at finde et sådant flow, hvor værdien af flowet er maksimalt.
Følgende tabel viser nogle algoritmer til løsning af problemet.
Metode | Kompleksitet | Beskrivelse |
---|---|---|
Lineær programmering | Afhænger af den specifikke algoritme. For simpleksmetoden er den eksponentiel. | Præsenter det maksimale flowproblem som et lineært programmeringsproblem. Variablerne er strømmene langs kanterne, og begrænsningerne er bevarelsen af strømmen og begrænsningen af gennemløbet. |
Ford-Fulkerson algoritme | Afhænger af den udvidede stisøgningsalgoritme. Kræver sådanne søgninger. | Find en hvilken som helst forøgelsesvej. Øg flowet langs alle dets kanter med et minimum af deres resterende kapacitet. Gentag, så længe der er en forøgelsessti. Algoritmen virker kun for heltalsbåndbredder. Ellers kan den køre på ubestemt tid uden at konvergere til det rigtige svar. |
Edmonds-Karp algoritme | Vi udfører Ford-Fulkerson-algoritmen, hver gang vi vælger den korteste forøgelsesvej (fundet ved bredde-først-søgning ). | |
Dinits algoritme | eller for enhedskapaciteter ved hjælp af Slethor og Tarjan dynamiske træer [11] | Forbedring af Edmonds-Karp-algoritmen (men kronologisk fundet tidligere). Ved hver iteration, ved hjælp af bredde-først søgning, bestemmer vi afstandene fra kilden til alle hjørner i det resterende netværk. Vi konstruerer en graf, der kun indeholder sådanne kanter af det resterende netværk, hvor denne afstand øges med 1. Vi udelukker fra grafen alle blindgyder med kanter, der falder ind på dem, indtil alle hjørner bliver ikke-blindgænger. (En blindgyde er et toppunkt, bortset fra kilden og synken, som ikke omfatter en enkelt kant, eller hvorfra ingen kanter udgår.) På den resulterende graf finder vi den korteste forstærkende vej (det vil være enhver vej fra s til t). Vi udelukker kanten med den minimale kapacitet fra det resterende netværk, udelukker igen blinde hjørner og så videre, indtil der er en forøgelsessti. |
Preflow Push Algoritme | Fungerer på en preflow i stedet for en stream. Forskellen er, at for ethvert toppunkt u, bortset fra kilden og synken, skal summen af de strømme, der kommer ind i den for flowet, være strengt nul (strømningsbevaringsbetingelsen), og for præflowet skal den være ikke-negativ. Denne sum kaldes overskydende flow til toppunktet, og et toppunkt med en positiv overskydende flow siges at være overfyldt . Derudover gemmer algoritmen for hvert toppunkt en yderligere karakteristik, højden , som er et ikke-negativt heltal. Algoritmen bruger to operationer: skub , når flowet langs en kant, der går fra et højere til et lavere toppunkt, øges med den maksimalt mulige mængde, og løft , når et overløbende toppunkt, hvorfra det er umuligt at skubbe på grund af utilstrækkelig højde, hæves . Det er muligt at skubbe, når en kant tilhører det resterende netværk, fører fra et højere toppunkt til et lavere, og det oprindelige toppunkt flyder over. Løft er muligt, når toppunktet, der løftes, er fuldt, men ingen af de toppunkter, hvortil kanterne af det resterende netværk fører fra det, er lavere end det. Det udføres op til en højde, der er 1 større end minimumshøjderne af disse hjørner. Indledningsvis er højden af kilden V, langs alle kanter, der udgår fra kilden, er de maksimalt mulige strømningsstrømme, og de resterende højder og strømme er nul. Skub- og løfteoperationerne udføres så længe som muligt. | |
Algoritme "løft til begyndelsen" | eller ved at bruge dynamiske træer | En variant af den tidligere algoritme, der definerer rækkefølgen af skub- og løfteoperationerne på en særlig måde. |
Binær blokeringsflowalgoritme [1] |
For en mere detaljeret liste, se [2] og Liste over algoritmer for at finde det maksimale flow .
Hvis gennemløbene er heltal, er det maksimale flow også heltal.
Sætningen følger for eksempel af Ford-Fulkerson-sætningen .
Nogle generaliseringer af det maksimale flow-problem reduceres let til det oprindelige problem.
Hvis der er mere end én kilde, tilføj et nyt toppunkt S, som vi gør til den eneste kilde. Vi tilføjer kanter med uendelig kapacitet fra S til hver af de gamle kilder.
På samme måde, hvis der er mere end én vask, tilføjer vi et nyt toppunkt T, som vi gør til den eneste vask. Vi tilføjer kanter med uendelig kapacitet fra hver af de gamle vaske til T.
Hver ikke-rettet kant (u, v) erstattes af et par rettede kanter (u, v) og (v, u).
Vi opdeler hvert hjørne v med begrænset kapacitet i to spidser v ind og v ud . Alle kanter inkluderet i v før opdeling er nu inkluderet i v i . Alle kanter, der stammer fra v før spaltning, stammer nu fra v ud . Tilføj en kant (v ind , v ud ) med kapacitet .
I denne version af problemformuleringen er værdien af flowet for hver kant yderligere begrænset nedefra af funktionen . Således kan flowværdien for enhver kant ikke overstige dens kapacitet, men den kan ikke være mindre end det specificerede minimum, dvs. . For at løse problemet er det nødvendigt at omdanne det oprindelige transportnetværk til et transportnetværk som følger:
Et flow er defineret i B, der opfylder betingelsen om at begrænse gennemstrømningen af kanter nedefra, hvis og kun hvis der er defineret et maksimalt flow, hvor alle kanter af formen og er "mættede". Takket være denne konstruktion vil algoritmen til at finde et flow afgrænset nedefra være som følger:
Denne variant af problemet er identisk med den foregående, med den forskel at flowværdien for hver kant også kan være lig , dvs. eller . På trods af en lille ændring i tilstanden er der ingen polynomiel løsning på dette problem, hvis klasserne P og NP ikke er ens . Som et bevis på påstanden kan man give en polynomiel reduktion til Exact-3-SAT- problemet .