Doorzoeken van grafen Algoritmiek.

Slides:



Advertisements
Verwante presentaties
Minimum Spanning Tree. Wat is MST? • Minimum spanning tree • De meest efficiënte manier vinden om een verbonden netwerk op te bouwen.
Advertisements

Datastructuren Quicksort
1 Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen Hashtabellen –Oplossen van botsingen met “ketens” (chaining) –Analyse –Oplossen.
Datastructuren Analyse van Algoritmen en O
Datastructuren Analyse van Algoritmen en O
Graph Begrippen: knoop, vertices kant, zijde, edge
1 Tentamen 21 januari 2008 uitleg Algemene kennisvragen a)“Wat verstaan we onder de complexiteit van een algoritme?” –Cruciaal: wat gebeurt er met.
Hoofdstuk 6: Controle structuren
Motion Planning in Games Pathfinding with A * Ronald Treur.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
1 Datastructuren Lijstjes (Stacks & Queues) Onderwerp 7.
Fibonacci & Friends Met dank aan Gerard Tel.
Datastructuren Zoekbomen
1 Datastructuren Heapsort College 4. 2 Vandaag  Kort: ADT vs Datastructuur  Heaps en Heapsort  Tijd over: ondergrenzen voor sorteren; nog sneller sorteren.
1 Datastructuren Zoekbomen II Invoegen en weglaten.
NP-volledigheid Algoritmiek © Hans Bodlaender, Oktober 2002.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen (II) College 6.
Terrain Analysis Seminar GIA najaar 2004 Joost Voogt.
Dijkstra Kortste pad algoritme.
Parallelle Algoritmen String matching. 1 Beter algoritme patroonanalyse Bottleneck in eenvoudig algoritme: WITNESS(j) (j = kandidaat in eerste i-blok)
Oplossen van een doolhof
T U Delft Parallel and Distributed Systems group PGS Fundamentele Informatica in345 Deel 2 Oplossing Langste Pad Probleem Cees Witteveen
Inleidend probleem Data structuur (hiërarchie van classes)
Netwerk Algorithms: Shortest paths1 Shortest paths II Network Algorithms 2004.
1 Datastructuren Skiplists. 2 Skiplists  Vrij eenvoudige datastructuur  “Makkelijker” dan gebalanceerde bomen  Kunnen hetzelfde als gebalanceerde bomen.
1 Optuigen van datastructuren 2 Dynamische order statistics (2)
Optuigen van datastructuren
Datastructuren Sorteren: bubble, merge, quick
1 Datastructuren Heapsort (2e deel) College 5. 2 Vandaag  Heaps en Heapsort  (eind)  Nog sneller sorteren:  Ondergrenzen  Linair sorteren.
Indeling Inleiding op PRM-planners & Medial Axis Retraction van configuraties op de Medial Axis Verbetering van retraction Verbetering van sampling Expliciete.
Lokale zoekmethoden Goed in de praktijk:
Project OO-AD: Color Crazy Domien Nowicki, Bjorn Schobben.
Datastructuren Sorteren, zoeken en tijdsanalyse
1 Datastructuren Een informele inleiding tot Skiplists Onderwerp 13.
Sorteeralgoritmen. Sorteren: aanpak 1 Hoe ga je een rij getallen sorteren met PC? Sorteren door selectie (= selection sort): Zoek de kleinste waarde Sorteer.
Eenvoudig voorbeeld: Steden in Belgie
PHP & MYSQL LES 02 PHP & FORMULIEREN. PHP & MYSQL 01 PHP BASICS 02 PHP & FORMULIEREN 03 PHP & DATABASES 04 CMS: BEST PRACTICE.
Project OO-AD: Color Crazy Domien Nowicki, Bjorn Schobben.
Les 3 Basisbouwstenen (deel 2) Programmeren met Visual Basic Karl Moens.
Intermezzo: Queries op zoekbomen Datastructuren. Queries: hoe op te lossen We hebben: – Een zoekboom (gewoon, rood-zwart, AVL,…) – Een vraag / querie.
Representatie & Zoeken
T U Delft Parallel and Distributed Systems group PGS Fundamentele Informatica in345 Deel 2 College 6 Cees Witteveen.
Allard Kamphuisen Hado van Hasselt Wilco Broeders
Grafentheorie Graaf Verzameling knopen al dan niet verbonden door takken, bijv:
Recursie…. De Mandelbrot Fractal De werking… De verzameling natuurlijke getallen… 0 ∞-∞
Amorized Analysis en Union-Find Algoritmiek. 2 Vandaag Amortized analysis –Technieken voor tijdsanalyse van algoritmen Union-find datastructuur –Datastructuur.
Minimum Opspannende Bomen Algoritmiek. 2 Inhoud Het minimum opspannende bomen probleem Een principe om een minimum opspannende boom te laten groeien Twee.
Doorzoeken van grafen Algoritmiek. Algoritmiek: Divide & Conquer2 Vandaag Methoden om door grafen te wandelen –Depth First Search –Breadth First Search.
Kortste Paden Algoritmiek. 2 Vandaag Kortste Paden probleem All pairs / Single Source / Single Target versies DP algoritme voor All Pairs probleem (Floyd’s.
Netwerkstroming Algoritmiek. 2 Vandaag Netwerkstroming: definitie en toepassing Het rest-netwerk Verbeterende paden Ford-Fulkerson algoritme Minimum Snede.
Greedy algorithms Algoritmiek. 2 Vandaag Greedy algorithms: wat zijn dat? Voorbeelden: –gepast betalen met euromunten –AB-rijtje –… Knapsack probleem.
Heuristieken en benaderingsalgoritmen Algoritmiek.
Divide & Conquer: Verdeel en Heers vervolg Algoritmiek.
Datastructuren voor grafen Algoritmiek. 2 Grafen Model van o.a.: –Wegennetwerk –Elektrische schakeling –Structuur van een programma –Computernetwerk –…
Gerandomiseerde algoritmes
Kortste Paden Algoritmiek.
Netwerkstroming Algoritmiek.
NP-volledigheid Algoritmiek.
All-Pairs Shortest paths
Datastructuren voor graafrepresentatie
Minimum Opspannende Bomen
Amorized Analysis en Union-Find
Minimodules voor de 3e klas
Modderdorp UNPLUGGED Bron: csunplugged.org.
Kiezen met Kaarten.
Nim, een strategisch spelletje
Doolhof. doolhof doolhof Maak een routine die de ‘hekken’ tussen de cellen weghaalt Maak een 2-dimensionale array met kolommen en rijen aangeklikt.
Eens / oneens IK DENK NA VOORDAT IK BEGIN
Python – For loop + strings
Python – For loop + strings
Transcript van de presentatie:

Doorzoeken van grafen Algoritmiek

Algoritmiek: Divide & Conquer Vandaag Methoden om door grafen te wandelen Depth First Search Breadth First Search Gerichte Acyclische Grafen en topologische sorteringen Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Doolhof eind start Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Depth First Search Methode om systematisch alle knopen (en eventueel ook alle kanten) van een graaf te bekijken Als in doolhof: Ga steeds verder waar je laatst was, tot je niet meer verder kan, ga dan terug tot het laatste punt waar je nog een andere kant op kan. Algoritmiek: Divide & Conquer

DFS op ongerichte samenhangende grafen Begin in een willekeurige knoop v Elke knoop heeft variable bezocht, die aangeeft of we al eerder in die knoop geweest zijn. Initieel zetten we voor elke v: bezocht(v) = false. Wanneer we een knoop bezoeken wordt bezocht op true gezet voor die knoop. Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer DFS Procedure dfs(v) bezocht (v) = true for all w grenzend aan v do if (bezocht(w) == false) then dfs(w) recursie Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer DFS zonder recursie Procedure dfs-nr(v) Maak lege stack S; Voor alle knopen v, zet bezocht(v) = false; Push(S,v) while (not(emptystack(S))) do x = pop(S); bezocht(v) = true; for all w grenzend aan v do if (bezocht(w) == false) then push(S,w) Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer f h b i c Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer f h b i c Algoritmiek: Divide & Conquer

Als G niet samenhangend is Hoofdloop, initialiseert en begint 1 keer per samenhangende component Procedure dfSearch (graaf G) for all v do bezocht(v) = false for all v do if (bezocht(v) == false) then dfs(v) Initialisatie, net als bij samenhangende grafen Een keer per samenhangende component Algoritmiek: Divide & Conquer

Samenhangende componenten Een samenhangende component van een graaf G is een maximale samenhangende deelgraaf van G. G Algoritmiek: Divide & Conquer

DFS en samenhangende componenten DFS is eenvoudig te gebruiken om een gegeven graaf te splitsen in samenhangende componenten. Nuttig o.a., voor divide & conquer preprocessing: Veel graafproblemen kunnen opgelost worden door oplossingen voor samenhangende componenten samen te voegen. Een illustratief voorbeeld van zo’n graafprobleem is het kleuringsprobleem: geef elke knoop een kleur uit een gegeven verzameling, zodat aangrenzende knopen verschillende kleuren hebben. Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Een eigenschap van DFS DFS bouwt een boom op. Als G ongericht, dan zijn er twee soorten kanten in G: Kanten in de DFS-boom: tree-edges Kanten tussen knoop en voorouder in DFS boom: backedges 1 2 5 3 Er kan bijvoorbeeld geen kant tussen 4 en 6 lopen: want dan zou 6 vanuit 4 ontdekt zijn. 6 7 4 Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Articulatiepunten Een knoop v is articulatiepunt, als de samenhangende component die v bevat niet langer samenhangend is als v en zijn aangrenzende kanten verwijderd worden. Algoritmiek: Divide & Conquer

Dubbelsamenhangende grafen Een graaf G is dubbelsamenhangend (biconnected) als G is samenhangend G heeft geen articulatiepunten Algoritmiek: Divide & Conquer

Toepassingen van dubbelsamenhangendheid Betrouwbaarheid van netwerken Preprocessing (divide&conquer) door splitsen in dubbelsamenhangende componenten. Algoritmiek: Divide & Conquer

Hoe vinden we de articulatiepunten? (1) De wortel r van de DFS-boom is een articulatiepunt als r minstens 2 kinderen in de boom heeft. 1 4 2 5 6 3 Er zijn geen kanten tussen de verschillende deelbomen onder r Algoritmiek: Divide & Conquer

Hoe vinden we de articulatiepunten? (2) We nummeren de knopen in volgorde dat ze bezocht worden. Initieel: pnum = 1 Procedure dfs(v) bezocht (v) = true; prenum(v) = pnum; pnum ++; for all w grenzend aan v do if (bezocht(w) == false) then dfs(w) prenum geeft preorder nummering van de DFS-boom Algoritmiek: Divide & Conquer

Vinden van articulatiepunten (3) Kan in O(n+a) tijd Bepaal voor elke knoop v een getal highest(v), wat het nummer van de hoogste voorouder van v die bereikt kan worden met een pad van eerst 0 of meer tree-edges omlaag, en dan 0 of 1 back-edge omhoog. 1 1 1 2 5 3 2 1 2 1 6 7 4 highest is dus een zo laag mogelijk nummer van pnum 6 Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Bepalen van highest Werkt in O(n+a) tijd Ga door T van beneden naar boven (postorder). highest(v) is het minimum van prenum(v) prenum(w) over alle backedges (v,w) highest(x) over alle kinderen x van v in T Algoritmiek: Divide & Conquer

Vinden van articulatiepunten (4) Stelling. Stel v is niet de wortel van de DFSboom. v is een articulatiepunt, dan en slechts dan als v een kind w in de DFSboom heeft met highest(w) ³ prenum(v). 1 1 1 2 5 3 2 1 Uitleg op bord. Kijk naar de verschillende gevallen die zich kunnen voordoen. 2 1 6 7 4 6 Algoritmiek: Divide & Conquer

Algoritme voor vinden articulatiepunten Werkt in O(n+a) tijd Doe DFS, en bereken DFS-boom en waardes prenum Bereken waardes highest Doorloop DFSboom, en test voor elke knoop v of het een articulatiepunt is Wortel: kijk of meerdere kinderen Niet wortel: kijk of kind x bestaat met highest(x) ³ prenum(v) Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer DFS op gerichte grafen 1 Procedure dfs(v) bezocht (v) = true for all arcs (v,w) do if (bezocht(w) == false) then dfs(w) 2 5 6 3 7 8 4 Vier types pijlen: Tree-arcs Back-arcs Cross-arcs Forward-arcs O(n+a) tijd Algoritmiek: Divide & Conquer

Strongly connected components Gerichte graaf G is sterk samenhangend als Er tussen van elke knoop naar elke andere knoop een pad is (en terug) Sterk samenhangende component: Maximale deelgraaf die sterk samenhangend is Er is een O(n+a) algoritme dat Test of een gegeven gerichte graaf sterk samenhangend is Een gegeven gerichte graaf splitst in sterk samenhangende componenten. Werkcollegeopgave! Dit noem ik alleen even. De werkcollegeopgave is belangrijk! Algoritmiek: Divide & Conquer

Gerichte acyclische grafen Een gerichte graaf is acyclisch als het geen cycle bevat. Toepassingen o.a.: Representatie van partiele ordeningen Afhankelijkheden van scheduling van taken Spreadsheet Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer

Topologische sortering Een nummering van de knopen 1, … , n, zodat voor elke pijl (v,w) in A: nr(v) < nr(w) Stelling. G is acyclisch, d.e.s.d. als G een topologische sortering heeft £ : stel wel een cycle. Kijk naar de nummers als je langs de cycle gaat … ³ : constructie … (2 verschillende manieren) 5 2 1 4 3 6 Algoritmiek: Divide & Conquer

Vinden van topologische sortering by g.a.g. (Algoritme 1) Verandering van DFS: Initieel: teller = n Procedure dfs(v) bezocht (v) = true for all arcs (v,w) do if (bezocht(w) == false) then dfs(w) nb(v) = teller; teller -- ; 1 6 2 3 7 5 4 Er zijn drie soorten edges, en het algoritme zorgt er precies voor dat elke soort edges goed gaat. 8 Er zijn geen backedges. Algoritmiek: Divide & Conquer

Vinden van topologische sortering (Algoritme 2) Als G acyclisch is, dan heeft G een knoop zonder inkomende pijlen. (Want anders …) Mogelijk algoritme teller = 1; While G heeft nog ongenummerde knopen do neem knoop v zonder inkomende pijlen vanuit andere ongenummerde knopen nb(v) = teller; teller ++; Algoritmiek: Divide & Conquer

Implementatie algoritme 2 Elke knoop heeft variable unnumin(v): geeft het aantal pijlen naar v vanuit ongenummerde knopen. Verzameling B van knopen met unnumin 0. Initialiseer: For all v do unnumin(v) = ingraad van v. if (unnumin(v) == 0 ) then zet v in B. teller = 1; Algoritmiek: Divide & Conquer

Vervolg implementatie While B niet leeg do haal knoop v uit B; nb(v) = teller; teller++; for all (v,w) do unnumin(w) --; if (unnumin(w) == 0 ) then zet w in B. Als we niet alle knopen hebben genummerd als we klaar zijn, dan had de graaf een cycle. Als we wel alle knopen hebben genummerd, dan is de nummering een topologische sortering. O(n+a) tijd Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Samenvatting DFS Gaat verder van laatst bezochte knoop waar iets nieuws te ontdekken is Kan gebruikt worden om graaf te splitsen in Samenhangende componenten (ongericht) Dubbelsamenhangende componenten (ongericht) Sterk samenhangende componenten (gericht) Kan gebruikt worden om te testen of gerichte graaf acyclisch is, en zo ja, topologische sortering te geven Ook een ander algoritme voor top. sort., zonder DFS Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Breadth First Search Graaf doorzoeken als een olievlek Waar DFS een stack gebruikt (bijv. door de recursie) gebruikt BFS een queue Kan ook gebruikt worden voor vinden van samenhangende componenten Voor bepalen van afstanden als alle kanten/pijlen dezelfde lengte hebben Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Pseudocode voor BFS Procedure BFS(v) Q = lege queue; bezocht[v] = true; Zet v op Q. while Q is niet leeg do haal eerste element x uit Q for each w grenzend aan x do if (bezocht[w] == false) then bezocht[w] = true; zet w op Q. O(n+a) tijd Procedure BFSearch(G) For all v: do bezocht[v] = false; For all v: do if (not bezocht[v]) then BFS(v) Dezelfde soort code als voor DFSearch Algoritmiek: Divide & Conquer

Gerichte grafen: net zo Procedure BFS(v) Q = lege queue; bezocht[v] = true; Zet v op Q. while Q is niet leeg do haal eerste element x uit Q for each (x,w) in A do if (bezocht[w] == false) then bezocht[w] = true; zet w op Q. Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer f h b i c Algoritmiek: Divide & Conquer

BFS bezoekt knopen in volgorde afstand tot startknoop Alle knopen met een kortste pad naar v met i knopen worden bezocht voor de knopen met een kortste pad met i+1 knopen naar v g e a d f h b i Wat is de overeenkomst tussen uien, grafen, en ogres? c Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer 3 g e 4 a 2 d f 4 2 h 5 b 1 i 3 c Algoritmiek: Divide & Conquer

Kortste paden probleem als alle kanten / pijlen lengte 1 hebben Definieer de afstand in G van s naar t als het minimum aantal kanten op een pad van s naar t. BFS kan gebruikt worden om deze afstanden (single source) uit te rekenen Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer BFS met afstanden Procedure BFS(v) Q = lege queue; bezocht[v] = true; d[v] = 0; Zet v op Q. while Q is niet leeg do haal eerste element x uit Q for each w grenzend aan x (elke pijl (x,w) ) do if (bezocht[w] == false) then bezocht[w] = true; d[w] = d[x] + 1; zet w op Q. Algoritmiek: Divide & Conquer

Correctheid afstanden Voor elke w: d[w] is minstens de afstand van v naar w Met inductie: er is een pad van v naar w met d[w] kanten. Voor elke w: d[w] is hooguit de afstand van v naar w Kijk naar een kortste pad van v naar w. Laat vi de ide knoop op dit pad zijn. Met inductie: d[vi] £ i. Algoritmiek: Divide & Conquer

Concrete en impliciete grafen Alle behandelde algoritmen kosten O(n+a) tijd als we de graaf met de adjacency list representatie gekregen hebben. Algoritmen werken ook voor grafen die we impliciet hebben gekregen: Mechanisme dat van een gegeven knoop vertelt welke buren het heeft Omdat grafen heel (soms zelfs oneindig) groot kunnen worden slaan we de graaf niet geheel op. Toepassingen: game graphs; optimization problems; … Algoritmiek: Divide & Conquer

Algoritmiek: Divide & Conquer Conclusie DFS Samenhangen: samenhangende componenten; sterk samenhangend; dubbel samenhangend Acyclische grafen en topologisch sorteren BFS Algoritmiek: Divide & Conquer