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