AuD große Übung:20.11.2014 Christian Scheffer Hunger? 1 0 0 0 10 1 0 0 0 9 gerichtete Graphen Pizzabestellung . G := (V, E) . V := V [ V 1 2 .E ⇢ V ⇥ V 1 n . . . . . . V1 V2 m 2 mit (v, w) 2 E :, Student v mag Pizza w . 8v 2 V1 : (v) m . 8w 2 V2 : (w) 30 Pizza hat nur 30 Stücke Pizzabestellung . G := (V, E) . V := V [ V 1 n . . . . . . mögl. Einteilung . G0 := (V, E 0 ) m 0 mit E ✓ E und 8v 2 V1 : (v) 1 . val(G0 ) := |E 0 | . arg max val(G0 ) 0 G ⇢G V1 V2 2 . |E 0 | n . |E 0 | 30 · m Pizzabestellung Pzza(G) E 0 := ; 0 0 G := (V, E ) so lange möglich . . . . . . 0 E := verbessere E was heißt „so lange möglich“? wie verbessern wir E 0 0 Pizzabestellung wie verbessern wir E 0 Am Bsp.: max. Größe: 2, n=5, m=5 |E 0 | = 5 = n -> optimale Einteilung Pizzabestellung wie verbessern wir E 0 v5 w5 w4 v3 Student v1 kriegt Stück v. Pizza w2 Student v3 gibt Stück v. Pizza w2 zurück w2 v1 Am Bsp.: max. Größe: 2, n=5, m=5 Sequenz: Student v3 kriegt Stück v. Pizza w4 Student v5 gibt Stück v. Pizza w4 zurück Student v5 kriegt Stück v. Pizza w5 laufe unbenutzte Kante entlang laufe benutzte Kante entlang laufe unbenutzte Kante entlang laufe benutzte Kante entlang laufe unbenutzte Kante entlang Pizzabestellung wie verbessern wir E 0 v5 w5 Am Bsp.: max. Größe: 2, n=5, m=5 w4 v3 Student kriegt Pizzastück w2 v1 Auslastung aller Pizzen (bis auf letzte) bleibt gleich, da alternierend Student gibt Pizzastück zurück Suche nach verbesserndem alt. Pfad Pizzabestellung wie verbessern wir E 0 v5 w5 w4 v3 w2 v1 Orientiere alle Kanten und suche verbessernden Pfad in ger. Graph Am Bsp.: max. Größe: 2, n=5, m=5 laufe unbenutzte Kanten e 0 (v, w) = e 2 / E d.h. von Student v zu Pizza w Laufe benutzte Kanten e 0 (v, w) = e 2 E d.h. von Pizza w zu Student v Pizzabestellung wie verbessern wir E 0 Allg.: Geg.: G = (V, E) und E 0 Ges.: „verbessernder Pfad“ 0 verbessere( G, E ) E 00 = ; G00 = (V, E 00 ) 0 0 für alle (v, w) = e 2 E ✓ V1 ⇥ V2 E 00 = E 00 [ {(w, v)} 0 für alle (v, w) 2 E\E ⇢ V1 ⇥ V2 E 00 = E 00 [ {(v, w)} markiere alle w 2 V2 mit (w) < 2 für alle v 2 V1 suche ausgehend von v Pfad ⇡ zu markiertem Knoten BFS(v) oder DFS(v) BFS und DFS suchen doch nur nach Knoten und nicht nach Pfaden?! für alle (p, q) 2 ⇡ 0 falls (p, q) 2 E dann E 0 = E 0 \{(p, q)} falls (p, q) 2 / E0 E 0 = E 0 [ {(p, q)} Nicht ganz! Pizzabestellung Wiederholung BFS 1 2 4 7 3 5 8 BFS = breadth-first search (Breitensuche) verw. Datenstruktur: Queue (Warteschlange) 6 9 first-in-first-out (fifo) 10 Pizzabestellung Kanten gerichtet -> Pfade? Wiederholung BFS 1 2 4 7 3 5 6 8 9 9 10 8 10 7 6 5 4 3 2 1 Pizzabestellung Kanten gerichtet -> Pfade? 1 2 4 7 Was heißt das im StudentenPizza-Graphen? 3 5 8 v erreichbar Aber wie? 9 Wiederholung BFS 6 9 10 -> Pfad zwischen v und 1 10 8 7 6 5 4 3 2 1 Pizzabestellung Kanten gerichtet -> Pfade? 1 v erreichbar Aber wie? Was heißt das im StudentenPizza-Graphen? -> Pfad zwischen v und 1 Wiederholung BFS Pizzabestellung Wiederholung DFS 1 2 DFS = depth-first search (Tiefensuche) 3 verw. Datenstruktur: 4 7 5 8 Stack (Stapel) last-in-first-out (lifo) 6 9 10 Pizzabestellung Wiederholung DFS 1 2 4 7 3 5 8 6 9 10 Pizzabestellung Wiederholung DFS 1 2 4 7 3 5 8 6 9 10 Pizzabestellung Pzza(G) E 0 := ; 0 0 G := (V, E ) so lange möglich 0 E := verbessere E 0 was heißt „so lange möglich“? so lange BFS oder DFS Pfad zu nicht überfülltem Termin liefert -> solange Pizzaverteilung um 1 verbesserbar Pizzabestellung Pzza(G) E 0 := ; 0 0 G := (V, E ) so lange möglich 0 E := verbessere E was heißt „so lange möglich“? wie verbessern wir E 0 0 Pizzabestellung Analyse . pro Schleifeniteration Verbesserung um 1 => max. n Iterationen 0 |E |n warum? Nicht mehr als n Studenten einteilbar => max. 30 · m Iterationen warum? 8v 2 V1 : (v) 30 Es gibt nur . . 30 · m Pzza(G) E 0 := ; 0 0 G := (V, E ) so lange möglich 0 E := verbessere E Stücke => nicht mehr als max{n, 30 · m}Iterationen Sei T (G) benötigte Zeit für BFS/DFS auf G also für eine Iteration => Gesamt benötigte Zeit: T (G) · min{n, 30 · m} => Verfahren terminiert Verfahren endlich beschreibbar => Algoritmus 0