Algoritmit 1 - Luento 9 – Ti 9.2.2016
Transcription
Algoritmit 1 - Luento 9 – Ti 9.2.2016
Algoritmit 1 Luento 9 – Ti 9.2.2016 Timo Männikkö Luento 9 • Graafit ja verkot • Kaaritaulukko, bittimatriisi, pituusmatriisi • Verkon lyhimmät polut • Floydin menetelmä • Lähtevien ja tulevien kaarien listat • Forward Star -rakenne • Saavutettavat solmut • Verkon läpikäynti Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 2/29 Graafit ja verkot 1 2 6 5 * ? 3 4 • Solmujen joukko N • Kaarien joukko A Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 3/29 Graafit ja verkot Suunnattu graafi: • Kaarilla suunta • Alkusolmu ja loppusolmu Suuntaamaton graafi: • Kaarilla ei ole suuntaa • Molemmat suunnat tasa-arvoisia Verkko: • Solmuihin tai kaariin liittyy muita kuvauksia • Kaaren pituus, kaaren kapasiteetti, jne. Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 4/29 Kaaritaulukko • Taulukko verkon kaarista (järjestyksellä ei väliä) • Jokaisesta kaaresta tallennettu alkusolmu, loppusolmu ja muut tiedot, kuten esimerkiksi pituus • Hyvin yksinkertainen tallennusrakenne • Vaatii muistitilaa vakion verran jokaista kaarta kohden Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 5/29 Bittimatriisi • Puhdas graafi: Vain solmuja ja kaaria • Oletetaan, että ei rinnakkaisia kaaria Bittimatriisi: • Solmuja n kpl, numeroidaan 0, 1, . . . , n-1 • Matriisin alkio Bij =1, jos on kaari solmusta i solmuun j, muutoin Bij =0 • Käyttökelpoinen, jos graafissa vähän kaaria Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 6/29 Esimerkki: Bittimatriisi 1 3 * o S 7 SS 7 S S S S SS S S S w S w S 0 2 4 0: 1: 2: 3: 4: 0 1 2 3 4 ------------0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 7/29 Kaarien pituusmatriisi • Verkko: Kaarilla on pituus • Oletetaan, että ei rinnakkaisia kaaria Pituusmatriisi: • Solmuja n kpl, numeroidaan 0, 1, . . . , n-1 • Matriisin alkio dij = solmusta i solmuun j johtavan kaaren pituus • Jos kaarta ei ole, asetetaan dij = ∞ (käytännössä suuri luku) • Suuntaamattomilla verkoilla matriisi on symmetrinen Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 8/29 Esimerkki: Pituusmatriisi 25 - 3 1 * o S18 7 S 7 SS S 16 S 16 24 S SS S 27 S S w 17 S w S 0 2 4 31 20 0: 1: 2: 3: 4: 0 1 2 3 4 -----------------0 24 M 16 M M 0 17 25 M 31 18 0 27 M M M M 0 16 M M 20 M 0 Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 9/29 Matriisien tilantarve • Muistitilaa tarvitaan n2 • Suurilla ja harvoilla verkoilla vie liikaa tilaa (suurin osa matriisin alkioista lukuja 0 tai M) • Solmun naapureita määrättäessä joudutaan käymään läpi matriisin koko rivi (naapureita vain muutama) Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 10/29 Verkon lyhimmät polut • Tehtävänä etsiä lyhimmät polut verkon kaikkien solmuparien välillä Floydin menetelmä: • Tallennusrakenteeksi sopii pituusmatriisi • d= pituusmatriisi • D= lyhimpien etäisyyksien matriisi • Idea: Laajennetaan yksi kerrallaan sallittujen ”välisolmujen” joukkoa solmuparin välisellä polulla Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 11/29 Floydin menetelmä 1. Alustus: D=d 2. Suoritetaan kaikilla k=0,1,...,n-1: • Kaikilla pareilla i,j=0,1,...,n-1: • z=Dik +Dkj • Jos z<Dij , niin aseta Dij =z Algoritmin päätyttyä: • Matriisissa D lyhimpien polkujen pituudet • Ensimmäinen solmu lyhimmällä polulla i→j on se solmu k, jolla Dij =dik +Dkj Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 12/29 Lähtevien ja tulevien kaarien listat Tietueet: • Jokaista solmua kohti yksi solmutietue • Jokaista kaarta kohti yksi kaaritietue Listat: • Jokaisella solmulla lista siitä lähtevistä kaarista • Jokaisella solmulla lista siihen tulevista kaarista, jos käytössä • Listojen alkioiden järjestys yleensä vapaa Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 13/29 Lähtevien ja tulevien kaarien listat • Sallii rinnakkaiset kaaret • Kaaret, joiden alku- ja loppusolmu sama, voidaan periaatteessa myös esittää (mutta algoritmeissa hankalia käsitellä) • Voidaan käyttää myös suuntaamattomille verkoille: • Annetaan kaarille mielivaltainen suunta • Solmusta lähtevät ja siihen tulevat kaaret käsitellään tasa-arvoisina Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 14/29 Solmutietue Solmutietueen kenttiä: • Osoitin lähtevien kaarien listan ensimmäiseen kaareen (ffwa) • Osoitin tulevien kaarien listan ensimmäiseen kaareen, jos käytössä (fbwa) • Osoitin seuraavaan solmuun, jos solmut linkitetty listaksi • Muut solmukohtaiset tiedot Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 15/29 Kaaritietue Kaaritietueen kenttiä: • Osoitin kaaren alkusolmuun (tl) • Osoitin kaaren loppusolmuun (hd) • Osoitin seuraavaan kaareen, jolla sama alkusolmu (nxfw) • Osoitin seuraavaan kaareen, jolla sama loppusolmu, jos käytössä (nxbw) • Muut kaarikohtaiset tiedot (esim. pit) Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 16/29 Esimerkki: Kaarien listat 1 H * 4 0 CO HH j H C3 0 H 2C 3 * HH W C 5 j 1 H 2 solmun lähtevät tulevat numero kaaret kaaret 0 0, 1 – 1 4, 2 3, 0 2 3, 5 1, 2 3 – 5, 4 Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 (Huom: Kaaret eivät ole listoissa numerojärjestyksessä) 17/29 Esimerkki taulukoilla 1 H * 4 0 CO HH j H C3 0 H 2C 3 * HH W C 5 j 1 H 2 0: 1: 2: 3: Solmut ffwa fbwa --------0 NIX 4 3 3 1 NIX 5 0: 1: 2: 3: 4: 5: Kaaret tl hd nxfw nxbw pit ------------------0 1 1 NIX 43 0 2 NIX 2 24 1 2 NIX NIX 26 2 1 5 0 32 1 3 2 NIX 15 2 3 NIX 4 17 Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 18/29 Toteutus dynaamisesti solmu kaari ? ? lähtevien kaarien lista tulevien kaarien lista ? loppusolmu ? seur. tuleva tie ? seur. lähtevä tie alkusolmu ? Listojen tilantarve: • Solmuja n kpl ja kaaria m kpl • ⇒ Osoittimia 2n + 4m kpl • Lisäksi muut tallennettavat tiedot/osoittimet Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 19/29 Forward Star -rakenne Kaaritaulukko: • Tiivistetty esitys lähtevien kaarien listasta • Kaaret järjestetty alkusolmun numeron mukaan kasvavaan järjestykseen • ⇒ Samasta solmusta lähtevät kaaret taulukossa peräkkäin • Kaarista annettu vain loppusolmun numero ja pituus Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 20/29 Forward Star -rakenne Solmutaulukko: • n+1 alkiota (yksi ylimääräinen) • s[i]= solmusta i lähtevän ensimmäisen kaaren paikka kaaritaulukossa • Viimeinen alkio ilmoittaa viimeistä kaarta seuraavan paikan • ⇒ s[i+1]-s[i]= solmusta i lähtevien kaarien lukumäärä • ⇒ Jos solmusta i ei lähde yhtään kaarta, on s[i+1]=s[i] Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 21/29 Esimerkki: Forward Star 1 H * 4 0 CO HH j H C3 0 H 2C 3 * HH W C 5 j 1 H 2 0: 1: 2: 3: 4: s --0 2 4 6 6 0: 1: 2: 3: 4: 5: 6: head pit --------1 43 2 24 2 26 3 15 1 32 3 17 NIX NIX Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 22/29 Forward Star -rakenne Tilantarve: • n+1 indeksiä solmutaulukossa • m (tai m+1) kaarialkiota kaaritaulukossa Sopii tallennusrakenteeksi: • Fordin ja Fulkersonin menetelmä (lyhimpien polkujen algoritmi) • Saavutettavissa olevien solmujen selvittäminen Vastaavasti voitaisiin esittää solmuihin tulevat kaaret: Backward Star -rakenne Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 23/29 Saavutettavat solmut • Jos solmusta a solmuun b johtaa ainakin yksi polku, on solmu b saavutettavissa solmusta a • Tehtävänä selvittää, mitkä solmut ovat saavutettavissa annetusta lähtösolmusta • a= lähtösolmu • R= saavutettavien solmujen joukko • T= tutkittavien solmujen joukko Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 24/29 Saavutettavat solmut 1. Alustetaan T=R={a} 2. Jos T= ∅, lopetetaan, muutoin poistetaan joukosta T jokin solmu x 3. Käydään läpi kaikki solmusta x lähtevät kaaret (x,j): • Jos j∈R, ei tehdä mitään • Muutoin lisätään j joukkoihin R ja T Jatketaan kohdasta 2 Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 25/29 Verkon yhdistetyt komponentit • Edellinen algoritmi: Kun kohdassa 2 joukko T tulee tyhjäksi, on löydetty yksi verkon yhdistetty komponentti • Jos kaikkia verkon solmuja ei ole vielä tutkittu, valitaan jokin tutkimaton solmu uudeksi lähtösolmuksi • ⇒ Saadaan toinen yhdistetty komponentti • Näin jatkamalla saadaan selville kaikki yhdistetyt komponentit Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 26/29 Verkon läpikäynti • Edellinen algoritmi: Kun kohdassa 2 joukko T tulee tyhjäksi, valitaan jokin tutkimaton solmu uudeksi solmuksi a • ⇒ Verkon läpikäynti eli kaikkien solmujen ja kaarien tutkinta/käsittely Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 27/29 Verkon läpikäynti Leveyshaku (Breadth-First Search): • Joukko T on jono ⇒ • Tutkitaan solmut, jotka ovat yhden kaaren päässä lähtösolmusta • Tutkitaan solmut, jotka ovat kahden kaaren päässä lähtösolmusta • Jne. Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 28/29 Verkon läpikäynti Syvyyshaku (Depth-First Search): • Joukko T on pino ⇒ • Tutkiminen jatkuu viimeksi tutkitusta solmusta eteenpäin • Kun ei enää päästä eteenpäin, palataan jatkamaan jostain aikaisemmin tutkitusta solmusta Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016 29/29