811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

Samankaltaiset tiedostot
811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa1 : Leveys- ja syvyyshaku

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

5 Verkkoalgoritmeja. 5.1 Verkkojen esitystapoja

6 Verkkoalgoritmeja. 6.1 Verkkojen esitystapoja

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Datatähti 2019 loppu

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Ohjelmoinnin perusteet Y Python

13 Lyhimmät painotetut polut

keskenään isomorfiset? (Perustele!) Ratkaisu. Ovat. Tämän näkee indeksoimalla kärjet kuvan osoittamalla tavalla: a 1 b 3 a 5

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 10 To Timo Männikkö

verkkojen G ja H välinen isomorfismi. Nyt kuvaus f on bijektio, joka säilyttää kyseisissä verkoissa esiintyvät särmät, joten pari

TIE Tietorakenteet ja algoritmit 261

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

DMP / Kevät 2016 / Mallit Harjoitus 6 / viikko 13 / alkuviikko

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Ohjelmoinnin peruskurssi Y1

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Algoritmit 1. Luento 9 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 2. Demot Timo Männikkö

Itsestabilointi: perusmääritelmiä ja klassisia tuloksia

Algoritmit 1. Luento 8 Ke Timo Männikkö

Lyhin kahden solmun välinen polku

Algoritmit 2. Luento 11 Ti Timo Männikkö

Eräs keskeinen algoritmien suunnittelutekniikka on. Palauta ongelma johonkin tunnettuun verkko-ongelmaan.

JOHDATUS TEKOÄLYYN TEEMU ROOS

Algoritmit 2. Luento 7 Ti Timo Männikkö

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Graafin 3-värittyvyyden tutkinta T Graafiteoria, projektityö (eksakti algoritmi), kevät 2005

Verkon värittämistä hajautetuilla algoritmeilla

Johdatus verkkoteoriaan 4. luento

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

Luku 8. Aluekyselyt. 8.1 Summataulukko

isomeerejä yhteensä yhdeksän kappaletta.

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Tietotekniikan valintakoe

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Ohjelmoinnin perusteet Y Python

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

Stabilointi. Marja Hassinen. p.1/48

0 v i v j / E, M ij = 1 v i v j E.

Johdatus graafiteoriaan

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

JOHDATUS TEKOÄLYYN TEEMU ROOS

Algoritmit 2. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

JOHDATUS TEKOÄLYYN TEEMU ROOS

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

Algoritmit 2. Luento 12 Ke Timo Männikkö

Toinen harjoitustyö. ASCII-grafiikkaa

Luento 5. Timo Savola. 28. huhtikuuta 2006

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

Tietorakenteet ja algoritmit

j n j a b a c a d b c c d m j b a c a d a c b d c c j

.. X JOHDATUS TEKOÄLYYN TEEMU ROOS

Miten käydä läpi puun alkiot (traversal)?

Pienin virittävä puu (minimum spanning tree)

Java-kielen perusteita

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

JOHDATUS TEKOÄLYYN TEEMU ROOS

Harjoitustyö: virtuaalikone

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

T Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

v 8 v 9 v 5 C v 3 v 4

Johdatus graafiteoriaan

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin peruskurssi Y1

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ryhmäteoreettinen näkökulma Rubikin kuutioon Harjoitus 6, ratkaisuehdotus (5 sivua)

Diskreetit rakenteet

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta


Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Ohjelmoinnin perusteet Y Python

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

A* Reitinhaku Aloittelijoille

Transkriptio:

811312A Tietorakenteet ja algoritmit, 2016-2017, Harjoitus 6, Ratkaisu Harjoituksen aiheet ovat verkkojen leveys- ja syvyyshakualgoritmit Tehtävä 6.1 Hae leveyshakualgoritmia käyttäen lyhin polku seuraavan sokkelon läpi, kun sokkeloon mennään vasemmasta yläkulmasta ja poistutaan oikeasta alakulmasta. Muodosta verkko (solmu jokaiseen sokkelon risteyskohtaan, jotka on alla merkitty kirjaimilla) ja suorita algoritmi yksityiskohtaisesti. a b e c h i d k j f g Ratkaisu. Saadaan verkko, jonka vieruslistaesitys on a b h b a c c b d e d c e c f f e g g f h a i i h j j i k k j Suoritetaan nyt leveyshaku lähtien solmusta a. Seuraavassa näkyy, miten taulukot color, d ja p täytetään. Taulukossa color tyhjä paikka tarkoittaa valkoista väriä, kirjain G harmaata ja kirjain B mustaa. color G d 0 p IL

