Johdatus tekoälyyn, syksy 2011, Teemu Roos Harjoitus 3

Samankaltaiset tiedostot
JOHDATUS TEKOÄLYYN TEEMU ROOS

JOHDATUS TEKOÄLYYN TEEMU ROOS

JOHDATUS TEKOÄLYYN TEEMU ROOS

JOHDATUS TEKOÄLYYN TEEMU ROOS

JOHDATUS TEKOÄLYYN TEEMU ROOS

JOHDATUS TEKOÄLYYN TEEMU ROOS

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1

Ohjelmoinnin perusteet Y Python

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

-Matematiikka on aksiomaattinen järjestelmä. -uusi tieto voidaan perustella edellisten tietojen avulla, tätä kutsutaan todistamiseksi

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

Ohjelmoinnin peruskurssi Y1

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

Java-kielen perusteet

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet )

Python-ohjelmointi Harjoitus 2

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

Insinöörimatematiikka A

JOHDATUS TEKOÄLYYN TEEMU ROOS

Ratkaisu: a) Kahden joukon yhdisteseen poimitaan kaikki alkiot jotka ovat jommassakummassa joukossa (eikä mitään muuta).

b) Määritä myös seuraavat joukot ja anna kussakin tapauksessa lyhyt sanallinen perustelu.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

JOHDATUS TEKOÄLYYN LUENTO 4.

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

Todistusmenetelmiä Miksi pitää todistaa?

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Miten osoitetaan joukot samoiksi?

Luokan sisällä on lista

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

811120P Diskreetit rakenteet

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Algoritmit 2. Luento 13 Ti Timo Männikkö

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Tehtäväsarja I Seuraavissa tehtävissä harjoitellaan erilaisia todistustekniikoita. Luentokalvoista 11, sekä voi olla apua.

Algoritmit 1. Demot Timo Männikkö

Ohjelmointi 2 / 2010 Välikoe / 26.3

11. Javan valintarakenteet 11.1

Ohjelmoinnin peruskurssi Y1

Tutoriaaliläsnäoloista

Ratkaisu: Käytetään induktiota propositiolauseen A rakenteen suhteen. Alkuaskel. A = p i jollain i N. Koska v(p i ) = 1 kaikilla i N, saadaan

Ohjelmoinnin peruskurssi Y1

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

3. Predikaattilogiikka

Mikä yhteyssuhde on?

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

(a) Kyllä. Jokainen lähtöjoukon alkio kuvautuu täsmälleen yhteen maalijoukon alkioon.

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Johdatus matematiikkaan

Javan GUI Scratchaajalle

Johdatus matemaattiseen päättelyyn

ITKP102 Ohjelmointi 1 (6 op)

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

LOGIIKKA johdantoa

Tietorakenteet, laskuharjoitus 1,

Ohjelmoinnin perusteet Y Python

Muuttujat ja kontrolli. Ville Sundberg

JOHDATUS TEKOÄLYYN TEEMU ROOS

Vastaus 1. Lasketaan joukkojen alkiot, ja todetaan, että niitä on 3 molemmissa.

Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }?

Harjoitus 1 -- Ratkaisut

FI3 Tiedon ja todellisuuden filosofia LOGIIKKA. 1.1 Logiikan ymmärtämiseksi on tärkeää osata erottaa muoto ja sisältö toisistaan:

JOHDATUS TEKOÄLYYN TEEMU ROOS

Tietorakenteet, laskuharjoitus 7, ratkaisuja

DIFFERENTIAALI- JA INTEGRAALILASKENTA I.1. Ritva Hurri-Syrjänen/Syksy 1999/Luennot 6. FUNKTION JATKUVUUS

Ratkaisu: (b) A = x 0 (R(x 0 ) x 1 ( Q(x 1 ) (S(x 0, x 1 ) S(x 1, x 1 )))).

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

MS-A0402 Diskreetin matematiikan perusteet

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Ohjelmoinnin perusteet Y Python

Ratkaisu: Yksi tapa nähdä, että kaavat A (B C) ja (A B) (A C) ovat loogisesti ekvivalentit, on tehdä totuustaulu lauseelle

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Luku 1 Johdatus yhtälöihin

Lause 5. (s. 50). Olkoot A ja B joukkoja. Tällöin seuraavat ehdot ovat

Taulumenetelmä modaalilogiikalle K

Salausmenetelmät. Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Kokeellista matematiikkaa SAGE:lla

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

Ohjelmoinnin perusteet Y Python

