Lär datorn att spela luffarschack Laboration utvecklad av: Sofia Max och Mårten Björk, 2002 Reviderad Fredrik Linusson 2006 Datorlaborationen tar ca 60 minuter. Ägna 10 minuter till den första delen och 50 minuter till den andra. Artificiell intelligens: Konsten att få en dator göra smarta saker Inom datavetenskapen finns många spännande områden och ett av dem är artificiell intelligens. Artificiell intelligens är en vetenskap som försöker få datorer att uppföra sig intelligent på olika sätt. Du har säkert stött på artificiellt intelligens i din vardag utan att du vetat om det. Har du någon gång ringt till SJ:s biljettbokningssystem och pratat med den manlige automatsvararen? Det som gör honom intelligent är att han känner igen mänskligt tal. När du säger att du vill åka från Göteborg till Linköping kommer han att översätta detta till ett språk som datorn förstår och sedan meddela dig vilka tåg som finns att välja på. Taligenkänning är ett av de många delområden som finns inom artificiell intelligens. Andra områden inom artificiell intelligens är till exempel datorseende. Här på universitetet har en helikopter utrustats med datorseende och program så att den kan flyga utan att krascha och dessutom följa objekt på marken. Det område som vi ska syssla med idag är ett område som artificiell intelligens är mycket framgångsrik inom: Att spela spel. Garry Kasparov är världens bästa schackspelare och har flera gånger utmanats av datorn Deep Blue. Schack anses vara en av de mest intelligenskrävande spelen i världen och Deep Blue förlorade också den första matchen mot Kasparov som gick av stapeln 1996 och bestod av sex partier. År 1997 gick ännu en match av stapeln och denna gång vann Deep Blue över Kasparov. Händelsen chockade experterna som ansåg sig ha fått en glimt av intelligens hos Deep Blue: "This was not a computer-style game. This was real chess!" "Deep Blue made any moves that were based on understanding chess, on feeling the position. We all thought computers couldn't do that." Idag ska du få lära dig en teknik som är mycket likt den teknik som Deep Blue använde för att slå Kasparov. Spela luffarschack mot din kompis Den version av luffarschack vi ska spela idag är den som bara har tre gånger tre rutor. När vi i fortsättningen talar om luffarschack är det denna storlek vi menar. Luffarschack är inte alls lika komplicerat som schack men det är ändå en utmaning för en dator att spela luffarschack. Människor brukar tycka att luffarschack är ett mycket simpelt spel och att det inte krävs speciellt mycket intelligens för att inte förlora ett parti luffarschack. Det gör det kanske inte, men en dator kan inte tänka själv och behöver följa tydliga instruktioner för att kunna spela lika bra som en människa. Människoregler för luffarschack: Kryss (x) börjar alltid. Varannan gång är det ringspelarens (o) tur och varannan gång krysspelarens tur. När kryss eller ring fått tre kryss/ringar i rad avslutas spelet och den som fick tre i rad har vunnit. Om spelplanen fylls innan någon har vunnit blev spelet oavgjort. Uppgift 1: Spela luffarschack mot din kompis Starta spelet genom att skriva schack i kommandofönstret (det textfönster som var öppnat när ni satte er vid datorn). Om du vill avbryta ett program i kommandofönstret så tryck control + c. Spela ett par partier luffarschack mot din kompis och fundera över hur ni tänker när ni sätter ut era kryss och ringar. Snart kommer ni att få göra datorregler för luffarschack - dessa måste vara mycket tydliga. Lär datorn att spela luffarschack DEL 1 (Ett tips är att hålla på i max 10 minuter, för sedan skall du gå vidare till lösningen.) Nu ska du lära datorn att spela luffarschack genom att berätta för den vilka regler den ska följa. Eftersom datorn inte är lika intelligent som du måste du vara mycket tydligare än de människoreglerna du läste i förra avsnittet. Hur tydlig måste du vara för att datorn ska förstå? Du förstår abstrakta regler såsom "Den som får tre symboler i rad har vunnit". Med hjälp av denna regel skapar du i ditt huvud fler regler såsom: "Om min motståndare har två i rad så måste jag stoppa den", "Om jag har två i rad när det är min tur så sätter jag en markering så att jag får tre i rad". Ur dessa regler kan du sedan skapa ytterligare mer specifika regler: "Om ruta 1,1 och 1,2 är markerade med ett kryss så sätt en ring i ruta 1,3." Datorn kan inte själv skapa en ny regel utifrån en gammal regel. Det enda den känner till är om en ruta är tom, markerad med ett kryss eller markerad med en ring. Regeln "Om ruta 1,1 och 1,2 är markerade med ett kryss så sätt en ring i ruta 1,3." kan datorn förstå - den är tillräckligt tydlig. När du formulerar regler är det viktigt att komma ihåg att datorn alltid spelar med ring (o). Du försöker alltså hela tiden formulera regler som blir till ringens fördel. De regler vi ska använda oss av är så kallade OM-SÅ regler. En regel kan bestå av ett eller flera villkor. Låt oss titta på regeln: OM ruta 1,1 är markerad med kryss och OM ruta 1,2 är markerad med ett kryss SÅ sätt en ring i ruta 1,3. (villkor 1) (villkor 2) (åtgärd) De tre raderna bildar en regel. De två första raderna kallas villkor och den sista raden kallas åtgärd. Datorn utför åtgärden (och följer därmed regeln) om både villkor 1 och villkor 2 är sanna. För att datorn ska följa regeln (dvs sätta en ring i ruta 1,3) så måste både villkor 1 och villkor 2 vara sanna (det måste vara ett kryss i både ruta 1,1 och ruta 1,2). Om det är ett kryss i ruta 1,1 men inte i ruta 1,2 så kommer inte datorn att följa regeln. Innan du börjar att skapa egna regler åt datorn ska du få lära dig att skapa en regel och se så att datorn följer den. Nedanstående bild föreställer programmet som du ska använda för att skapa regler. Längst upp i fönstret ser du nu två rader. Den första raden avslutas med en knapp: skapa villkor. Vi bryr oss inte om denna knapp just nu. Den andra raden avslutas med en knapp: skapa regel. Om du vill skapa en regel med bara ett villkor trycker du direkt på skapa regel när du har valt villkor och åtgärd. Uppgift 2: Skapa en regel med ETT villkor åt datorn Om du inte har stängt det förra fönstret där du spelade luffarschack mot en kompis, så gör det nu. Starta sedan programmet som du ska använda för att skapa regler åt datorn genom att skriva regel i kommandofönstret. Skapa nu regeln: OM ruta 2,2 är tom SÅ sätt en ring i ruta 2,2 Denna regel kommer få datorn att försöka sätta en ring i mittenrutan om den är ledig. Testa nu om du gjorde rätt genom att trycka på knappen spela. Då kommer du få upp ett fönster med en spelplan. Längst ner i fönstret kommer du att få meddelanden om vilka regler datorn använder för att sätta ut ringar. Spela nu mot datorn. Fungerade regeln? Som du kanske märkte så kommer datorn att välja den första lediga rutan på spelplanen (vänster till höger, rad för rad) när din regel inte kan användas. Om du vill skapa en regel som har fler än ett villkor måste du använda dig av knappen skapa villkor för alla villkor utom det sista. När du kommer till det sista villkoret i regeln väljer du även vilken åtgärd datorn ska göra och trycker sedan på skapa regel. Uppgift 3: Skapa en regel med TVÅ villkor åt datorn. Anta att nedanstående situation har uppstått i ett parti luffarschack och vi vill stoppa x från att vinna. Formulera en regel åt datorn för att hindra situationen och spela sedan mot datorn för att kontrollera att den följer regeln. Nu när du har lärt dig att skapa regler med ett eller flera villkor är det dags att förstå hur datorn agerar när det finns flera regler. Anta att du har definierat tre regler innan du börjar spela. Varje gång det är datorns tur att spela kommer den att gå igenom regel för regel, uppifrån och ner, tills den hittar en regel där alla villkor är uppfyllda. Därför är ordningen på dina regler mycket viktig. Så fort datorn har hittat en regel som den kan följa kommer den nämligen inte att undersöka någon annan regel. De viktigaste reglerna ska därför ligga först. Om du vill flytta om ordningen på reglerna kan du markera en regel som du vill flytta genom att klicka på den och sedan använda upp och ner pilarna för att flytta regeln. Du kan även ta bort en regel genom att markera den och sedan klicka på papperskorgen till vänster om listan med regler. Nu är du redo att lära datorn att spela luffarschack! Uppgift 4: Lär datorn att spela luffarschack med hjälp av regler Nu ska du försöka tänka ut vilka regler som behövs för att datorn inte ska förlora i luffarschack mot dig. Observera att målet med den här uppgiften inte är att göra en perfekt datorspelare. När du känner att du har förstått möjligheterna med denna tekniken kan du fortsätta laborationen. Skapa regler och provspela mot datorn. Förlorade datorn? Lägg till fler regler och tryck spela igen. Det är viktigt att trycka på spela när du lagt till nya regler, annars kommer datorspelaren att använda sig av den gamla regeluppsättningen. Fortsätt en stund och försök sedan vinna mot någon annan laborationsgrupp som också definierat klart sina regler. Spela mot varandras datorspelare och försök få dem att förlora. Blev din spelare slagen någon gång? Är detta en bra teknik? Varför, varför inte? Lär datorn att spela luffarschack DEL 2 (Dethär tar lite längre tid så gnugga geniknölarna och börja läsa. Lösningen väntar på dig). Nu har du provat att göra en datorspelare genom att skapa OM-SÅ regler. I denna del av laborationen ska du få prova ett annat sätt. Varför då? Jo, även om det går att skapa en perfekt datorspelare i luffarschack med hjälp av OM-SÅ satser så finns det flera nackdelar med denna teknik: 1. Det tar lång tid att tänka ut alla regler. 2. Du kan inte vara säker på att du täckt in alla möjligheter med dina regler. 3. Dina regler är mycket begränsade. Tänk om brädet skulle ökas till 4x4 rutor? Då måste du börja om från början med dina regler. Luffarschack är ett mycket enkelt spel. Anta att du skulle försöka använda OM-SÅ regler för att göra en datorspelare i schack. Där finns 64 rutor, 32 pjäser som rör sig på olika sätt och många regler att ta hänsyn till. Dessutom måste din spelare försöka planera många drag i förväg för att kunna bli en bra spelare. Med luffarschack behöver du inte kunna se mer än ett eller två drag i förväg. Den teknik du ska få lära dig nu har ingen av de tre nackdelarna som räknades upp ovan. Med den här tekniken kommer datorn att göra det största arbetet med att tänka ut en strategi. Datorn kommer att täcka in alla möjligheter och därmed spela perfekt: aldrig förlora en match. Det skulle dessutom vara enkelt att förstora spelplanen till fler än nio rutor. Hur kan vi då skapa en perfekt luffarschacksspelare? För att kunna skapa denna måste du först lära dig lite om en ofta använd struktur inom datavetenskapen som kallas träd. Träd Släktträd känner du säkert till. Låt oss titta på Nalle-Majas släktträd. Vi börjar med att införa några begrepp: NOD GREN ROT LÖV VÄG Varje björn utgör en nod i trädet Kallas alla streck i trädet Nalle-Majas nod utgör trädets rot då alla grenar strålar utifrån denna nod. De björnar som är högst upp och inte har någon björn över sig kallas löv. En väg genom trädet börjar i en rot, går igenom ett antal noder och slutar i ett löv. Till exempel är Nalle-Maja->Bamse->Hebbe->Johan Hilmer en väg genom trädet. Släktträdet kan används till att göra sökningar. Att göra en sökning innebär att följa en viss väg i trädet utifrån vissa kriterier. En sökning börjar vanligtvis vid trädets rot (Nalle-Maja) och avslutas när det sökta objektet hittats. Vid varje nod så väljs en av de grenar som leder uppåt i trädet. I varje nod väljs en av grenarna utifrån en regel. Olika regler används i olika träd. Reglerna krävs för att en sökning ska kunna genomföras. I detta släktträd gäller följande regler: "Om du vill ha nodens far så välj den vänstra grenen. Om du vill ha nodens mor så välj den högra grenen". Målet med en sökning i trädet kan till exempel vara att hitta Nalle-Majas farmor. Då börjar vi sökningen i roten och tar vårt första beslut genom att använda regeln ovan. Vi vill först ha NalleMajas far och tar därför vänstra grenen vilket leder oss till Bamse-noden. Nu vill vi ha Bamsenodens mor och väljer därför enligt regeln den högra grenen. Nu är vi klara med sökningen och har hamnat i Viktoria-noden. Viktoria är alltså Nalle-Majas farmor. Det som är viktigt att komma ihåg från detta exempel är: Alla beslut tas i noderna och ett beslut leder till att en ny nod väljs. I den nya noden tas ett nytt beslut och så vidare. Det första beslutet tas alltid i roten. Uppgift 5 Sök i Nalle-Majas släktträd. a) Använd nu ovanstående regel för att hitta Nalle-Majas farmors far b) Vem är Nalle-Majas mormors mormor? c) Vilka är trädets löv? Inom datavetenskapen är träden ofta upp-och-ner-vända och då hamnar roten längst upp och löven längst ner. Här är ett exempel på ett sådant träd: Här representerar varje ring en nod och roten är den ring som innehåller bokstaven S. I detta träd söker du enligt följande regel: "Om du vill ha en bokstav som kommer före nodens i alfabetet så välj den vänstra grenen Om du vill ha en bokstav som kommer efter noden i alfabetet så välj den högra grenen" Ett begrepp som är viktigt att känna till är djup. Varje nod ligger på ett visst djup. Roten ligger alltid på djup 0. Nod O och T på bilden ligger på djup ett, H och U på djup två osv. Det totala djupet i trädet är fyra. Nu ska vi införa ytterligare två benämningar som används i samband med träd: Barn och förälder. Roten är förälder till alla noder på djup ett. Noderna på djup ett är barn till roten och föräldrar till noderna på djup två och så vidare. En nod kan alltså vara både förälder och barn på en gång. Träd kan se ut på flera olika sätt och det är viktigt att du kan känna igen vad som är nod, gren, rot och löv i de träd som du arbetar med. En struktur som många är bekant med är filstrukturen i en dator, det vill säga hur filerna lagras på hårddisken. Olika filer ligger i olika kataloger och vissa kataloger innehåller nya kataloger med fler filer och så vidare. Denna struktur kan också kallas för ett träd. Varför blanda in ett träd i uppgiften att göra en luffarschacksspelande dator? Jo - trädet är nyckeln till framgång. Genom att använda ett träd för att spela luffarschack kommer datorn att bli en perfekt spelare som alltid gör det bästa draget! Nu ska du få veta varför det blir så. Luffarschackets träd Vi ska här koppla samman begreppet träd med luffarschacksspelet. Nedanstående bild är en del av luffarschackets träd. Vi börjar med att identifiera vad en nod i detta träd betyder. Varje nod i trädet representerar ett möjligt utseende på brädet under spelets gång. Roten representerar brädet innan partiet har börjat. Noderna på djup ett representerar alla de möjliga utseende på bräden som kan uppstå efter att kryss har gjort sitt första drag. Alla noder på djup två visas inte, det skulle ta för mycket plats. Här visas bara alla möjliga utseende på brädet när ring har gjort sitt första drag om kryss satte sitt första kryss i mitten på brädet. Djupet berättar hur många drag som har gjort hittills. I varje nod tas alla möjliga fortsättningar fram för nästa drag. När någon har vunnit (tre kryss eller tre ringar) så fortsätter inte förgreningen. Ett bräde där någon vunnit är därför ett löv. Även ett fullt och oavgjort bräde är ett löv. I detta träd är endast ett av löven utritade. Datorn kommer att börja sökningen i roten. Det är här som spelet börjar - med en tom spelplan. Det första som händer är att människan gör ett drag. När en spelare gör ett drag så motsvaras detta i trädet av att gå till en ny nod på ett djup längre ner. Om människan placerar ett x i mitten kommer datorn att flytta sig till den noden som representerar denna spelplan. Nu är det datorns tur att välja nod (att göra ett drag). Datorn kommer nu att försöka välja en nod som leder till vinst. Hur den vet detta kommer du snart att få lära dig. Trädet är alltså till för att hjälpa datorn att hålla ordning på hur spelet utvecklas. Uppgift 6: Skapa barnen till den markerade noden Nu ska du visa att du har förstått hur sökträdet fungerar. Rita därför ut (i bilden på föregående sida) alla barn på djup tre till noden som pilen pekar på. Uppgift 7: Hur många noder blir det i trädet? (frivillig uppgift) Du behöver inte göra trädet själv. Datorn kommer att göra det själv lite senare. Dock ska du få försöka räkna ut hur många noder som trädet kommer att bestå av. Det finns en kalkylator på datorn som du kan använda. Högerklicka på bakgrunden, då får du upp en meny där du väljer Program->Kalkylator. Bortse ifrån att ett spel avslutas när någon har vunnit. Anta att alla luffarschackspartier kommer att fortsätta tills spelplanen är full. Detta innebär att alla löv kommer att befinna sig på djup nio (då har nio drag gjorts). Hur många noder kommer det att bli i trädet? Ledning: På djup två finns det 9*8 noder. MinMax-tekniken Hur ska nu datorn använda sig av sökträdet? Datorn kommer att börja i roten. När människospelaren har gjort det första draget så kommer datorn att gå till den nod som motsvarar detta drag - det vill säga till den spelplan som ser ut precis som den riktiga spelplanen efter detta första drag. Datorn kommer sedan välja en gren som leder till en spelplan på djup två (kom ihåg att djupet berättar hur många drag som har gjorts). Sedan är det människospelarens tur att spela. När människospelaren har gjort sitt drag så flyttar datorn till den nod som nu har den rätta spelplanen. Så håller det på tills någon har vunnit eller tills spelplanen är full. Då befinner sig datorn i ett löv. Men hur väljer datorn gren? Datorn vill förstås hela tiden välja den nod som ger den störst chans att vinna. För att förutspå detta kan MinMax-tekniken användas. MinMax-tekniken används i två steg: 1. Varje nod i luffarschacksträdet markeras med ett av värdena -1, 0 eller 1. För att göra dessa markeringar används två olika regler: En Min-regel och en Max-regel. 2. Det nya trädet med värdena används tillsammans med Max-regeln för att spela mot en människa. Steg ett Varje nod i trädet ska tilldelas ett värde. Det finns tre olika värden att välja på: -1, 0 och 1. De olika värdena betyder olika saker: -1 Betyder vinst för kryss 0 Betyder oavgjort 1 Betyder vinst för ring Om vi börjar med att titta på löven så är det inte så svårt att se vilka värden de ska ha. Ett löv motsvarar ju en spelplan efter att spelet har tagit slut. Genom att titta på vilken spelplan som finns i varje löv så kan vi bestämma värdena i löven till -1 (vinst för kryss), 0 (oavgjort) eller 1 (vinst för ring). Alla löv får på detta sätt ett värde. Nedan ser du en del av luffarschacksträdet där några löv har fått värden. Om datorn redan i början av spelet på något sätt kunde veta hur den skulle kunna komma till ett löv med värdet 1 så skulle den vinna. Problemet är att datorn inte har kontroll över hela spelet, bara sina egna drag. Det finns dock ett sätt att förutspå även de andra dragen: Att anta att den andra spelaren alltid spelar så bra som möjligt. I löven har vi information om vem som vann spelet. Nu tittar vi på de noder som ligger på en nivå över löven, det vill säga föräldrarna till löven. Här är det inte lika enkelt att sätta ut värdena och det är nu som Min- och Max-reglerna kommer in. Min-regeln: "Välj så lågt värde som möjligt för att vinna." Max-regeln: "Välj så högt värde som möjligt för att vinna." Max-regeln kommer att användas när vi är på djup 1, 3, 5, 7 eller 9 (udda djup) vilket, i ett pågående spel, skulle motsvaras av att datorn gör sitt drag. På motsvarande sätt används Minregeln när vi är på djup 0, 2, 4, 6 eller 8 (jämnt djup) och människan gör sitt drag. Om vi nu vill tilldela ett värde till en nod som ligger på nivån över lövnivån så kan vi denna gång inte bara se på spelplanen i noden för att avgöra vilket värde som noden ska få. I ett ickelöv så är spelpartiet inte ännu avslutat och vi kan därför inte direkt säga vem som vann eller om det blev oavgjort. Vad vi istället kan göra är att titta på den aktuella nodens barn. Barnen representerar nästföljande drag, det vill säga vilka fortsättningar som är möjliga på det aktuella spelpartiet. När vi tilldelar värden till icke-löv så måste vi ju på något sätt se framåt i spelet, det vill säga titta på barnnoderna. För att ge noden ett värde tittar vi först på den aktuella nodens djup. Baserat på vilket djup vi befinner oss på så bestämmer vi sedan värdet på noden genom att antingen ta Max-värdet av barnnoderna eller Min-värdet av barnnoderna. Detta värde placeras i föräldernoden. Krysspelaren vill ju helst gå till en nod med värdet -1 och ringspelaren vill ju helst gå till en nod med värdet 1. Genom att successivt bestämma värdena på noderna från löven och uppåt så kan vi tillslut ge varje node ett värde, ända upp till rotnoden. Titta på bilden nedan. Här undersöker vi en nod på djup 7. Noden har två barn med värdena -1 och 1. Vilket värde ska noden på djup 7 ha? Eftersom djup 7 är ett udda djup ska max-regeln tillämpas. Detta innebär att vi ska ta det största av barnnodernas värden. Noden får alltså värdet 1. Ibland så står valet inte mellan -1 och 1 utan kanske mellan -1 och 0 eller 0 och 1. Oavsett vilket så är det alltid bra för krysspelaren att välja det minsta talet och för ringspelaren att välja det största. Oavgjort är bättre än förlust och vinst är bättre än både oavgjort och förlust. Om du nu har förstått att alla noder representerar ett utseende på spelplanen och att alla noder också har ett värde som berättar vem som håller på att vinna spelet, eller har vunnit spelet - då har du nästan förstått hela MinMax-tekniken. Steg två Det enda som återstår nu är att utreda hur datorn använder sig av trädet när den ska spela mot en människa. Vi har redan berättat hur det börjar: Människospelaren gör det första draget och datorn går då från rotnoden till den nod som innehåller den aktuella spelplanen. Sedan ska datorn välja ett drag - nu kommer trädet att användas. Datorn är ringspelare och Max-regeln kommer att användas varje gång det är datorns tur. Datorn tittar på den aktuella nodens barn och väljer enligt Max-regeln ut det barn som har högst värde. I många fall så har flera barn samma värde, det kan till exempel finnas åtta barn att välja på som alla har värdet 0, då spelar det ingen roll vilket barn som väljs - alla drag är lika bra. När det inte spelar någon roll så kommer datorn att välja den första barnnoden (bara för att det är enkelt att göra så). När datorn har valt ett drag så är det människans tur igen. Så här fortsätter det tills någon har vunnit eller tills spelplanen är full. Det är bara det att nu kan inte datorn förlora längre! Fundera över varför det är så. Uppgift 8: Fyll i siffrorna i trädet a) Nedanstående träd är en övning i att förstå MinMax-tekniken. Trädet representerar ej ett luffarschacksspel. Börja i löven och fyll i värden uppåt i trädet. Kom ihåg att Max-regeln väljer det största av värdena och att Min-regeln väljer det minsta av värdena. b) Har du förstått tanken bakom MinMax-tekniken? Försök att med egna ord redogöra för varför Min-regeln används i vartannat steg och Max-regeln i vartannat. Diskutera med din labbkompis! Uppgift 9: Använd ditt träd a) Du har fyllt i värdena i trädet genom att anta att båda spelarna alltid kommer att välja det för spelarna bästa alternativet för egen del. Anta att detta stämmer. Vad betyder då värdet i roten? b) Ringa in den del av sökträdet som kommer att användas om både Min och Max-spelarna alltid väljer det för dem bästa alternativet. c) Om båda spelarna vore datorer skulle vi inte behöva ett speciellt stort sökträd. Men eftersom Min-spelaren är en mänsklig spelare som inte har gjort något sökträd så kan vi inte lita på att Min-spelaren alltid väljer det bästa alternativet. Detta innebär att vi inte vet vilket löv spelet kan resultera i. Med denna bakgrund, vad betyder då värdet i roten? d) I ovanstående träd kan en spelare i varje nod välja mellan två grenar: höger gren eller vänster gren. Varje spelare kommer att göra två drag var innan spelet är slut. Anta att du är Maxspelare och att Min-spelarens två drag är: höger, höger. Kommer du att vinna, förlora eller spela oavgjort? e) Anta att Min-spelarens två drag är vänster, höger. Kommer du att vinna, förlora eller spela oavgjort? Använd MinMax-tekniken på hela luffarschacksträdet Nu ska du få sätta ut MinMax-värden på hela luffarschacksträdet. Om du räknade rätt i uppgift 7 så kom du fram till att hela luffarschacksträdet består av 986 410* noder. När datorn skapar trädet blir det dock inte riktigt lika många noder. Som du minns gjorde du en förenkling för att det skulle bli enklare att räkna. Du antog att alla spelplaner fylls upp, men datorn fyller inte upp alla spelplaner. Om någon har vunnit (kan ju ske redan efter sex drag) förgrenas inte noden mer. Detta innebära att i själva verket blir det inte fler än 549 946 noder. Om du fyller i ett värde per sekund dygnet runt kommer det att ta dig närmare en vecka att fylla i alla värden. För att du ska slippa det finns ett program där du kan berätta för datorn hur den själv ska fylla i alla värden. Nu har du antagligen förstått hur min-max-tekniken och då är det dags att överlåta hästjobbet åt datorn. Uppgift 10: Berätta för datorn hur den ska fylla i luffarschacksträdet Om du inte har stängt fönstret från förra uppgiften så gör det nu. Skriv minmax i ett kommandofönster. Det första som händer är att datorn skapar trädet med alla noder. På samma sätt som du skapade regler förra gången ska du nu skapa regler till datorn för att fylla i min-maxvärden. Till skillnad från förut krävs det ett fåtal regler för att skapa en perfekt spelare. Tänk på att rotdjupet ligger på djup 0 och det är minspelaren som börjar. Sedan är det bara att sätta igång. När du är färdig med dina regler trycker du på spela. Det första som händer är att datorn skapar trädet. När trädet är skapat kommer datorn att använda dina regler för att fylla i värden i trädet. Om din regeluppsättning är komplett och felfri så kommer datorn alltid att kunna välja rätt väg i trädet och aldrig förlora mot dig! Lycka till med att skapa den perfekta spelaren! *) 1 + 9 + 9x8 + 9x8x7 + 9x8x7x6 + 9x8x7x6x5 + 9x8x7x6x5x4 + 9x8x7x6x5x4x3 + 9x8x 7x6x5x4x3x2 + 9x8x7x6x5x4x3x2x1 Grattis till dig som lyckats skapa artificiell intelligens! Idag har du lyckats lära datorn att spela luffarschack. Det kanske inte gick så bra med dina egna regler, men när du fick lära dig min-max-tekniken lyckades du skapa en perfekt spelare. Luffarschack är som sagt ett mycket enkelt spel, men trots detta blev trädet enormt, mer än en halv miljon noder. Som du märkte tog det ungefär 45 sekunder för datorn att skapa trädet. Bara genom att öka spelplanen till 4x4 rutor får vi ungefär 30 biljoner noder! Detta skulle ta datorn 80 år att räkna ut. Ett bräde med 5x5 rutor skulle ta ungefär en miljon år. Schack som är ett mycket mer komplicerat spel än luffarschack kan därför inte använda min-max-tekniken på samma sätt som du har gjort idag. Deep Blue som vi pratade om i början använder en modifierad version av min-max-tekniken. Anledningen till att tekniken modifierats är helt enkelt att det inte är möjligt att ta fram alla möjliga spelsituationer som skulle kunna uppstå under ett parti, det tar för lång tid. Förbättringarna som gjorts har gjorts för att skapa färre noder*. I schack är det viktigt att känna till hur man ska göra de första dragen i ett spel för att hamna i en bra situation. Deep Blue har därför lagrat en mängd kända öppningsdrag som den använder sig av. På motsvarande sätt finns det en mängd avslutningsdrag som kan användas när spelbrädet ser ut på ett visst sätt. Deep Blue har även lagrat dessa drag. Så en mängd öppningsdrag, en modifierad min-max-teknik och en mängd avslutningsdrag var det som behövdes för att slå världens bästa schackspelare: Garry Kasparov. *) Tekniken som Deep Blue använder heter alpha-beta pruning och är en vidareutveckling av min-max-tekniken. Det som har vidareutvecklats från min-max-tekniken är följande: 1. Det finns fler värden än -1, 0 och 1. Värdena betyder inte förlust, oavgjort eller vinst, värdena står för hur bra en spelsituation anses vara. Om det till exempel i en nod finns ett spelbräde där datorn precis tagit motspelarens dam så kan detta anses bra och markeras med en positiv siffra. Desto större positiv siffra, desto bättre situation. Detta innebär att löv i trädet inte behöver betyda att spelet är avslutat. 2. Vissa noder utvecklas inte. Det finns tekniker för att bedöma hur troligt det är att en viss spelsituation kan uppkomma. Datorn antar att motspelaren inte gör uppenbart klantiga drag och utvecklar inte en spelsituation där motspelaren gjort ett klantigt drag. 3. Trädet utvecklas efter hand. Om datorn kommer till ett löv i trädet som ej innebär avslutat spel så utvecklar datorn denna gren vidare. Vill du lära dig mer om artificiell intelligens? För dig som tycker artificiell intelligens verkar intressant finns här ett antal länkar och några boktips. Om du börjar studera på universitetet finns det ett flertal kurser inom artificiell intelligens: • Artificiell intelligens grundkurs: här lär du dig tekniker inom många delområden inom artificiell intelligens) • AI-programmering: Här får du programmera ett eget fotbollslag som ska kunna spela mot andra fotbollslag • Databehandling av naturligt språk: Här får du lära dig använda tekniker som Alice (se länken nedan) använder sig av. • Expertsystem: Här får du lära dig hur man skapar system som delvis kan ersätta experter inom vissa områden. Val-identifieringssystemet nedan är ett expertsystem. Länkar inom olika delområden i artificiell intelligens: Natural language processing: Tala med Alice som uppträder intelligent. Hon är en chatrobot som kan svara på dina frågor och hålla ett samtal igång: http://alice.sunlitsurf.com/ Intelligenta agenter: En intelligent agent är ett program som uppträder självständigt och intelligent. Den har någon sorts uppgift att utföra och exempel på agenter är: sökagenter, övervakningsagenter, inköpsagenter. Här kan du läsa om en mängd olika agenter: http://www.agentland.com/ Robot: Titta på Hondas "humanoid"-robot som kan gå och sparka boll. Här finns även några filmklipp: http://world.honda.com/asimo/ Robot: Det finns en tävling inom Artificiell intelligens som går av stapeln varje år där robotar spelar fotboll. Varje utvecklingsteam deltar med ett lag av robotar. Tävlingens vision är att år 2050 slå de mänskliga världsmästarna i fotboll. Se en intressant film om robotarna: http://www.pbs.org/saf/1208/video/watchonline.htm Datorseende: Här är ett team som lärt sig hitta ansikten i bilder. Skicka in en länk med en bild som behandlas eller titta i galleriet på redan behandlade bilder. http://demo.pittpatt.com Expertsystem: Här kan du testa ett system som hjälper dig att identifiera en val som du har sett. http://www.aiinc.ca/demos/whale.html Populärvetenskaplig litteratur om artificiell intelligens: Denna författare förutspådde Deep Blues vinst över Kasparov, webben och datorns fantastiska utveckling. Kurzweil, Raymond: The age of spiritual machines : how we will live, work and think in the new age of intelligent machines. Recension av boken: http://www.diu.se/nr5-99/nr5-99.asp?artikel=s14 Facklitteratur om artificiell intelligens (dessa kan ofta kräva en del förkunskap) : Kursbok i kursen Artificiell intelligens: Russel, Norvig: Artificial Intelligence - A Modern Approach En annan populär bok inom artificiell intelligens: Artificial Intelligence: Patrick Henry Winston