Algoritmit 1 Luento 13 Ti 23.2.2016 Timo Männikkö
Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin menetelmä Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 2/31
Algoritmien suunnittelu Suunnittelumenetelmiä: Raaka voima Osittaminen Taulukointi Ahne menetelmä Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 3/31
Taulukointi Taulukointi (dynaaminen optimointi): Tehtävä ratkaistaan vaiheittain, osatehtävä kerrallaan Osatehtävien ratkaisut taulukoidaan Jo laskettuja tuloksia ei lasketa enää uudestaan Taulukoinnilla muodostetaan alkuperäisen tehtävän ratkaisu Yleensä edetään alhaalta ylös Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 4/31
Binomikertoimien laskeminen Binomikertoimet määritellään ( ) n n! = k k!(n k)!, kun 0 k n Voidaan laskea palautuskaavalla ( ) { n 1, kun k = 0 tai k = n = ) ( k + n 1 ), kun 0 < k < n ( n 1 k 1 k Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 5/31
Binomikertoimien laskeminen Palautuskaava Rekursiivinen algoritmi: int bin(int n, int k) { if (k == 0 k == n) return 1; else return bin(n-1, k-1) + bin(n-1, k); } Laskee samoja arvoja moneen kertaan Aikavaativuus eksponentiaalinen Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 6/31
Binomikertoimien laskeminen Taulukoiva, iteratiivinen algoritmi: int bin(int n, int k) { // Taulukko c[0..n][0..k] // Huom: c[0..k] riittäisi for (m = 0; m <= n; m++) { c[m][0] = 1; if (m <= k) c[m][m] = 1; for (j = 1; j <= min(m-1, k); j++) c[m][j] = c[m-1][j-1] + c[m-1][j]; } return c[n][k]; } Aikavaativuus O(nk) Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 7/31
Kapsäkkiongelma Valittavana n kpl erilaisia tavaroita Tavaralle i tunnetaan paino w i ja hyötyarvo p i (positiivisia kokonaislukuja) Tavaraa otetaan mukaan joko 0 tai 1 kpl Annettu kokonaispainoraja W Tehtävänä valita reppuun R tavarat siten, että niiden hyötyarvo on mahdollisimman suuri, mutta painoraja ei ylity max i R p i kun i R w i W Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 8/31
Kapsäkkiongelma Numeroidaan tavarat 1, 2,..., n Osaongelmat: Repun hyötyarvo s(m, r), missä Tavarat valitaan osajoukosta 1, 2,..., m Kokonaispaino korkeintaan r Taulukoidaan s(m, r), kun m = 1, 2,..., n ja r = 0, 1,..., W Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 9/31
Kapsäkkiongelma jatkuu Kun mitään tavaraa ei oteta mukaan, on arvo 0 kaikilla sallituilla painorajoilla Lähtöarvot s(0, r) = 0 kun r = 0, 1,..., W Kokeillaan ottaa aina yksi uusi tavara mukaan Lasketaan arvot s(k, r), kun tunnetaan aikaisemmat arvot s(k 1, r) Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 10/31
Kapsäkkiongelma jatkuu Jos uusi tavara k ei mahdu kokoa r olevaan reppuun, sitä ei oteta mukaan s(k, r) = s(k 1, r) Jos uusi tavara mahtuu, tarkistetaan kannattaako sitä ottaa mukaan s(k, r) = max{s(k 1, r), p k + s(k 1, r w k )} Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 11/31
Kapsäkkiongelma jatkuu Yleisesti kaikilla k = 1, 2,..., n ja r = 0, 1,..., W s(k 1, r), jos w k > r s(k, r) = max{s(k 1, r), p k + s(k 1, r w k )}, jos w k r Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 12/31
Kapsäkkiongelma jatkuu 1. s[i,0] = 0, i = 0,...,n 2. s[0,j] = 0, j = 0,...,W 3. Suoritetaan kaikilla i = 1,..,n: Suoritetaan kaikilla j = 1,...,W: Jos (w[i] <= j) s[i,j] = max{s[i-1,j], p[i] + s[i-1,j-w[i]]} Muutoin s[i,j] = s[i-1,j] 4. Palautetaan arvo s[n,w] Aikavaativuus O(nW ) Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 13/31
Ahne menetelmä Ratkaisu rakennetaan peräkkäisistä, paikallisesti parhaan näköisistä (lokaalisti optimaalisista) valinnoista Joskus lokaalisti optimaaliset valinnat johtavat globaalisti optimaaliseen ratkaisuun Joskus lokaalisti optimaaliset valinnat johtavat huonoon lopputulokseen Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 14/31
Esimerkki Esitettävä 17 mahdollisimman vähillä kolikoilla Ahne menetelmä: Valitaan aina suurin kolikko, joka vielä sopii jäljellä olevaan summaan Käytettävissä 10, 5 ja 1 yksikön kolikoita 17=10+5+1+1 (4 kpl, optimaalinen) Käytettävissä 13, 10, 5 ja 1 yksikön kolikoita 17=13+1+1+1+1 (5 kpl, ei optimaalinen) Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 15/31
Ahne menetelmä vastaus ahne(tapaus x) { y = 0; // "Tyhjä osittaisvastaus" while (y ei ole täydellinen vastaus) { valitse mahdollisista täydennyksistä e[1],...,e[k] sellainen e[i], että osittaisvastaus y täydennettynä e[i]:llä antaa "suurimman arvon" if (y:n täydentäminen ei mahdollista) return fail; else täydennä osittaisvastausta y täydennyksellä e[i] } return y; } Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 16/31
Verkon lyhimmät polut Solmut V, kaaret E, etäisyysfunktio l Suunnattu, painotettu verkko G = (V, E, l) Pituudet l(e) 0 kaikilla kaarilla e E Lähdesolmu v 0 V kiinnitetty D[v] = Lyhimmän v 0 :sta v:hen johtavan polun pituus Tehtävä: Määritä D[v] kaikille solmuille v V Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 17/31
Verkon lyhimmät polut Dijkstran menetelmä (1959): Ylläpidetään joukkoa niistä solmuista, joiden lyhimmän polun pituus jo tunnetaan Laajennetaan joukkoa solmu kerrallaan ahneeseen tyyliin 1. Aluksi S = {v 0 } 2. Lisätään S:ään se joukon V \ S solmu, joka näyttää olevan seuraavaksi lähinnä v 0 :aa 3. Toistetaan kunnes S = V Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 18/31
Dijkstran menetelmä tulos Dijkstra(L[1..n][1..n],v0) // L verkon etäisyysmatriisi // L[u,v]=ääretön, jos ei kaarta (u,v) { S = {v0}, V = {muut solmut paitsi v0}; } D[v0] = 0; for (kaikilla v in V) // alustusaskel D[v] = L[v0,v]; while (V ei ole tyhjä joukko) { valitse jokin u in V, jolla D[u] on minimaalinen; lisää u joukkoon S ja poista se joukosta V; for (kaikilla v in V) D[v] = min(d[v], D[u] + L[u, v]); } return D; Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 19/31
Dijkstran menetelmä Kaksi sisäkkäistä silmukkaa, joiden suorituskertojen lukumäärä riippuu solmujen lukumäärästä Aikavaativuus O(n 2 ) Tehokkaita tietorakenteita käyttämällä aikavaativuutta voidaan parantaa Merkitään e = kaarien lukumäärä Tehokkain tunnettu toteutus O(n log n + e) Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 20/31
Dijkstran toiminta Algoritmin suorituksen aikana jokaisella u S on voimassa: D[u] on lyhimmän polun pituus solmusta v 0 solmuun u:hun Todistetaan induktiolla joukon S koon suhteen: Alkuaskel: Tapauksessa S = 1 on S = {v 0 }, D[v 0 ] = 0 ja väite tosi Induktio-oletus: Väite tosi jollain S = k Induktioaskel: Osoitetaan, että väite edelleen tosi, kun S:ään lisätään jokin solmu u Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 21/31
Dijkstran toiminta jatkuu Tunnetaan etäisyys D[u] jotain polkua pitkin Olkoon P jokin toinen polku v 0 x y u, missä x S ja sen välitön seuraaja y / S Induktio-oletus D[x] lyhin pituus x:ään D[x] + L[x, y] P:n pituus (sillä kaarien pituudet ei-negatiivisia) Kun x lisättiin S:ään, päivitettiin D[y] D[y] D[x] + L[x, y] Solmu u valitaan siten, että D[u] pienin D[u] D[y] Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 22/31
Dijkstran toiminta jatkuu D[x] + L[x, y] P:n pituus D[y] D[x] + L[x, y] D[u] D[y] D[u] P:n pituus Väite tosi Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 23/31
Verkkoihin liittyviä termejä Suuntaamaton verkko G = (V, E) Verkon G aliverkko G = (V, E ), missä V V ja E E Aliverkko G virittää G:n, jos V = V Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 24/31
Verkkoihin liittyviä termejä Jos virittävä G ei sisällä renkaita, se on G:n virittävä metsä Jos virittävä G on yhtenäinen, se on G:n virittävä puu Virittävän puun olemassaolo edellyttää, että G itse on yhtenäinen Virittävä metsä on myös kokoelma erillisiä virittäviä puita Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 25/31
Verkkoihin liittyviä termejä Etäisyysfunktio l Aliverkon G = (V, E ) pituus on l(g ) = e E l(e) Yhtenäisen verkon lyhin virittävä puu on se virittävä puu, jonka pituus on minimaalinen Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 26/31
Verkon lyhin virittävä puu Triviaaliratkaisu: Käydään läpi kaikki virittävät puut Aikavaativuus eksponentiaalinen Monet algoritmit perustuvat tulokseen: Ositetaan verkon solmut kahteen erilliseen epätyhjään joukkoon V 1 ja V 2 Olkoon e lyhyin kaikista teistä, joiden toinen päätesolmu on V 1 :ssä ja toinen V 2 :ssa Silloin on olemassa lyhin virittävä puu, jossa e on mukana yhtenä virittävän puun tienä Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 27/31
Verkon lyhin virittävä puu Tuloksen todistus: Olkoon T verkon lyhin virittävä puu Jos e / T, sen lisääminen aiheuttaa silmukan On olemassa tie f T, jonka toinen päätesolmu on V 1 :ssä ja toinen V 2 :ssa Tie e on tällaisista teistä lyhyin: l(e) l(f ) Poistetaan T :stä tie f ja lisätään e sen tilalle Saadaan virittävä puu, jonka pituus on alkuperäisen T :n pituus Uusi puu on myös lyhin virittävä puu Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 28/31
Verkon lyhin virittävä puu Kruskalin menetelmä: Aloitetaan triviaalilla virittävällä metsällä: Jokainen solmu muodostaa yhden puun Siis metsä (V, T ), missä T = Yhdistetään puita teillä ahneeseen tyyliin, kunnes tuloksena on yksi yhtenäinen puu Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 29/31
Kruskalin menetelmä joukko Kruskal(V,E) // Oletetaan, että verkko on yhtenäinen { T = tyhjä joukko; while (metsä <V,T> ei ole puu) { valitse e in E, jolla l(e) on pienin; poista e teiden joukosta E; if (e:n päät kuuluvat T:n eri puihin) lisää e lyhimmän virittävän puun teiden joukkoon T; } return T; } Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 30/31
Kruskalin menetelmä Aikavaativuus riippuu minimaalisen tien valintatavasta ja joukko-operaatioiden toteutuksesta Merkitään e = kaarien lukumäärä Tehokkaita tietorakenteita käyttäen voidaan laatia toteutus, jonka vaativuus on O(e log e) Algoritmit 1 Kevät 2016 Luento 13 Ti 23.2.2016 31/31