Solmun a naapurit ovat b ja h joten ne väritetään harmaaksi, päivitetään taulukot d sekä p ja laitetaan solmut jonoon, minkä jälkeen solmu a väritetään mustaksi. Jono: b,h. color B G G d 0 1 1 p IL a a yt solmu b otetaan jonosta ja käsitellään sen naapurit a ja c. äistä a ei enää ole valkoinen, joten sille ei tehdä mitään. Jono: h,c color B B G G d 0 1 2 1 p IL a b a Solmu h otetaan jonosta ja käsitellään sen naapurit a ja i. Jono: c,i. color B B G B G d 0 1 2 1 2 p IL a b a h Solmu c otetaan jonosta ja käsitellään sen naapurit b,d ja e. Jono: i,d,e. color B B B G G B G d 0 1 2 3 3 1 2 p IL a b c c a h Solmu i otetaan jonosta ja käsitellään sen naapurit h ja j. Jono: d,e,j. color B B B G G B B G d 0 1 2 3 3 1 2 3 p IL a b c c a h i Solmu d otetaan jonosta ja käsitellään sen naapuri c (ei valkoinen). Sitten otetaan jonosta e ja käsitellään sen naapurit. c ja f. Jono: j,f. color B B B B B G B B G d 0 1 2 3 3 4 1 2 3 p IL a b c c e a h i

Solmu j otetaan jonosta ja käsitellään sen naapuri i ja k. Jono: f,k. color B B B B B G B B B G d 0 1 2 3 3 4 1 2 3 4 p IL a b c c e a h i j Solmu f otetaan jonosta ja käsitellään sen naapuri e ja g. Jono: k,g. color B B B B B B G B B B G d 0 1 2 3 3 4 5 1 2 3 4 p IL a b c c e f a h i j Lopulta solmut k ja g otetaan jonosta ja väritetään mustiksi, jolloin algoritmi päättyy jonon tyhjetessä. color B B B B B B B B B B B d 0 1 2 3 3 4 5 1 2 3 4 p IL a b c c e f a h i j yt voidaan edeltäjätaulukosta p lukea polku solmusta a solmuun g. Lopusta alkuun luettuna polku on g,p[g]=f,p[f]=e,p[e]=c,p[c]=b,p[b]=a. Siis polku alusta loppuun on a,b,c,e,f,g.

Tehtävä 6.2 Kuten luennoista muistetaan, syvyyshakualgoritmi on seuraavan lainen: DFS(G) 1.for each u in V 2. color[u] = WHITE 3. p[u] = IL 4. time = 0 5.for each u in V 6. if color[u]==white 7. DFS_VISIT(u) 8.return 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 Suorita syvyyshaku seuraavalle suunnatulle verkolle lähtien solmusta a ja luokittele verkon välit puuväleihin, eteneviin väleihin, takautuviin väleihin ja poikittaisväleihin. Tarkista myös, voiko algoritmin suorituksen aikana havaita verkossa sykliä. a b c d e f h g Ratkaisu. Verkon G vieruslistaesitys on a d e h b c g c g d f e g f h g h d

Aloitetaan syvyyshaku solmusta a, jonka naapuri d käsitellään ensin, jolloin pinossa ovat solmut d ja a. Taulukkojen sisältö color G G p IL a d 1 2 f Sitten käsitellään solmun d naapuri f, ja sen naapuri h. Pinossa on nyt h,f,d,a ja taulukoissa color G G G G p IL a d f d 1 2 3 4 f Solmulla h ei enää ole valkeita naapureita, sen sijaan huomataan, että sillä on harmaa naapuri d, joten verkossa havaitaan sykli. Solmun h käsittely lopetetaan ja palataan solmuun f. Tälläkään ei enää ole valkeita naapureita, joten palataan solmuun d, jonka naapurit myös ovat jo käsittelyssä. Pinossa on enää solmu a: color G B B B p IL a d f d 1 2 3 4 f 7 6 5 Ollaan solmussa a, jolla on vielä valkea naapuri e, jota siirrytään käsittelemään; pinossa a ja e. color G B G B B p IL a a d f d 1 2 8 3 4 f 7 6 5 Solmulla e on valkea naapuri g, joka menee pinoon: color G B G B G B p IL a a d e f d 1 2 8 3 9 4 f 7 6 5

