Verkkoalgoritmit - luentokalvot osa 1
Transcription
Verkkoalgoritmit - luentokalvot osa 1
811312A Tietorakenteet ja algoritmit 2014 - 2015 V Verkkojen algoritmeja Osa1 : Leveys- ja syvyyshaku Sisältö 1. 2. 3. 4. 5. Johdanto Leveyshaku Syvyyshaku Kruskalin algoritmi Dijkstran algoritmi Ari Vesanen 811312A TRA Verkot / osa 1 2 V.1 Johdanto Verkkoalgoritmit ovat yleisimpiä ja tärkeimpiä algoritmityyppejä tunnetaan suuri määrä erilaisia algoritmeja verkkoalgoritmeja on analysoitu laajasti. Yleisneuvo algoritmiseen ongelmaan: muunna verkkojen ongelmaksi ratkaisu saattaa olla yleisesti tunnettu tai ongelma osoitettu vaikeaksi. Ari Vesanen 811312A TRA Verkot / osa 1 3 V.1.1 Verkon määritelmä Verkko (graafi, graph) on pari G = (V, E), missä V on solmujen (vertices) epätyhjä joukko E on välien (edges) joukko E ⊆ V × V (relaatio solmujen joukossa) E määrittelee, mitkä solmut on kytketty toisiinsa. Verkko voi olla suunnattu tai suuntaamaton: Suuntaamattomassa verkossa ehdosta i, j ∈ E seuraa aina j, i ∈ E. Verkko voi olla painotettu: väleihin liitetään luku, ns. painoarvo Ari Vesanen 811312A TRA Verkot / osa 1 4 V.1.2 Esimerkki 1 1 2 5 2 5 3 4 Suunnattu verkko Ari Vesanen 3 4 Suuntaamaton verkko 811312A TRA Verkot / osa 1 5 V.1.2 Esimerkki (2) Kuvion esittämille verkoille solmujen joukko V = { 1, 2, 3, 4, 5 }. välien joukko suunnatulle verkolle E = {(1,2),(2,4),(2,5),(3,2),(3,5),(4,3),(5,4)} välien joukko suuntaamattomalle verkolle E = {(1,2),(2,1),(2,4),(4,2),(2,5),(5,2),(3,2),(2,3),(3,5), (5,3),(4,3),(3,4),(5,4),(4,5)} Suunnatuille väleille käytetään joskus kulmasulkeita ja silloin kaarisulut varataan suuntaamattomille (kaksisuuntaisille) väleille Ari Vesanen 811312A TRA Verkot / osa 1 6 V.1.3 Verkkojen esittäminen Matriisesitys: Verkko: 1 2 5 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 Adj 3 4 Vieruslistaesitys: 1 2 / 2 4 5 / 3 2 5 / 4 3 / 5 4 / V.2 Leveyshaku (Breadth-first search) Yksinkertaisimpia algoritmeja verkon läpikäymiseen Toimii monien algoritmien pohjaratkaisuna Idea: Valitaan kiinteä solmu s ja käydään välejä systemaattisesti läpi, kunnes kohdataan kaikki solmut, joihin solmusta s voidaan päästä. Ensin löydetään kaikki etäisyydellä 1 olevat solmut, sitten etäisyydellä 2 olevat solmut jne. -> Nimitys leveyshaku Ari Vesanen 811312A TRA Verkot / osa 1 8 V.2 Leveyshaku (2) Käyttää (FIFO-tyyppistä) jonoa Q Operaatiot ENQUEUE ja DEQUEUE Taulukko color: Solmujen värit kussakin vaiheessa Valkoinen: Solmua ei vielä löydetty Musta: Solmu ja sen kaikki naapurit löydetty Harmaa: Solmu löydetty mutta sillä voi olla valkeita naapureita Taulukko d: Solmujen etäisyydet lähtösolmusta Taulukko p: Solmujen edeltäjät lyhimmässä polussa Lopuksi voidaan lukea lyhin polku mihin tahansa solmuun (lopusta alkuun) Ari Vesanen 811312A TRA Verkot / osa 1 9 V.2.1 Leveyshaun algoritmi Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään vieruslistaesitystä. Tulostus: N solmujen lukumäärä. N-paikkaiset taulukot p,d ja color indeksoidaan verkon solmuilla. Taulukkoon d lasketaan solmun etäisyys syötesolmusta s. Arvo INF = ei polkua. Taulukkoon p lasketaan solmun edeltäjäsolmu jossakin lyhimmässä polussa syötesolmusta s. Arvo NIL = ei polkua. BFS(G,s) 1. for each u in V 2. color[u] = WHITE 3. d[u] = INF 4. p[u] = NIL 5. d[s] = 0 6. color[s] = GRAY 7. Q = EMPTY 8. ENQUEUE(Q,s) Ari Vesanen 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. while Q != EMPTY u = DEQUEUE(Q) for each v in Adj[u] if color[v] == WHITE color[v] = GRAY d[v] = d[u]+1 p[v] = u ENQUEUE(Q,v) color[u] = BLACK return 811312A TRA Verkot / osa 1 10 V.2.2 Esimerkki: Leveyshaun eteneminen 1: a b c d INF 0 INF INF INF INF INF e f g Q:b 0 3: a b c d 1 0 INF INF INF 1 INF e f g Ari Vesanen Q: f 1 2: a b c d 1 0 INF INF INF 1 INF e f g Q:a, f 11 4: a b c d 1 0 2 INF 2 1 2 e f g 811312A TRA Verkot / osa 1 Q:e, c, g 2 2 2 11 V.2.2 Esimerkki: Leveyshaun eteneminen (2) 5: a b c d 1 0 2 2 1 2 e f g a b c d 1 0 2 2 1 2 e f g 7: Ari Vesanen 6: a b c d INF 1 0 2 3 Q:c, g 2 2 2 1 2 e f g 8: Q:g, d 2 3 a b c d 3 1 0 2 3 Q:d 3 2 1 2 Q: e f g 811312A TRA Verkot / osa 1 12 V.2.3 Leveyshaun algoritmin analyysi: kompleksisuus Oletetaan, että verkossa N solmua ja M väliä Tarkka askelten määrä riippuu verkon rakenteesta Yläraja suoritettavien rivien määrälle 6∙(N+M) Siis algoritmin kompleksisuusluokka O(N+M) HUOM! Jos verkossa lähes kaikkien solmujen välillä on kytkentä, on M luokkaa N2. Tällöin siis algoritmin kompleksisuus on luokkaa O(N2). Ari Vesanen 811312A TRA Verkot / osa 1 13 V.2.3 Leveyshaun algoritmin analyysi: oikeellisuus Olkoon algoritmin syötesolmu s Merkintä: (s,v) on solmun v etäisyys solmusta s Algoritmi todettu oikeaksi, kun osoitetaan: 1. Algoritmin suorituksen jälkeen kaikki solmusta s saavutettavat solmut löydetään 2. Taulukon d arvo d[v] = (s,v) 3. Jos v≠s, ja v voidaan saavuttaa solmusta s, niin jokin lyhimmistä poluista solmusta s solmuun v on polku solmusta s solmuun p[v] ja väli (p[v],v) Ari Vesanen 811312A TRA Verkot / osa 1 14 V.2.4 Leveyshaun sovelluksia Lyhimmän polun hakeminen kahden solmun väliltä Verkon yhtenäisyyden selvittäminen Yhdistettyjen komponenttien hakeminen Ari Vesanen 811312A TRA Verkot / osa 1 15 V.2.4.1 Lyhimmän polun tulostaminen Syöte: Verkko G=(V,E) ja sen solmut s ja v. Algoritmissa oletetaan ensin ajettavan BFS(G,s), jonka tuottamaa taulukkoa p käytetään. Tulostus: Lyhin polku solmusta s solmuun v tai ilmoitus siitä, että polkua ei ole. BFS_POLKU(G,s,v) 1. if v==s 2. tulosta s 3. else 4. if p[v] == NIL 5. tulosta ”Ei polkua” 6. else 7. BFS_POLKU(G,s,p[v]) 8. tulosta v 9. return Ari Vesanen 811312A TRA Verkot / osa 1 16 V.3 Syvyyshaku Monipuolisempi kuin leveyshaku Laajempi sovellettavuus Hieman haastavampi käyttää Idea: Mennään verkossa aina aluksi niin ”syvälle” kuin päästään, ts. tarkistetaan, onko tutkittavalla solmulla s vielä tutkimattomia siitä lähteviä välejä Kun kaikki välit on tutkittu, algoritmi perääntyy solmuun, josta solmu s löydettiin ja tutkii siitä lähtevät välit Jatketaan, kunnes lähtösolmusta saavutettavat solmut on kaikki tutkittu Jos vielä tutkimattomia solmuja, valitaan uusi lähtösolmu Ari Vesanen 811312A TRA Verkot / osa 1 17 V.3 Syvyyshaku (2) Toteutuksesta: Käytetään samankaltaista solmujen värittämistä ja edeltäjätaulukkoa kuin leveyshaussa Lisäksi globaali askelmuuttuja, joka ilmaisee kunkin solmun löytämis- ja tarkastelun lopettamisajan Tallennetaan aikaleimoina kahteen taulukkoon Aikaleimojen avulla saadaan verkon rakenteesta tarkempaa tietoa kuin leveyshaulla Ari Vesanen 811312A TRA Verkot / osa 1 18 V.3.1 Syvyyshaun algoritmi Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään vieruslistaesitystä. Tulostus: Olkoon N solmujen lukumäärä. N-paikkaiset taulukot p,d,f ja color indeksoidaan verkon solmuilla. Taulukkoon p lasketaan solmun edeltäjäsolmu syvyyshakupuussa. Taulukkoon d lasketaan solmun havaitsemisaika ja taulukkoon f solmun käsittelyn lopetusaika. DFS(G) 1.for each u in V 2. color[u] = WHITE 3. p[u] = NIL 4. time = 0 5.for each u in V 6. if color[u]==WHITE 7. DFS_VISIT(u) 8.return Ari Vesanen DFS_VISIT(u) 1. color[u] = GRAY 2. time = time+1 3. d[u] = time 4. for each v in Adj[u] 5. if color[v]==WHITE 6. p[v] = u 7. DFS_VISIT(v) 8. color[u] = BLACK 9. time = time+1 10.f[u] = time 11.return 811312A TRA Verkot / osa 1 19 V.3.2 Syvyyshaun eteneminen 1: a b c 1/ 2: a b 1/ 2/ c d e f d e f 3: a b c 4: a b c 1/ 2/ 1/ 2/ B 3/ d Ari Vesanen e f 4/ 3/ d e 811312A TRA Verkot / osa 1 f 20 V.3.2 Syvyyshaun eteneminen (2) 5: a b 1/ 2/ c 6: a b 1/ 2/ B B 4/5 3/ d e 7: a b 1/ 4/5 3/6 f d e f c 8: a b c 2/7 1/8 B F 4/5 3/6 d e Ari Vesanen c f 2/7 B 4/5 3/6 d e 811312A TRA Verkot / osa 1 f 21 V.3.2 Syvyyshaun eteneminen (3) 9: a 1/8 b c 2/7 9/ B F 3/6 d e 11: a F 1/8 F 4/5 1/8 10: a b c 2/7 9/ C B 4/5 3/6 10/ f d e f b c 12: a b c 2/7 9/ 2/7 9/12 B C 1/8 F B C 4/5 3/6 10/11 4/5 3/6 10/11 d e f d e f Ari Vesanen 811312A TRA Verkot / osa 1 22 V.3.3 Syvyyshaun kompleksisuus Oletetaan, että verkossa N solmua ja M väliä Algoritmi DFS_VISIT suoritetaan täsmälleen kerran jokaiselle solmulle Jokainen solmusta lähtevä väli tutkitaan DFS_VISITissä vakioaikaisella operaatiolla sekä mahdollisella DFS_VISIT-kutsulla Siis kompleksisuus Θ(N+M) Ari Vesanen 811312A TRA Verkot / osa 1 23 V.3.4 Syvyyshaun ominaisuuksia Edeltäjätaulukossa p[u] = v, jos ja vain jos (u,v) on verkon väli ja v havaitaan siinä vaiheessa, kun u on väriltään harmaa Muodostetaan verkko, jonka välit ovat (p[u],u) solmuille u joilla on edeltäjä Saadaan puiden muodostama verkko = syvyyssuuntainen virittävä metsä (depth-first forest) Jos solmu v samassa puussa solmun u kanssa ja solmusta u lähtevässä alipuussa, sanotaan, että u on solmun v edeltäjä ja v solmun u jälkeläinen Solmu u solmun v edeltäjä tarkalleen silloin, kun u on väriltään harmaa havaittaessa solmu v Ari Vesanen 811312A TRA Verkot / osa 1 24 V.3.4 Syvyyshaun ominaisuuksia (2) Esimerkkiverkon syvyysuuntainen virittävä metsä a c b f e d Ari Vesanen 811312A TRA Verkot / osa 1 25 V.3.4 Syvyyshaun ominaisuuksia (3) Olkoot u ja v verkon G solmuja ja suoritetaan verkolle syvyyshaku. Silloin jokin seuraavasta kolmesta ehdosta on voimassa: 1. Välit [d[u],f[u]] ja [d[v],f[v]] ovat erilliset eikä u ole solmun v jälkeläinen eikä v solmun u jälkeläinen 2. Väli [d[u],f[u]] sisältyy kokonaisuudessaan väliin [d[v],f[v]] ja u on solmun v jälkeläinen 3. Väli [d[v],f[v]] sisältyy kokonaisuudessaan väliin [d[u],f[u]] ja v on solmun u jälkeläinen Seuraus: Solmu v on solmun u jälkeläinen jos ja vain jos d[u] < d[v] < f[v] < f[u] Ari Vesanen 811312A TRA Verkot / osa 1 26 V.3.4 Syvyyshaun ominaisuuksia (4) Solmujen käsittelyajat esimerkkiverkossa a c b f e d 1 Ari Vesanen 2 3 4 5 6 7 8 9 10 11 12 811312A TRA Verkot / osa 1 27 V.3.4 Syvyyshaun ominaisuuksia (5) 1. 2. 3. 4. Verkon välit jaetaan seuraaviin luokkiin: Puuvälit (tree edges) ovat välejä syvyysmetsän puissa Siten (u,v) on puuväli, jos solmu v havaittiin väliä (u,v) tutkimalla Takautuvat välit (back edges) välejä (u,v), joissa u on solmun v jälkeläinen jossakin syvyysmetsän puussa Etenevät välit (forward edges) välejä (u,v), joissa u on solmun v edeltäjä jossakin syvyysmetsän puussa, ja (u,v) ei ole puuväli Sivuttaisvälit (cross edges) ovat välejä, jotka eivät kuulu mihinkään luokista 1-3 Ari Vesanen 811312A TRA Verkot / osa 1 28 V.3.4 Syvyyshaun ominaisuuksia (6) Välien luokittelu esimerkkiverkossa a b c 1/8 2/7 9/12 B F C Puuväli F Etenevä väli 4/5 3/6 10/11 B Takautuva väli d e f C Sivuttaisväli Ari Vesanen 811312A TRA Verkot / osa 1 29 V.3.5 Syklin havaiseminen syvyyshaulla Verkossa sykli tarkalleen silloin, kun syvyyshaku tuottaa vähintään yhden takautuvan välin Väli (u,v) on takautuva, jos u on solmun v jälkeläinen Tällöin väliä ensimmäistä kertaa tutkittaessa solmun v on oltava harmaa, jolloin v on solmun u edeltäjä Takautuva väli voidaan havaita algoritmin suoritusvaiheessa -> Saadaan versio, joka havaitsee syklin Ari Vesanen 811312A TRA Verkot / osa 1 30 V.3.5 Syklin havaiseminen syvyyshaulla (2) Syöte: Verkko G=(V,E) ja sen solmu s. Verkolle käytetään vieruslistaesitystä. Tulostus: Kuten syvyyshaku, mutta palauttaa arvon TRUE, jos verkossa sykli ja arvon FALSE muuten DFS(G) 1.for each u in V 2. color[u] = WHITE 3. p[u] = NIL 4. time = 0 5. cycle = FALSE 6.for each u in V 7. if color[u]==WHITE 8. DFS_VISIT(u) 9.return cycle Ari Vesanen DFS_VISIT(u) 1. color[u] = GRAY 2. time = time+1 3. d[u] = time 4. for each v in Adj[u] 5. if color[v]==GRAY 6. cycle=TRUE 8. if color[v]==WHITE 9. p[v] = u 10. DFS_VISIT(v) 13. color[u] = BLACK 14. time = time+1 15. f[u] = time 16. return 811312A TRA Verkot / osa 1 31 V.3.6 Vahvasti yhtenäiset komponentit Vahvasti yhtenäinen komponentti suunnatussa verkossa on sellainen maksimaalinen solmujen joukko, että aina kun u ja v ovat joukon solmuja, on olemassa polku sekä solmusta u solmuun v että solmusta v solmuun u Esimerkkiverkossa vahvasti yhtenäiset komponentit ovat {a}, {b,d,e}, {c} ja {f} Voidaan löytää syvyyshaulla Merkintä: kun G on verkko, niin GT on verkko joka saadaan G:stä kääntämällä välien suunnat Voidaan tehdä ajassa O(N+M), jos G:ssä M väliä Ari Vesanen 811312A TRA Verkot / osa 1 32 V.3.6 Vahvasti yhtenäiset komponentit (2) Syöte: Suunnattu verkko G=(V,E). Verkolle oletetaan käytettävän vieruslistaesitystä. Tulostus: Syöteverkon vahvasti yhtenäiset komponentit. SCC(G) 1. Suorita DFS(G), käytetään solmujen käsittelyajan päättymistaulukkoa f. 2. Muodosta GT 3. Suorita DFS(GT), mutta pääsilmukassa (rivi 6) käsitellään solmut askelessa 1 saatujen f[u]:n arvojen suhteen vähenevässä järjestyksessä. 4. Askelessa 3 syntyvän virittävän metsän jokainen puu on verkon G vahvasti yhtenäinen komponentti. Ari Vesanen 811312A TRA Verkot / osa 1 33 V.3.6 Vahvasti yhtenäiset komponentit (3) Analyysi. Verkko G, jossa N solmua ja M väliä Kompleksisuus: Kahdesti syvyyshaku (Θ(N+M)) GT:n muodostaminen (Θ(N+M)) Koko algoritmin kompleksisuus Θ(N+M) Ari Vesanen 811312A TRA Verkot / osa 1 34 V.3.6 Vahvasti yhtenäiset komponentit (4) Oikeellisuus: 1. Jos solmut u ja v samassa komponentissa, G:ssä polku u:sta v:hen ja päinvastoin. Samoin GT:ssä. u ja v päätyvät samaan puuhun 2. Olkoot u ja v samassa puussa, jonka juuri on x Siis GT:ssä polut x->u ja x->v, joten G:ssä on polut u->x ja v->x Syvyyshakujärjestys GT:lle takaa myös G:ssä polut x->u ja x->v Siten u ja v samassa komponentissa Kohdat 1 ja 2 osoittavat algoritmin oikeaksi Ari Vesanen 811312A TRA Verkot / osa 1 35 V.3.7 Syvyyshaku suuntaamattomassa verkossa Toimii samaan tapaan kuin suunnatuissa verkoissa Välien luokittelua tulkittava Suuntaamattomassa verkossa väli (u,v) ja (v,u) samaistetaan Välin luokaksi annetaan se, joka tehdään, kun väliä tarkastellaan ensimmäistä kertaa, olipa kyseessä vali (u,v) tai (v,u) Suuntaamattoman verkon välit kaikki joko puuvälejä tai takautuvia välejä Syvyyssuuntaisen virittävän metsän puut antavat verkon yhtenäiset komponentit Ari Vesanen 811312A TRA Verkot / osa 1 36