Algdat - Øvingsforelesning Maks flyt
Dagens plan 1. LF teoriøving 7 2. Maks flyt 3. Ford-Fulkerson 4. Maksimal bipartitt matching 5. Presentasjon av øving 9 2
Øving 7 4b) I hvilken rekkefølge velges noder hvis Dijkstra brukes på denne grafen? Gjennomgang på tavla... 3
Øving 7 5d) Anta vi har en graf med kantvekter som er positive heltall og anta E er antall kanter og V er antall noder. Hva gjør Dijkstras(G,w,s)(Dijkstra's algoritme) dersom man forandrer alle kantvektene til w ' (u, v)=(e+ V log(v ) ) w (u, v)+1? Svar: b) Den finner korteste veier fra én startnode til alle andre noder, der antall kanter er minimalt. Å legge til 1 gjør at hvis to stier har samme vekt, vil den med færrest kanter prioriteres. Vi må gange den originale vekten med en konstant > E, ellers kan vi velge en sti som er suboptimal i den originale grafen, f.eks. (4+1) framfor (1+1)+(1+1)+(1+1) 4
Flytnettverk Intuisjon Tenk på et nettverk med vannledninger. Hver ledning har en viss kapasitet (tykkelse). Vi vil prøve å transportere mest mulig vann fra ett punkt til et annet i dette nettverket. Dere må gjerne tenke datanettverk, distribusjonsnettverk eller lignende i stedet. 5
Flytnettverk Graf der hver kant (u,v) har en kapasitet, c(u,v). To spesielle noder: s kilde (source) t sluk (drain) En flyt i denne grafen er en funksjon f(u,v) som oppfyller følgende: f(u,v) c(u,v) for alle u, v V f(v,u) = f(u,v) for alle u, v V v V f(u,v) = 0 for alle u V {s, t} 6
Flytnettverk På norsk f(u,v) c(u,v) for alle u, v V Kan ikke gå mer flyt langs en kant enn den kanten kan holde på. f(v,u) = f(u,v) for alle u, v V Vi definerer utgående flyt som positiv, og innkommende flyt som negativ. Mest konvensjon, men det gjør jobben vår en hel del enklere. v V f(u,v) = 0 for alle u V {s, t} Flyt kan ikke oppstå eller forsvinne, utenom i kilden og sluket. Vi sier at «flyten må være opprettholdt». 7
Maks flyt-problemet Vi definerer verdien av en flyt f som: f = v V f(s, v) Mer intuitivt: «Hvor mye flyt går det fra s til t?» Maks flyt-problemet er å finne en flyt som maksimerer denne verdien. 8
Max flow/min cut-teoremet Den maksimale flyten er begrenset av hvor grafen er «smalest». Et snitt i en flytgraf er et subsett av kanter slik at hvis disse kantene fjernes, vil det ikke lenger finnes en sti fra s til t. Det minimale snittet er det snittet som har minst total kapasitet. Den maksimale flyten er lik kapasiteten til det minimale snittet. 9
Ford Fulkerson-metoden Iterativ algoritme for å finne maksimal flyt. FORD-FULKERSON-METHOD(G, s, t) 1 initialize flow f to 0 2 while there exists an augmenting path p : 3 augment flow f along p 4 return f Send mer og mer flyt gjennom grafen, til du ikke kan sende mer. 10
Flytforøkende stier Gitt et flytnettverk G og en flyt f, er en flytforøkende sti (augmenting path) en sti fra s til t der residualkapasiteten til alle kantene er større enn 0. Residualkapasitet: c f (u,v) = c(u,v) f(u,v) Alternativt kan vi definere et residualnettverk Gf : G f (V, E f ), der E f = {(u,v) V V : c (u,v) > 0} f En flytforøkende sti blir da en sti fra s til t i Gf. 11
Ford Fulkerson komplett algoritme FORD-FULKERSON(G, s, t) 1 for each edge (u, v) E[G] : 2 f[u,v] 0 3 f[v,u] 0 4 while there exists a path p from s to t in the residual network G f : 5 c f (p) min {c f (u,v) : (u,v) is in p} 6 for each edge (u,v) in p : 7 f[u,v] f[u,v] + c f (p) 8 f[v,u] f[u,v] 12
13 Eksempler på tavla!
Oppheving av flyt Hvor er den flytforøkende stien i denne grafen? Siden f(v2, v3) = 1, har vi cf (v2, v3) = 0 ( 1) = 1 14
Korrekthet og kjøretid Ford-Fulkerson på grafer med heltallige kapasiteter vil terminere, siden flyten øker med minst 1 hver iterasjon. Kjøretid: O(E f* ), der f* er den maksimale flyten. Pseudopolynomisk kjøretid skikkelig dårlig! 15
Edmonds Karp-algoritmen Ford Fulkerson sier ikke noe om hvordan man finner flytforøkende stier. Edmonds Karp: Ford Fulkerson der man bruker BFS. Mye bedre kjøretid: O(V E²) 16
Maksimal bipartitt matching En matching M for en graf G = (V, E) er et subsett av kantene slik at alle noder maksimalt har én kant fra M inn til seg. Å finne en maksimal matching for en bipartitt graf kan uttrykkes som et maksflytproblem. 17
Maksimal bipartitt matching 1. Legg til kilde og sluk 2. Trekk en kant fra kilden til alle nodene på venstresiden 3. Trekk en kant til sluket fra alle nodene på høyresiden 18
Praksisøving 9 Dere skal implementere Ford-Fulkerson! Pluss noen andre greier... Grafen har flere kilder og flere sluk. Nodene skal ha en kapasitet. For å fikse dette må dere lage en ny graf slik at «vanlig» Ford-Fulkerson kan brukes. 19