Solmuilla g,e ja a ei ole valkeita naapureita, joten pino tyhjenee ja taulukkoihin päivitetään arvot color B B B B B B p IL a a d e f d 1 2 8 3 9 4 f 12 7 11 6 10 5 Seuraavaksi siirrytään vielä valkeaan solmuun b, jolla on ainoana valkeana naapurina c. ämä käsitellään ja algoritmi päättyy: color B B B B B B B B p IL IL b a a d e f d 1 13 14 2 8 3 9 4 f 12 16 15 7 11 6 10 5 Syvyyssuuntaisen virittävän metsän muodostavat puut a b d e c f g h Luokitellaan nyt verkon välit. Välit (a,d),(d,f),(f,h),(a,e),(e,g) ja (b,c) ovat puuvälejä, koska niitä tutkimalla löydetään uudet solmut. ämä välit näkyvät myös ylläolevissa puissa. Väli (a,h) on etenevä väli, koska solmu a on solmun h edeltäjä ja väli ei ole puuväli. Väli (h,d) on takautuva väli, koska h on solmun d jälkeläinen. Välit (b,g) ja (c,g) ovat sivuttaisvälejä, koska ne eivät ole puuvälejä eivätkä eteneviä tai takautuvia välejä.

Tehtävä 6.3 Olkoon G = (V,E) suuntaamaton yhdistetty verkko (siis kaikista solmuista on polku kaikkiin muihin solmuihin). Muodosta syvyyshakualgoritmia hyväksi käyttäen algoritmi, joka tuottaa verkon jokaisen välin tasan kerran kumpaankin suuntaan kulkevan polun. Testaa algoritmiasi tehtävän 5.1 verkolla. Voitko käyttää tätä algoritmia hyväksi sokkelosta pääsemiseksi, jos taskusi ovat täynnä viiden sentin kolikoita? Ratkaisu. Kun tehdään syvyyshakua, kuljetaan aina solmusta naapurissa olevaan valkeaan solmuun. Jos ei verkosta ole globaalia tietoa, ei voida kuitenkaan tietää, onko välin päässä käymätön solmu. Kuitenkin kuljettaessa väli yhteen suuntaan, se voidaan merkitä jotenkin ja palattaessa taas merkitä jollain muulla merkillä. Tällöin algoritmia voidaan suorittaa siten, että käymätöntä väliä lähdetään kulkemaan, mutta solmun naapurista palataan takaisin, jos se on jo harmaa tai musta. Solmusta lähdetään aina viimeistä kertaa sitä väliä pitkin, jota solmuun tultiinkin. Koska syvyyshakualgoritmi tarkistaa jokaisen verkon välin täsmälleen kerran, käydään tällä menetelmällä jokainen väli edestakaisin. Viisisenttisiä käyttämällä voidaan sokkelo käydä läpi seuraavasti: Kun risteyksessä ollaan ensimmäistä kertaa, se merkitään kruunapuoli ylöspäin olevalla viisisenttisellä. Kun kuljetaan väli ensimmäistä kertaa, se merkitään samoin kruunapuoli ylöspäin olevilla viisisenttisillä ja kun väli palataan takaisin, käännetään viisisenttiset klaavapuoli ylöspäin. Solmusta lähdetään aina käymätöntä väliä pitkin ja jos risteys oli käyty, palataan takaisin samaa tietä. Lopulta risteyksestä lähdetään takaisin samaa reittiä kuin siihen tultiin eli kruunapuoli ylöspäin olevilla viisisenttisillä merkittyä väliä pitkin. Kun risteyksestä lähdetään viimeistä kertaa (sillä ei enää ole käymättömiä naapureita) se merkitään kääntämällä viisisenttinen klaavapuoli ylöspäin. äin käydään kaikki välit edestakaisin ja varmasti myös selvitään sokkelosta ulos. Testaa algoritmia esimerkiksi tehtävän 1 verkolla!