Salausmenetelmät LUKUTEORIAA JA ALGORITMEJA. Veikko Keränen, Jouko Teeriaho (RAMK, 2006) 3. Kongruenssit. à 3.4 Kongruenssien laskusääntöjä

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

Vaihtoehtoinen tapa määritellä funktioita f : N R on

T Kevät 2009 Logiikka tietotekniikassa: perusteet Laskuharjoitus 8 (Predikaattilogiikka )

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

HY / Matematiikan ja tilastotieteen laitos Tilastollinen päättely II, kevät 2017 Harjoitus 1 Ratkaisuehdotuksia Tehtäväsarja I

Ohjelmoinnin perusteet Y Python

Transkriptio:

Johdatus tekoälyyn, syksy 2011, Teemu Roos Harjoitus 3 Huom: Voit saada tästä harjoituskerrasta max. 6 pistettä. Tehtävä 1. Looginen päättely (2 pistettä) a) (1 piste). Lause A A B (jos A on tosi, on myös A tai B tosi) on esimerkki tautologisesta lauseesta. Lause (A B) A B (eli A tai B ja ei-a ja ei-b) on esimerkki ristiriitaisesta lauseesta. Fermat s viimeinen teoreema sanoo, että lause a, b, c, ja n ovat positiivisia kokonaislukuja, n > 2, ja a n + b n = c n on ristiriitainen. Fermat väitti löytäneensä yksinkertaisen todistuksen teoreemalle vuonna 1637, mutta kesti satoja vuosia ennen kuin Andrew Wiles todisti sen vuonna 1995. (Wilesin todistus ei ole yksinkertainen.) Kysymys päteekö lause NP = P, on ehkä tunnetuin tietojenkäsittelytieteen avoimista ongelmista (printtaamisen lisäksi). Kuten kaikki hyvin määritellyt väitteet, se on välttämättä joko tosi (tautologinen) tai epätosi (ristiriitainen). (Koska väitteessä ei esiinny vapaita muuttujia, kuten lauseessa x > 2 esiintyvä x, lause ei voi olla kontingentti.) Koska lauseen NP = P totuusarvoa ei osata ratkaista, on periaatteessa mahdollista, että se on ratkeamaton, ts. sitä ei voi todistaa todeksi tai epätodeksi. Huomaa että tästä huolimatta lause on joko tosi tai epätosi. b) (1 piste). Kirjoita Prolog-ohjelma, joka esittää seuraavan joukon lauseita: Sokrates omistaa Rekku-koiran. Jos Sokrates omistaa X:n, X on Sokrateen. Rekku-koira on Jekku-pennun isä. Jos X on Y:n isä, X on isä. Jos X on Sokrateen ja X on isä, X on Sokrateen isä. % VERSIO 1 oma(sokrates,rekku). % Sokrates omistaa Rekku-koiran sokrateen(x):-oma(sokrates,x). % jos Sokrates omistaa X:n, X on "Sokrateen" isa(rekku,jekku). % Rekku-koira on Jekku-pennun isa isa(x):-isa(x,y). % Jos X on Y:n isa, X on isa sokrateen_isa(y):-sokrateen(y),isa(y). % Jos X on Sokrateen ja X on isa, % X on Sokrateen isa 1

% VERSIO 2 oma(sokrates,rekku). % Sokrates omistaa Rekku-koiran isa(rekku,jekku). % Rekku-koira on Jekku-pennun isa isa(x):-isa(x,y). % Jos X on Y:n isä, X on isa sokrateen_isa(y):-isa(y),oma(sokrates,y). % Jos X on Sokrateen ja X on isa, % X on Sokrateen isa Kummalla tahansa versiolla, saadaan seuraava tulos. $ prolog GNU Prolog 1.3.0 By Daniel Diaz Copyright (C) 1999-2007 Daniel Diaz?- consult( sokrateen_isa ). compiling /home/ttonteri/teaching/ai/code/sokrateen_isa.pl for byte code... /home/ttonteri/teaching/ai/code/sokrateen_isa.pl:4: warning: singleton variables [Y] for isa/1 /home/ttonteri/teaching/ai/code/sokrateen_isa.pl compiled, 6 lines read - 1023 bytes written, 10 yes?- sokrateen_isa(x). X = rekku yes Tässä vielä kolmas versio, joka osoittaa joitain prologin kummallisuuksia: oma(sokrates,rekku). isa(rekku,jekku). isa(x,y):-oma(y,x),isa(x). isa(x):-isa(x,y). % Sokrates omistaa Rekku-koiran % Rekku-koira on Jekku-pennun isa % Jos Y omistaa X:n ja X on isa, % X on Y:n isä isa(x):-isa(x,y). % Jos X on Y:n isä, X on isä (Erikoisuus numero 1: Molemmat ISA(.,.) lauseet on sijoitettava peräkkäin, ennen lausetta ISA(X):-isa(X,Y)., koska jälkimmäisessä seurauksena oleva ISA(.)-predikaatti tulkitaan eri predikaatitksi kuin ISA(.,.), ja lauseiden, joiden seurauksena on tietty predikaatti, on esiinnyttävä peräkkäin.) Kun ajetaan tämä ohjelma, saadaan seuraava tulos. $ prolog GNU Prolog 1.3.0 By Daniel Diaz Copyright (C) 1999-2007 Daniel Diaz?- consult( sokrateen_isa ). compiling /home/ttonteri/teaching/ai/code/sokrateen_isa.pl for byte code... /home/ttonteri/teaching/ai/code/sokrateen_isa.pl:4: warning: singleton variables [Y] for isa/1 /home/ttonteri/teaching/ai/code/sokrateen_isa.pl compiled, 6 lines read - 1023 bytes written, 10 yes?- isa(x,sokrates). 2

