Doorzoeken van grafen. Algoritmiek

Vergelijkbare documenten
Grafen en netwerken I Datastructuren en doorzoeken. Algoritmiek

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search

Kortste Paden. Algoritmiek

Minimum Opspannende Bomen. Algoritmiek

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel.

Tweede college algoritmiek. 12 februari Grafen en bomen

Algoritmiek. 15 februari Grafen en bomen

Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen

Discrete Wiskunde, College 12. Han Hoogeveen, Utrecht University

Recapitulatie: Ongeïnformeerd zoeken. Zoekalgoritmen ( ) College 2: Ongeïnformeerd zoeken. Dynamische breadth-first search

Netwerkstroming. Algoritmiek

Computationale Intelligentie Dirk Thierens

Tiende college algoritmiek. 13/21 april Gretige Algoritmen Algoritme van Dijkstra

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Datastructuren en Algoritmen

Netwerkstroming. Algoritmiek

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Algoritmiek. 2 februari Introductie

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Discrete modellen in de toegepaste wiskunde (WISB136) Uitwerkingen proeftentamen.

Grafen deel 2 8/9. Zesde college

Bomen. 8.8 ongerichte bomen 9.4 gerichte bomen ch 10. binaire bomen

De volgende opgave gaat over de B-bomen van het college, waar sleutels zowel in de bladeren als ook in de interne knopen opgeslagen worden.

Heuristieken en benaderingsalgoritmen. Algoritmiek

definities recursieve datastructuren college 13 plaatjes soorten Graph = ( V, E ) V vertices, nodes, objecten, knopen, punten

TW2020 Optimalisering

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens

Tiende college algoritmiek. 2 mei Gretige algoritmen, Dijkstra

Tiende college algoritmiek. 26 april Gretige algoritmen

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Greedy algoritmes. Algoritmiek

TW2020 Optimalisering

2WO12: Optimalisering in Netwerken

V = {a, b, c, d, e} Computernetwerken: de knopen zijn machines in het netwerk, de kanten zijn communicatiekanalen.

Oefententamen in2505-i Algoritmiek

Algoritmen, Datastructuren en Complexiteit ( en ) Uitwerkingen

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Elfde college algoritmiek. 21 april Dijkstra en Branch & Bound

Week Hier vind je uitwerkingen van enkele opgaven uit het dictaat Grafen: Kleuren en Routeren.

Examen Datastructuren en Algoritmen II

2WO12: Optimalisering in Netwerken

Constraint satisfaction. Computationele Intelligentie. Voorbeelden. Een constraint satisfaction probleem. Constraint Satisfaction

Een combinatorische oplossing voor vraag 10 van de LIMO 2010

Tentamen combinatorische optimalisatie Tijd:

Kunstmatige Intelligentie (AI) Hoofdstuk 6 van Russell/Norvig = [RN] Constrained Satisfaction Problemen (CSP s) voorjaar 2015 College 7, 31 maart 2015

Examen Datastructuren en Algoritmen II

Universiteit Utrecht Betafaculteit. Examen Discrete Wiskunde II op donderdag 6 juli 2017, uur.

Opgaven Kunstmatige Intelligentie 1 maart 2017

Zoeken met beperkt geheugen. Zoekalgoritmen ( ) College 7: Zoeken met beperkt geheugen. Een representatie van het kleuringsprobleem

Benaderingsalgoritmen

TW2020 Optimalisering

TW2020 Optimalisering

Kortste pad algoritmen

Algoritmen aan het werk

Examen Datastructuren en Algoritmen II

Transcriptie:

Doorzoeken van grafen Algoritmiek

Vandaag Methoden om door grafen te wandelen Depth First Search Breadth First Search Gerichte Acyclische Grafen en topologische sorteringen 2

Doolhof start eind 3

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. 4

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. 5

DFS Procedure dfs(v) bezocht (v) = true for all w grenzend aan v do if (bezocht(w) == false) then dfs(w) recursie 6

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) 7

a e g d f b i h c 8

a e g d f b i h c 9

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 10

Samenhangende componenten Een samenhangende component van een graaf G is een maximale samenhangende deelgraaf van G. G 11

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. 12

Een eigenschap van DFS DFS bouwt een boom op. Als G ongericht, dan zijn er twee soorten kanten in G: Kanten in de DFSboom: tree-edges Kanten tussen knoop en voorouder in DFS boom: backedges 4 3 2 1 5 6 7 13

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. 14

Dubbelsamenhangende grafen Een graaf G is dubbelsamenhangend (biconnected) als G is samenhangend G heeft geen articulatiepunten 15

Toepassingen van dubbelsamenhangendheid Betrouwbaarheid van netwerken Preprocessing (divide&conquer) door splitsen in dubbelsamenhangende componenten. 16

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. 3 2 1 4 5 6 Er zijn geen kanten tussen de verschillende deelbomen onder r 17

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

Vinden van articulatiepunten (3) 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. highest is dus een zo laag mogelijk nummer van pnum 19 4 1 3 1 1 2 1 2 1 5 6 7 6 Kan in O(n+a) tijd 2

Bepalen van highest 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 Werkt in O(n+a) tijd 20

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). 4 1 2 3 1 1 1 1 5 2 6 7 6 2 21

Algoritme voor vinden articulatiepunten 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) Werkt in O(n+a) tijd 22

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

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. 24 Werkcollegeopgave!

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 25

26

Topologische sortering Een nummering van de knopen 1,, n, zodat voor elke pijl (v,w) in A: nr(v) < nr(w) Stelling. 1 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) 2 3 4 6 5 27

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 -- ; 8 7 6 1 2 5 3 Er zijn geen backedges. 4 28

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 ++; 29

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; 30

Vervolg implementatie While B niet leeg O(n+a) tijd 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. 31

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 32

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 33

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; 34 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

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. 35

a e g d f b i h c 36

BFS bezoekt knopen in volgorde 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 afstand tot startknoop a b d e i f g h 37 c

a 2 e 3 g 4 b 1 d 2 i 3 f 4 h 5 c 0 38

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 39

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; 40 zet w op Q.

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 v i de i de knoop op dit pad zijn. Met inductie: d[v i ] i. 41

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; 42

Conclusie DFS Samenhangen: samenhangende componenten; sterk samenhangend; dubbel samenhangend Acyclische grafen en topologisch sorteren BFS 43