Algoritmit 2 Luento 10 To 19.4.2018 Timo Männikkö
Luento 10 Peruutusmenetelmä Osajoukon summa Verkon 3-väritys Pelipuut Pelipuun läpikäynti Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 2/34
Algoritmien suunnittelu Raa an voiman käyttö: Tutkitaan kaikki mahdolliset ratkaisuvaihtoehdot Nopeuttaminen: Rajataan pois vaihtoehdot, joiden joukosta ei voi enää löytyä parempaa ratkaisua Peruutus: Täydennetään ratkaisua tekemällä valintoja Perutaan huonoiksi osoittautuneita valintoja Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 3/34
Peruutusmenetelmä Aloitetaan tyhjästä osittaisvastauksesta Yritetään täydentää osittaisvastausta vaiheittain komponentti kerrallaan Jos täydentäminen voidaan tehdä rikkomatta tehtävän rajoituksia, se suoritetaan Jos saadaan täydellinen vastaus, voidaan lopettaa Jos täydentämistä ei voida tehdä, perutaan viimeksi tehty täydennys ja yritetään toista komponenttia Jos komponentteja ei ole jäljellä, peruutetaan edelleen Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 4/34
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 x ilman täydennystä; } } Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 5/34
Osajoukon summa Joukko A = {a 1, a 2,..., a n }, missä a i :t positiivisia kokonaislukuja Annettu positiivinen kokonaisluku d Tehtävä: Etsi sellainen joukon A osajoukko S, jonka alkioiden summa on täsmälleen d (jos olemassa) Joukossa n alkiota Osajoukkoja 2 n kpl (mukaan lukien tyhjä joukko ja joukko A itse) Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 6/34
Osajoukon summa Ratkaiseminen peruutusmenetelmällä: Järjestetään alkiot kasvavaan suuruusjärjestykseen: a 1 a 2 a n Valitaan alkioita ratkaisuun tässä järjestyksessä Pidetään yllä valittujen alkioiden summaa Vaiheessa i seuraava alkio a i joko valitaan mukaan (summa kasvaa vastaavasti) tai ei valita mukaan (summa ei muutu) (Jatkuu) Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 7/34
Osajoukon summa (Jatkuu) Ennen kuin jatketaan vaiheeseen i + 1, peruutetaan: Jos on edetty jo vaiheeseen i > n Jos summa jäisi alle d:n, vaikka kaikki jäljellä olevat alkiot valittaisiin mukaan Jos alkion a i valitseminen veisi summan yli d:n Jos alkion a i valitseminen antaisi summaksi tasan d: Ratkaisu on löytynyt Otetaan a i mukaan ratkaisuun ja palataan edelliseen vaiheeseen Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 8/34
Osajoukon summa osasumma(a, d, i, summa, n) { if (i > n) return false; if (summa + a[i] +... + a[n] < d) return false; if (summa + a[i] > d) return false; if (summa + a[i] == d) { lisätään alkio a[i] ratkaisuun; return true; } if (osasumma(a, d, i+1, summa+a[i], n)) { lisätään alkio a[i] ratkaisuun; return true; } else return osasumma(a, d, i+1, summa, n); } Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 9/34
Osajoukon summa Algoritmin ensimmäinen kutsu: osasumma(a, d, 1, 0, n) Algoritmi löytää halutunlaisen osajoukon, jos sellainen on olemassa Pahimmassa tapauksessa käydään läpi kaikki mahdolliset osajoukot Θ(2 n ) Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 10/34
Verkon 3-väritys Suuntaamaton verkko G = (N, E), solmujen joukko N, teiden joukko E Jokainen solmu väritetään Solmuilla i ja j oltava eri väri, jos on tie (i, j) Tehtävä: Selvitä, onko annetulle verkolle olemassa sallittu väritys, jossa on käytetty vain kolmea eri väriä Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 11/34
Verkon 3-väritys Verkon solmut 1, 2,..., n Solmun i väri c i (= 1, 2 tai 3) Verkon väritys {c 1, c 2,..., c n } Erilaisia värityksiä on 3 n kappaletta (sekä sallitut että ei-sallitut väritykset) Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 12/34
Verkon 3-väritys Ratkaisupuu: Juurisolmu vastaa osittaista väritystä, jossa verkon solmuille ei ole vielä asetettu mitään väriä Juurisolmulla on kolme lapsisolmua, jotka vastaavat osittaisia värityksiä, joissa verkon solmu 1 on väritetty Näillä on kullakin kolme lapsisolmua, jotka vastaavat osittaisia värityksiä, joissa myös verkon solmu 2 on väritetty Jne. Täydellisen ratkaisupuun alimmalla tasolla n on 3 n lehtisolmua, jotka kuvaavat koko verkon kaikkia mahdollisia värityksiä Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 13/34
Verkon 3-väritys Muodostetaan ratkaisupuuta solmu kerrallaan alkaen juurisolmusta Kun on lisätty uusi solmu puuhun, tarkastetaan vastaava verkon osittainen väritys Jos tämänhetkistä ratkaisupuun solmua vastaava väritys on sallittu ja on edetty johonkin lehtisolmuun saakka: Kaikki verkon solmut on väritetty ja koko verkon väritys sallittu Ratkaisu on löytynyt ja voidaan lopettaa (Jatkuu) Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 14/34
Verkon 3-väritys (Jatkuu) Jos tämänhetkistä ratkaisupuun solmua vastaava osittainen väritys on sallittu, mutta kaikkia verkon solmuja ei ole vielä väritetty: Generoidaan tämänhetkiselle solmulle puuhun uusi lapsisolmu ja siirrytään sinne = Väritetään numerojärjestyksessä seuraava verkon solmu ja jatketaan siitä eteenpäin (Jatkuu) Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 15/34
Verkon 3-väritys (Jatkuu) Jos tämänhetkistä ratkaisupuun solmua vastaava osittainen väritys ei ole sallittu, peruutetaan: Perutaan viimeksi tehty väritys ja väritetään sama verkon solmu uudestaan seuraavana vuorossa olevalla värillä = Ratkaisupuussa palataan edelliselle tasolle ja generoidaan uusi lapsisolmu, josta jatketaan Jos kaikkia värejä on jo yritetty, palataan puussa edelliselle tasolle ja perutaan myös siellä viimeksi tehty väritys Tarvittaessa peruutetaan uudestaan Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 16/34
Verkon 3-väritys väritys(k) { for each (v = 1, 2, 3) { c[k] = v; if (taulukon c väritys sallittu) { if (kaikki solmut väritetty) { löytyi = true; lopetetaan; } else väritys(k+1); } } return; } Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 17/34
Verkon 3-väritys // Algoritmin aloitus for each (k = 1, 2,..., n) c[k] = 0; // mikään solmu ei väritetty löytyi = false; väritys(1); // solmut väritetään // numerojärjestyksessä // Löytyikö ratkaisu? if (löytyi on true) // Löydetty väritys on taulukossa c else // Ei sallittua väritystä Pahimmassa tapauksessa muodostetaan koko ratkaisupuu Θ(3 n ) Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 18/34
Esimerkki A C B E D 1 1 1 1 2 2 Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 19/34
Esimerkki jatkuu 1 1 1 1 1 1 2 3 2 3 2 1 3 1 3 1 3 2 2 1 3 1 2 Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 20/34
Esimerkki: Ratkaisupuu A: B: ei 2 C: 1 D: ei ei 3 E: ei ei ei 1 A: 1 B: ei 2 C: ei ei 3 D: 1 E: ei ei 3 Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 21/34
Pelipuut Kaksi pelaajaa, x ja y Pelaajat tekevät vuorotellen siirtoja (valintoja) Pelipuu: Kukin solmu kuvaa yhtä pelitilannetta Siirto tarkoittaa siirtymistä solmusta johonkin sen lapsisolmuun Juurisolmu kuvaa pelin alkutilannetta Lehtisolmut kuvaavat pelin mahdollisia lopputilanteita Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 22/34
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 2018 Luento 10 To 19.4.2018 23/34
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 2018 Luento 10 To 19.4.2018 24/34
Pelipuut Lopputilanteille voittoarvot on helppo asettaa Muiden solmujen voittoarvot voidaan määrittää lapsisolmujen avulla (minimax-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 puu lehtisolmuista juurisolmuun eli käymällä solmut läpi jälkijärjestyksessä Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 25/34
Esimerkki +1 1 0 1 0 +1 +1 0 0 +1 0 1 1 0 Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 26/34
Pelipuut Vähänkin mutkikkaammassa pelissä pelipuu on liian suuri, jotta kaikki voittoarvot voitaisiin määrittää lopputilanteista alkaen Käytännössä sovelletaan minimax-proseduuria k siirtoa eteenpäin ja arvioidaan pelitilanteiden hyvyyttä jollain heuristisella evaluointifunktiolla eval(t) Suuri arvo on hyvä pelaajan x kannalta, pieni arvo on hyvä pelaajan y kannalta Merkitään: x on MAX-pelaaja y on MIN-pelaaja Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 27/34
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 2018 Luento 10 To 19.4.2018 28/34
Pelipuun läpikäynti payoff(pelitilanne, siirrot, pelaaja) { if (siirrot == 0 tai pelitilanne lopputilanne) return eval(pelitilanne); if (pelaaja == MAX) { arvo = -ääretön; for (kaikilla pelitilanteen seuraajilla s) arvo = max(arvo, payoff(s, siirrot-1, MIN)); return arvo; } else { // pelaaja == MIN arvo = +ääretön; for (kaikilla pelitilanteen seuraajilla s) arvo = min(arvo, payoff(s, siirrot-1, MAX)); return arvo; } } Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 29/34
Läpikäynnin tehostaminen α-β-karsinta: Kaikissa solmuissa ylläpidetään väliaikaista voittoarvoa MAX-pelaajalle väliaikainen voittoarvo on todellisen arvon alaraja (alkutilanteessa ) MIN-pelaajalle väliaikainen voittoarvo on todellisen arvon yläraja (alkutilanteessa + ) Vertaamalla solmun väliaikaista voittoarvoa sen vanhemman väliaikaiseen voittoarvoon tiedetään, kannattaako lapsisolmujen läpikäyntiä jatkaa Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 30/34
Läpikäynnin tehostaminen MAX-pelaajalle α = suurin tähän mennessä laskettu voittoarvo MIN-pelaajalle β = pienin tähän mennessä laskettu voittoarvo Solmu on MAX-solmu: Jos α kasvaa suuremmaksi kuin sen vanhemman β, ei lapsisolmujen läpikäyntiä kannata jatkaa Solmu on MIN-solmu: Jos β menee pienemmäksi kuin sen vanhemman α, ei lapsisolmujen läpikäyntiä kannata jatkaa Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 31/34
Pelipuun läpikäynti: α-β-karsinta payoff_ab(pelitilanne, siirrot, pelaaja, a, b) { if (siirrot == 0 tai pelitilanne lopputilanne) return eval(pelitilanne); if (pelaaja == MAX) { arvo = -ääretön; for (kaikilla pelitilanteen seuraajilla s) { arvo = max(arvo, payoff_ab(s,siirrot-1,min,a,b)); a = max(a, arvo); if (a >= b) break; } return arvo; } else { // pelaaja == MIN arvo = +ääretön; for (kaikilla pelitilanteen seuraajilla s) { arvo = min(arvo, payoff_ab(s,siirrot-1,max,a,b)); b = min(b, arvo); if (b <= a) break; } return arvo; } } Algoritmit 2 Kevät 2018 Luento 10 To 19.4.2018 32/34
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 2018 Luento 10 To 19.4.2018 33/34
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 2018 Luento 10 To 19.4.2018 34/34