X = rekku? ; X = rekku? ; X = rekku? ; (Erikoisuus numero 2: Painamalla ; uudelleen ja uudelleen, tulee aina uudeksi ratkaisuksi X = rekku. Prolog-tulkki siis tarjoaa kysymykseen loputtomasti samaa vastausta.) Tehtävä 2. Shakki. (1-2 pistettä) a) (1 piste). Toteuta valmiina annettuun runkoon heuristinen evaluointifunktio (luokka YourEvaluator), joka arvioi shakkilaudan tilanteen. Funktion tulee palauttaa sitä suurempi arvo, mitä luultavammin peli päättyy valkean voittoon. Luokan OurEvaluator (a.k.a. Deep Glue) lähdekoodi on esitetty kuvassa 1. b) (1 piste). Katso http://tmtynkky.users.cs.helsinki.fi. Rankkaus on toteutettu ns. Elo-rankingin avulla (ks. luennon 8 luentokalvojen toiseksi viimeinen sivu tai http://en.wikipedia.org/wiki/elo_rating_system.) 3

public class OurEvaluator extends Evaluator { static double blackboosttable [][] = { {0,0,0.15,0.2,0.2,0.15,0,0, {0,0,0.2,0.3,0.3,0.2,0,0, {0,0,0.15,0.1,0.1,0.15,0,0, {0,0,0,0,0,0,0,0 ; static double whiteboosttable [][] = { {0,0,0.15,0.1,0.1,0.15,0,0, {0,0,0.2,0.3,0.3,0.2,0,0, {0,0,0.15,0.2,0.2,0.15,0,0, {0,0,0,0,0,0,0,0 ; public double eval(position p) { int offsetx = 0; int offsety = 0; if (p.bcols == 6) offsetx = 1; if (p.brows == 6) offsety = 1; double ret = (Math.random()-.5); for(int x = 0; x < p.board.length; ++x) { for(int y = 0; y < p.board[x].length; ++y) { if(p.board[x][y] == Position.Empty) continue; if(p.board[x][y] == Position.WKing) ret += 1e9; if(p.board[x][y] == Position.WQueen) ret += 9; if(p.board[x][y] == Position.WRook) ret += 5.25; if(p.board[x][y] == Position.WBishop) ret += 3.25; if(p.board[x][y] == Position.WKnight) ret += 3; if(p.board[x][y] == Position.WPawn) ret += 1; if(p.board[x][y] == Position.BKing) ret -= 1e9; if(p.board[x][y] == Position.BQueen) ret -= 8.5-.05*y; if(p.board[x][y] == Position.BRook) ret -= 4.75-.05*y; if(p.board[x][y] == Position.BBishop) ret -= 2.75-.05*y; if(p.board[x][y] == Position.BKnight) ret -= 2.5-.05*y; if(p.board[x][y] == Position.BPawn) ret -= 1.-.1*y; if(position.iswhitepiece(p.board[x][y])) { ret += whiteboosttable[y+offsety][x+offsetx]; else if(position.isblackpiece(p.board[x][y])) { ret -= blackboosttable[y+offsety][x+offsetx]; return ret; Figure 1: OurEvaluator.java 4

Tehtävä 3. Probabilistinen päättely (1-2 pistettä) a) (1 piste). Autotehtävä: #!/usr/bin/python import random pa = 0.9 pra = 0.9 psa = 0.95 pb = 0.95 pkab = 0.99 plk = 0.99 N = 100000 class Monikko: [A,R,S,B,K,L] = [False,False,False,False,False,False] kasa=[] for i in range(n): m = Monikko() if random.random() < pa: m.a = True if m.a and random.random() < pra: m.r = True if m.a and random.random() < psa: m.s = True if random.random() < pb: m.b = True if m.a and m.b and random.random() < pkab: m.k = True if m.k and random.random() < plk: m.l = True kasa.append(m) cnotl = len([m for m in kasa if not m.l]) cnotanotl = len([m for m in kasa if not m.a and not m.l]) cnotbnotl = len([m for m in kasa if not m.b and not m.l]) print P[not A not L]: %.1f%% % (100.*cnotAnotL/cnotL) print P[not B not L]: %.1f%% % (100.*cnotBnotL/cnotL) cnotlnotr = len([m for m in kasa if not m.l and not m.r]) cnotanotlnotr = len([m for m in kasa if not m.a and not m.l and not m.r]) cnotbnotlnotr = len([m for m in kasa if not m.b and not m.l and not m.r]) print P[not A not L, not R]: %.1f%% % (100.*cnotAnotLnotR/cnotLnotR) print P[not B not L, not R]: %.1f%% % (100.*cnotBnotLnotR/cnotLnotR) (Esimerkki valitettavasti vain pythoniksi. hyvin.) Toivottavasti osaat tulkita sitä riittävän Generoi näin 100000 kokonaista monikkoa. Laske sen jälkeen kuinka suuressa osassa monikoista, joissa L = 0, pätee A = 0. Entä kuinka suuressa osassa monikoista, joissa L = 0, pätee B = 0? Esitä tulkinta saamillesi tuloksille. 5

Laske myös kuinka suuressa osassa generoimiasi monikoita, joissa pätee L = 0 ja R = 0, pätee A = 0. Entä kuinka suuressa omassa monikoista, joissa pätee L = 0 ja R = 0, pätee B = 0? Vertaa näitä tuloksia edellä saamiisi ja esitä tulkinta havainnoillesi. $./auto.py P[not A not L]: 61.7% P[not B not L]: 31.1% P[not A not L, not R]: 94.2% P[not B not L, not R]: 9.2% Tulkinta: Jos auto ei liiku, on n. 61.7% todennäköisyydellä akussa vikaa ja n. 31.1% todennäköisyydellä bensatankki tyhjä. Jos taas tiedetään, että radio ei soi, ovat ko. todennäköisyydet n. 94.2% ja n. 9.2%. Radion toimimattomuus siis viittaa akkuvikaan, jolloin ei ole syytä epäillä että bensa olisi lopussa. b) (1 piste). Hälytintehtävä: #!/usr/bin/python import random pm = 0.014 pr = 0.0062 phnotmnotr = 0.039 phmnotr = 0.84 phnotmr = 0.918 phmr = 0.974 N = 100000 class Monikko: [M,R,H] = [False,False,False] kasa=[] for i in range(n): m = Monikko() if random.random() < pm: m.m = True if random.random() < pr: m.r = True if not m.m and not m.r and random.random() < phnotmnotr: m.h = True if m.m and not m.r and random.random() < phmnotr: m.h = True if not m.m and m.r and random.random() < phnotmr: m.h = True if m.m and m.r and random.random() < phmr: m.h = True kasa.append(m) ch = len([m for m in kasa if m.h]) crh = len([m for m in kasa if m.r and m.h]) cmrh = len([m for m in kasa if m.m and m.r and m.h]) print P[R H]: %.1f%% % (100.*cRH/cH) print P[R M,H]: %.1f%% % (100.*cMRH/cRH) Generoi sitten 100000 kokonaista kolmikkoa. Laske kuinka suuressa osassa monikkoja, joissa H = 1, pätee R = 1. Laske myös kuinka suuressa osassa monikkoja, joissa pätee sekä H = 1 että M = 1, pätee lisäksi R = 1. 6

Esitä tulkinta havainnoillesi. Kumpi edellä mainituista osuuksista on suurempi? Osaatko sanoa mitä se merkitsee? Ajetaan esimerkkiajo: $./earthquake.py P[R H]: 10.3% P[R M,H]: 2.5% Tulkinta: Kun hälytin soi, on ryöstön todennäköisyys n. 10.3%. Jos lisäksi tiedetään, että alueella on ollut maanjäristys, laskee ryöstön todennäköisyys n. 2.5%:iin. Kyseessä on ns. explaining away -ilmiö, eli havainnoille löytyy vaihtoehtoinen selitys (maanjäristys), jonka takia muita selityksiä ei tarvita. 7