Tehtävä 6.4 Ohjelmoi (joko C- tai Python-kielellä) muokattu leveyshakualgoritmi niin, että algoritmi havaitsee, onko verkko kaksijakoinen (bipartite). Kaksijakoiseksi sanotaan suuntaamatonta verkkoa, jonka solmut halutaan värittää punaisella ja sinisellä värillä niin, että verkon jokaisen välin toinen solmu on punainen ja toinen sininen. Algoritmin tulisi myös tehdä väritys, mikäli se on mahdollinen. Alla olevassa linkissä on koodi, jossa on toteutettu leveyshakualgoritmi. Sovella ohjelmaasi seuraaviin verkkoihin 1 7 8 2 5 3 6 4 1 7 8 2 5 3 6 4 Ratkaisu. Kun sovelletaan leveyshakua verkkoon lähtien solmusta s, voidaan solmu s värittää punaiseksi. yt solmun s naapurit, jotka algoritmi löytää ensin, on väritettävä sinisiksi. äiden naapurit, joita ei vielä ole havaittu, ovat etäisyydellä 2 lähtösolmusta; nämä on taas väritettävä punaisiksi. äin solmut, joiden etäisyys on parillinen, väritetään punaisiksi ja solmut joiden etäisyys on pariton, väritetään sinisiksi. Luonnollisesti voi tapahtua niin, että kaksi parillisen tai parittoman etäisyyden solmua ovat naapureita, jolloin värittäminen ei ole mahdollista. Muokataan leveyshaun algoritmia niin, että kun solmu otetaan jonosta ja tutkitaan sen naapureita, tarkistetaan onko niiden joukossa samanvärisiä (siis akselilla

punainen/sininen). Mikäli naapureissa on tällainen, ei värittäminen ole mahdollista; muuten väritetään naapurit. Lisätään algoritmiin taulukko redblue, johon tallennetaan solmun väri (R/B). Lisäksi on käytävä verkon kaikki solmut läpi, jotta kaikki komponentit käsiteltäisiin. Seuraavassa on leveyshakualgoritmi muokattuna havaitsemaan kaksijakoisuus. Syöte: Verkko G=(V,E). Verkolle oletetaan käytettävän vieruslistaesitystä. Tulostus: Muuten kuten leveyshakualgoritmissa, paitsi että nyt käydään kaikki solmut läpi. Taulukkoon redblue tehdään väritys, jos se on mahdollinen. Palauttaa arvon TRUE jos väritys onnistuu ja FALSE muuten. BIPARTITE(G) 1. for each u in V 2. color[u] = WHITE 3. d[u] = IF 4. p[u] = IL 5. redblue[u]=x // Epämääräinen väri aluksi taulukossa 6. bipart = TRUE 7. for each s in V 8. if color[s]==white 9. d[s] = 0 10. color[s] = GRAY 11. redblue[s] = RED 12. JOO Q = EMPTY // Aluksi tyhjä jono 13. EQUEUE(Q,s) 14. while Q!= EMPTY() // Toistetaan kunnes jono tyhjenee 15. u = DEQUEUE(Q) 16. for each v in Adj[u] 17. if color[v] == WHITE 18. color[v] = GRAY 19. d[v] = d[u]+1 20. if d[v] mod 2 == 0 21. reblue[v] = RED 22. else 23. reblue[v] = BLUE 24. p[v] = u 25. EQUEUE(Q,v) 26. else 27. if redblue[v] == redblue[u] 28. bipart = FALSE 29. color[u] = BLACK 30. return bipart Leveyshakualgoritmiin on lisätty ainoastaan yhden taulukon käsittelyä ja takuu siitä, että kaikki solmut käsitellään. äin ollen kompleksisuusluokka on ( M). Toteutus on alla olevassa linkissä. Algoritmin toteuttava funktio on nimeltään bicoloring. C-ohjelmassa värityksen sisältävä taulukko redblue annetaan funktiolle parametrina. Funktion paluuarvo on nolla, mikäli väritys ei ole mahdollinen. Python-toteutuksessa taulukko saadaan funktion paluuarvona; paluuarvo on one, jos väritystä ei voi tehdä. Kun ohjelmaa sovelletaan esimerkkiverkkoihin, huomataan, että ensimmäinen verkko voidaan värittää mutta toinen ei.