Algoritmit 2 Luento 11 Ti 25.4.2017 Timo Männikkö
Luento 11 Peruutusmenetelmä Osajoukon summa Pelipuut Pelipuun läpikäynti Rajoitehaku Kapsäkkiongelma Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 2/29
Algoritmien suunnittelu Raa an voiman käyttö: Tutkitaan kaikki mahdolliset vaihtoehdot Nopeuttaminen: Rajataan pois vaihtoehdot, joiden joukosta ei voi enää löytyä parempaa ratkaisua Peruutus: Lähdetään liikkeelle tyhjästä osaratkaisusta Täydennetään osaratkaisua Perutaan huonoiksi osoittautuneita valintoja Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 3/29
Peruutusmenetelmä Aloitetaan tyhjästä osittaisesta ratkaisusta Yritetään täydentää osittaista ratkaisua komponentti kerrallaan Jos täydentäminen voidaan tehdä rikkomatta tehtävän rajoituksia, se suoritetaan Jos saadaan täydellinen vastaus, lopetetaan Jos täydentämistä ei voida tehdä, peruutetaan viimeksi tehty täydennys ja yritetään toista komponenttia Jos komponentteja ei ole jäljellä, peruutetaan edelleen Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 4/29
Peruutusmenetelmä vastaus peruuttava(tapaus x) { if (x on täydellinen vastaus) return x; else { for (kaikilla täydennyksillä e[i]) { y = peruuttava(x + täydennys e[i]); if (y on täydellinen vastaus) return y; } return virhe; } } Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 5/29
Osajoukon summa Annettu n kpl positiivisia kokonaislukuja a i Joukko A = {a 1,..., a n } Annettu positiivinen kokonaisluku d Tehtävä: Etsi sellainen osajoukko S, jonka alkioiden summa = d (jos olemassa) Osajoukkoja 2 n kpl Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 6/29
Osajoukon summa Järjestetään alkiot kasvavaan järjestykseen: a 1 a 2 a n Vaiheessa i joko otetaan a i mukaan tai ei oteta Pidetään yllä valittujen alkioiden summaa Jos seuraavan alkion lisääminen kasvattaisi summan yli d:n, sallittua täydennystä tämänhetkiselle osajoukolle ei ole Muuten molemmat vaihtoehdot ovat mahdollisia Edetään peruutusalgoritmin mukaisesti Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 7/29
Osajoukon summa osasumma(a, d, i, summa, n) { if (i > n) palauta false; if (summa + a[i] +... + a[n] < d) palauta false; if (summa + a[i] > d) palauta false; if (summa + a[i] == d) { lisää alkio i ratkaisuun; palauta true; } if (osasumma(a, d, i+1, summa+a[i], n)) { lisää alkio i ratkaisuun; palauta true; } else palauta osasumma(a, d, i+1, summa, n); } Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 8/29
Osajoukon summa Algoritmin ensimmäinen kutsu: osasumma(a, d, 1, 0, n) Pahimmassa tapauksessa käydään läpi kaikki mahdolliset osajoukot Θ(2 n ) Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 9/29
Pelipuut Kaksi pelaajaa, x ja y Pelaajat tekevät vuorotellen siirtoja (valintoja) Pelipuu: Kukin solmu kuvaa yhtä pelitilannetta Juurisolmu kuvaa pelin alkutilannetta Siirto tarkoittaa siirtymistä solmusta johonkin sen lapsisolmuun Lehtisolmut kuvaavat pelin mahdollisia lopputilanteita Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 10/29
Esimerkki X X O X X O O X X O O X X O O X X O O X X O X O X X O X X O O O X O X X O O O X X O X X O O X O X X X O X X O X X O O O O X O X O X X O X O 3 X O X X O X O X X O O X X O X O X O X O X X O X O O O X X O X O X X O O X X O X O Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 11/29
Pelipuut Voittoarvo (payoff-arvo): Arvo, joka kuvaa solmun hyvyyttä pelaajan x kannalta Esimerkiksi payoff(t) 1, jos x:llä voittostrategia t:ssä 1, jos y:llä voittostrategia t:ssä = 0, jos kummallakaan ei ole voittostrategiaa t:ssä Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 12/29
Pelipuut Lopputilanteille voittoarvot on helppo laskea Muiden solmujen voittoarvot voidaan määrittää lapsisolmujen avulla (minmax-proseduuri): Jos vuorossa on x, on voittoarvo lapsisolmujen voittoarvojen maksimi Jos vuorossa on y, on voittoarvo lapsisolmujen voittoarvojen minimi Kaikkien solmujen voittoarvot voidaan määrittää käymällä läpi koko pelipuu lehtisolmuista juureen (jälkijärjestyksessä) Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 13/29
Esimerkki 2 1 3 4 3 4 2 2 3 MAX MIN 3 1 3 2 2 1 3 4 3 4 2 2 3 MAX MIN Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 14/29
Pelipuut Vähänkin mutkikkaammassa pelissä pelipuu on liian suuri, jotta kaikki voittoarvot voitaisiin määrittää lopputilanteista alkaen Käytännössä sovelletaan minmax-proseduuria k siirtoa eteenpäin ja arvioidaan pelitilanteiden hyvyyttä jollain heuristisella evaluointifunktiolla eval(t) Merkitään: x on MAX-pelaaja y on MIN-pelaaja Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 15/29
Pelipuun läpikäynti payoff(pelitilanne,siirtoraja,pelaaja) { if (siirtoraja == 0 tai pelitilanne lopputilanne) return eval(pelitilanne); else { if (pelaaja == MAX) arvo = -ääretön; else arvo = +ääretön; for (kaikilla pelitilanteen seuraajilla s) if (pelaaja == MAX) arvo = max(arvo,payoff(s,siirtoraja-1,min)); else arvo = min(arvo,payoff(s,siirtoraja-1,max)); return arvo; } } Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 16/29
Läpikäynnin tehostaminen α-β-karsinta: Kaikissa solmuissa ylläpidetään väliaikaista voittoarvoa MAX-pelaajalle väliaikainen voittoarvo on todellisen arvon alaraja MIN-pelaajalle väliaikainen voittoarvo on todellisen arvon yläraja Vertaamalla solmun väliaikaista voittoarvoa sen vanhemman väliaikaiseen voittoarvoon tiedetään, kannattaako jälkeläisten läpikäyntiä jatkaa Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 17/29
Läpikäynnin tehostaminen MAX-pelaajalle α = suurin tähän mennessä läpikäytyjen jälkeläisten voittoarvo MIN-pelaajalle β = pienin tähän mennessä läpikäytyjen jälkeläisten voittoarvo Solmu t on MAX-solmu: Jos α kasvaa suuremmaksi kuin sen vanhemman β, ei jälkeläisten läpikäyntiä kannata jatkaa Solmu t on MIN-solmu: Jos β menee pienemmäksi kuin sen vanhemman α, ei jälkeläisten läpikäyntiä kannata jatkaa Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 18/29
Pelipuun läpikäynti: α-β-karsinta payoff_ab(pelitilanne,siirtoraja,pelaaja,a,b) { if (siirtoraja == 0 tai pelitilanne lopputilanne) return eval(pelitilanne); else { if (pelaaja == MAX) arvo = -ääretön; else arvo = +ääretön; for (kaikilla pelitilanteen seuraajilla s) if (pelaaja == MAX) { arvo = max(arvo,payoff_ab(s,siirtoraja-1,min,a,b)); if (arvo => b) return arvo; else a = max(a,arvo); } else { arvo = min(arvo,payoff_ab(s,siirtoraja-1,max,a,b)); if (arvo <= a) return arvo; else b = min(b,arvo); } return arvo; } } Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 19/29
Esimerkki α 3 β 1 β 3 β 2 2 1 3 4 3 4 2 2 3 MAX MIN 2 1 1 2 1 3 1 MAX MIN Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 20/29
Esimerkki jatkuu 4 1 1 3 3 2 1 3 1 3 4 3 4 MAX MIN 1 1 3 3 2 2 1 3 3 3 4 3 4 2 MAX MIN Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 21/29
Rajoitehaku Käydään läpi kaikkien mahdollisten ratkaisujen muodostamaa ratkaisupuuta Jokaiselle uudelle osittaisratkaisulle lasketaan raja sille, miten hyviä ratkaisuja tätä osittaisratkaisua täydentämällä voidaan saavuttaa Jos aiemmin löydetty sallittu ratkaisu, joka on tätä rajaa parempi, tämän osittaisratkaisun täydennyksiä ei tarvitse tutkia Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 22/29
Kapsäkkiongelma Valittavana n kpl erilaisia tavaroita Tavaralle i tunnetaan hyötyarvo p i ja paino w i 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 2 Kevät 2017 Luento 11 Ti 25.4.2017 23/29
Kapsäkkiongelma Järjestetään tavarat laskevaan järjestykseen hyötyarvo-painosuhteen mukaan: p 1 /w 1 p 2 /w 2 p n /w n Osittaisratkaisu: Ensimmäisen i:n tavaran suhteen päätös on tehty Merkitään tämän osittaisratkaisun arvoa p:llä ja painoa w:llä Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 24/29
Kapsäkkiongelma Rajoitusheuristiikka: Lasketaan osittaisratkaisulle jäljellä olevan tilan täyttö parhaan jäljellä olevan tavaran hyötyarvo-painosuhteella Maksimihyöty eli yläraja u = p + (W w)(p i+1 /w i+1 ) Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 25/29
Kapsäkkiongelma Aluksi p = 0 ja w = 0 Muodostetaan kaksi osittaisratkaisua, joista toisessa tavara 1 on mukana, toisessa ei Näille muodostetaan osittaisratkaisut, joista toisessa tavara 2 on mukana, toisessa ei Jne. Jos osittaisratkaisun u on pienempi (huonompi) kuin parhaan tähän mennessä löydetyn ratkaisun u, ei ratkaisupuun kyseistä haaraa tarvitse tutkia Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 26/29
Esimerkki n = 4, W = 10 1 2 3 4 p i 36 35 20 9 w i 4 7 5 3 Merkitään (esimerkiksi): [1,0,1,0] = osittaisratkaisu, jossa tavarat 1 ja 3 on valittu mukaan, tavaroita 2 ja 4 ei ole valittu Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 27/29
Esimerkki 1: [0,0,0,0] p=0 w=0 u=0+(10-0)(36/4)=90 2: [1,0,0,0] p=36 w=4 u=36+(10-4)(35/7)=66 3: [0,0,0,0] p=0 w=0 u=0+(10-0)(35/7)=50 4: [1,1,0,0] p=71 w=11 ei sallittu 5: [1,0,0,0] p=36 w=4 u=36+(10-4)(20/5)=60 6: [1,0,1,0] p=56 w=9 u=56+(10-9)(9/3)=59 7: [1,0,0,0] p=36 w=4 u=36+(10-4)(9/3)=54 8: [1,0,1,1] p=65 w=12 ei sallittu 9: [1,0,1,0] p=56 w=9 u=56 sallittu ratkaisu 3 ja 7 huonompia kuin 9 ei tarvitse tutkia Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 28/29
Esimerkki p=36, w=4, u=66 (p=71, w=11) ei sallittu p=56, w=9, u=59 (p=65, w=12) ei sallittu p=0, w=0, u=90 1 1 on 1 ei p=0, w=0, u=50 2 2 on 2 ei 3 huonompi kuin 9 4 5 p=36, w=4, u=60 3 on 3 ei p=36, w=4, u=54 6 4 on 4 ei 7 huonompi kuin 9 8 9 p=56, w=9, u=56 sallittu ratkaisu Algoritmit 2 Kevät 2017 Luento 11 Ti 25.4.2017 29/29