Trädsökning och datorschack

Slides:



Advertisements
Liknande presentationer
Det första du bör göra är att rita horisonten
Advertisements

PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
Att förstå anonymiteten (översättning från
Lee Esselström 2002 Min egen julkalender - stickade sockor på rad
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
Talföljder formler och summor
En Dag i Ramadan Ramadan
Varför måste jag ha ett långt och jobbigt lösenord? Jo… det är såhär…
IPad grundkurs.
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
PowerPoint laget av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
ARBETSMILJÖ och SÄKERHET
Metodstöd.
Träddiagram - ett sätt att ta fram aktiviteter och prioriteringar för hur man ska jobba med ett visst område.
Här ser ni några sidor som hjälper er att lösa uppgifterna:
En genomgång av spelet: Dubbelkrig-Grön
Att söka till högskolan
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
PowerPoint laget av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
hej och välkomna EKVATIONER Ta reda på det okända talet.
Kan du omvandla 80 km/h till m/s?
Videokonsultation med medborgare
Barnkonventionen Rätt att utvecklas som person
xn + yn = zn Problemlösning Några enkla metoder
De tävlande börjar med att skriva in sina namn i resultattabellen. PerUllaIngaEgon Per börjar slå med två sexsidiga tärningar. Han får 5 och 2. Gränsvärdet.
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
Föreläsning 7 Analys av algoritmer T(n) och ordo
©storm.
OK? INTELLIGENSTEST!(?) Här är 4 frågor. Svara genast!
Binära Sökträd, kapitel 19
MEDELVÄRDE, MEDIAN & TYPVÄRDE
Växjö 21 april -04Språk & logik: Kontextfria grammatiker1 DAB760: Språk och logik 21/4: Kontextfria 10-12grammatiker Leif Grönqvist
Grundläggande programmering
Föreläsning 10 Länkade lista Stack och Kö Att arbeta med listor
Programmering B PHP Lektion 2
Vad är du för typ av person?
Workshop inför Projektet
Pathfinding. –Vad är det? –Sökning från A till B.
Från binära till hexadecimala
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Individuellt val till 12/13
PerUllaIngaEgon 1.Skriv in de tävlandes namn. 2. Per börjar slå med två tjugosidiga tärningar. Han får 15 och 5. Gränsvärdet för första höjden är =10,
Max start-guide Liten och väldigt snabbt ihopkastad.
The Blue Day Book Bradley Trevor Greive (ISBN: )
Brukarundersökning socialpsykiatri Kön 1. Man16 (44%) 2. Kvinna20 (56%)
TÄNK PÅ ETT HELTAL MELLAN 1-50
Rollfördelning i funktionärsbåset Vem gör vad i Danicahallen.
Frågor om elevinflytande till elever i åk 3 – 9 i grundskolan
Barnets rättigheter i Sverige och för alla barn i världen
Bosön Kursledare Bengt Nygren
Stöd till en evidensbaserad praktik för god kvalitet inom socialtjänsten – brukarmedverkan vid brukarundersökningar inom LSS • • SKAPAD.
Grundläggande programmering
FOXPOPULI Introduktion av deltagare – ice breaking och lära känna varandra “ Social entrepreneurship for social change”, Nordplus adult Project ID AD-2012_1a
Barnets rättigheter i Sverige och för alla barn i världen
Förebygga Tersen 1. Förebygga är bättre än ”ta hand om”! Sociologen Aaron Antonovsky flyttade fokus från externa faktorer som orsak till ohälsa till individens.
Logikprogrammering 21/10 Binära träd
Binomialsannolikheter ritas i ett stolpdiagram
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
DD1320/25 TILDA Lösningsskiss tenta 31 oktober 2013.
Räkna till en miljard 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,14,15,16,17,18,19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, En miljard är ett.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Föreläsning 12 Sökning och Sökträd.
1 Jan Lundström OV’s Hemsida Utbildning Ledare. 2 Jan Lundström OV’s Hemsida Standard Lagrum.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Föreläsning 13 Sortering.
© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 14.
Algoritmer och datastrukturer Föreläsning 8 Tidskomplexitet (Weiss kap
Komma igång med Scratch
Presentationens avskrift:

Trädsökning och datorschack Johnny Bigert Nada, KTH johnny@kth.se

Datorschack Hobby: schackdatorn Rainman Påbörjad i oktober 2002 http://www.nada.kth.se/~johnny/chess_comp.html Påbörjad i oktober 2002 Spelar på free internet chess server (FICS, www.freechess.org) under namnet RainmanC Har spelat 2500 matcher (030228) FICS-rating version 060: ca 1875

Datorschack Lite kuriosa: 5000 rader C++ Kommande version 073 innehåller Bitbräden, alfa-betasökning, transpositionstabell, MTD(f)-sökning, enkel quiescencesökning, enhanced transposition cutoff, SEE-algoritm, hashtabell för bondestruktur, öppningsbok, slutspelsdatabas, dragupprepningsbehandling, Winboardinterface, tidskontroll m.m. Internmöte v073 mot v060: +26 =2 -2

Översikt Allmänt Dragsortering Söktekniker Heuristiker Minimax-sökning Alfa-beta-sökning Transpositioner Dragsortering Killer move Historik Intern iterat. fördj. Quiescence search Öppningsbok, slutspelstabeller Söktekniker Iterativ fördjupning Aspirationssökning NegaScout MTD(f) Utökad transp.besk Heuristiker Nulldrag Futility Selective extensions

Minimaxsökning (eng: minimaxing, negamaxing) Schack: det som är bra för dig är dåligt för din moståndare Du vill maximera din poäng, din moståndare vill minimera din poäng Varannat drag ditt, varannat din moståndares Maximera varannat, minimera varannat

Minimaxing Trädsökning: Varje nod är ett bräde Varje kant är ett drag Utvärdering sker i löven Maximera varannat djup, minimera varannat djup

Minimaxsökning max min max min -10 -15 -20 -2 3 -5 -6 -7 5 2 -15 4 -10 -5 -6 -7 5 2 -15 4 -10 -1 1 -1 7 10 8 5 3 12 11 14 25 23 10 7 8 10 13 7 -3 -2 12 17 14 20 21 10 8 14 9 12 13 4 10 2 7 6 5 -1 4 -3 3 5 8 6 13 12 15 10 14 11 9

Minimaxsökning 10 max min max min 10 -3 10 5 -3 -1 7 23 12 10 6 5 12 -10 -15 -20 -2 -3 -5 3 -6 -20 -3 -6 -7 5 2 -15 4 -10 -1 -7 -15 -1 1 -1 7 10 8 5 3 -1 7 3 12 11 14 25 23 10 7 8 11 23 7 10 13 7 -3 -2 12 17 14 7 -3 12 10 8 14 9 8 12 9 13 9 4 10 2 7 6 5 2 6 5 -1 4 -3 3 5 8 6 -3 5 13 12 15 10 14 11 9 12 10 9 20 10 21

Minimaxsökning Antag 50000 positioner/sekund Förgreningsfaktor i schack: ca 30 Djup (halvdrag) Positioner Tid 2 900 0.018 s 3 27,000 0.54 s 4 810,000 16.2 s 5 24,300,000 8 min 6 729,000,000 4 h 7 21,870,000,000 5 dagar

Minimaxsökning Snabbschack: ca 5 min per person och parti dvs 5-10 s per drag Vi hinner inte ens söka klart djup 4! Slutsats: Brute force ogörligt, träden växer för snabbt

Alfa-beta-sökning Observationer: När vi maximerar har vi en undre gräns för det rätta värdet När vi minimerar får vi övre gränser Om inget överlapp, omöjligt att hitta bättre värde

Alfa-beta-sökning -3 max > -20? <-5 -20 -3 > -3? min -10 -2 -6 -15 -3 3

Alfa-beta-sökning Vi kallar den undre gränsen för alfa Vi kallar den övre gränsen för beta Algoritmen heter alfa-beta-sökning (eng: alpha-beta-pruning) De grenar vi inte besökar kallas beskurna (eng: pruned)

Alfa-beta-sökning min max min -1 -3 < -3 ? < -3 ? -3 -3 -1 7 >-7? <-3? min -7 -20 -3 -6 -7 -15 -1 -1 7 3 -10 -2 -5 -7 -15 4 1 7 5 -20 -6 2 -10 -1 8 8 -15 -3 3 5 4 -1 10 3

Alfa-beta-sökning Besökta: 45, beskurna: 36 max min max min 10 -3 10 5 -1 7 23 12 10 6 min -20 -3 -6 -7 -15 -1 -1 11 23 7 7 -3 12 10 8 9 2 6 5 -10 -2 -5 -7 -15 4 1 12 25 10 10 -3 12 20 8 12 4 10 5 -20 -6 2 -1 14 23 7 14 10 9 13 -15 -3 3 5 -1 11 23 13 17 21 14 9 Besökta: 45, beskurna: 36

function AlphaBeta(node, alpha, beta, depth) if depth == 0 then g = evaluate(node); else if node == MAXNODE then g = -INFINITY; a = alpha; c = firstchild(node); while (g < beta) and (c != NOCHILD) do g = max(g, AlphaBeta(c, a, beta, depth - 1)); a = max(a, g); c = nextbrother(c); else /* node is a MINNODE */ g = +INFINITY; b = beta; c = firstchild(node); while (g > alpha) and (c != NOCHILD) do g = min(g, AlphaBeta(c, alpha, b, depth - 1)); b = min(b, g); c = nextbrother(c); return g;

Dragordning (eng: move ordering) Den mest kritiska delen av alfa-beta-algoritmen är ordningen på dragen Bäst drag först ger tidiga beskärningar Ditt bästa drag maximerar din poäng Motståndarens drag minimerar din poäng

Dragordning Förgreningsfaktor w Träddjup d Besökta noder: värsta fallet: wd perfekt dragordning: wceil(d/2) + wfloor(d/2) Vi kan alltså söka dubbelt så djupt!

Perfekt dragordning max min max min 10 10 5 -3 10 12 23 5 6 12 -3 -1 7 21 20 9 13 12 8 14 10 9 8 12 17 14 7 13 10 -3 -2 12 7 -3 23 25 11 14 12 7 10 8 23 11 7 5 8 6 3 -3 4 -1 5 -3 6 10 7 5 2 4 6 5 2 12 10 14 11 10 9 14 9 -3 -2 -6 3 -5 -20 -10 -15 -3 -6 -20 -1 4 -7 5 2 -15 -10 -1 -7 -15 7 10 8 3 5 -1 1 7 3 -1 12 13 15

Perfekt dragordning Besökta: 17, beskurna: 64 max min max min 10 10 5 -3 max 10 12 23 5 -3 min 10 9 8 12 23 5 -3 -3 -6 -20 10 9 8 12 23 5 -3 -3 -6 -20 20 14 23 21 17 25 Besökta: 17, beskurna: 64

Omvänt perfekt dragordning max 10 (Vi besöker från höger till vänster) min 10 5 -3 max 10 12 23 5 6 12 -3 -1 7 min 10 9 8 12 7 -3 23 11 7 5 -3 6 5 2 12 10 9 -3 -6 -20 -1 -7 -15 7 3 -1 10 9 8 12 7 -3 23 11 7 5 -3 6 5 2 12 10 9 -3 -6 -20 -1 -7 -15 7 3 -1 20 12 9 14 10 -2 23 12 8 6 -1 7 5 4 13 11 9 -2 -5 -15 2 -10 8 5 21 13 14 17 13 7 25 14 10 8 3 4 10 6 10 15 14 14 3 -10 4 5 4 10 8 1

Omvänt perfekt dragordning max 10 (Vi besöker från höger till vänster) min 10 5 -3 max 10 12 23 5 6 12 -3 -1 7 min 10 9 8 12 7 -3 23 11 7 5 -3 6 5 2 12 10 9 -3 -6 -20 -1 -7 -15 7 3 -1 10 9 8 12 7 -3 23 11 7 5 -3 6 5 2 12 10 9 -3 -6 -20 -1 -7 -15 7 3 -1 20 12 9 14 10 23 12 8 6 7 5 4 13 11 9 -2 -5 -15 2 -10 8 5 21 13 14 17 13 25 14 10 8 3 10 6 10 15 14 14 3 -10 4 5 4 10 8 1 Besökta: 77, beskurna: 4

Dragordning Med perfekt dragsortering behöver vi inte söka! Det bästa draget är ju det första. Man vet inte det bästa draget Heuristiker: Grundläggande schackunskap Killer move Historik

Dragordning Intressanta drag: De som kan förändra poängen drastiskt Slå den pjäs som flyttades sist Övriga drag som slår en pjäs Bonde som blir till dam Schackar (problematiskt)

Killer move Observation: ett drag som är bra på djup d i en gren är nog bra i en annan gren Ex: flytta damen om den är hotad Drag som orsakar avskärningar är bra Vi sparar ett eller flera drag per nivå Minskning av trädet: ca 30%

Historik (eng: history heuristic) Skapa tabell med 64 x 64 heltal (från, till) Varje gång ett drag ger avskärning, räkna upp mosvarande räknare i tabellen Ger inbördes ordning mellan alla drag

Transpositioner Observation: samma bräde kan uppkomma på olika sätt Ex: jag flyttar kungen och sen tornet eller jag flyttar tornet och sen kungen Om en position redan är besökt behöver den inte behandlas igen Vi skapar en tabell över besökta noder

Transpositionstabell Istället för att spara besökta noder i trädform, spara den i en hashtabell Snabb uppslagning Varje bräde får ett hashvärde som beror på hur pjäserna står, vems tur det är etc.

Transpositionstabell Kollisioner: Efter ett tag blir tabellen full Många bräden hashas till samma element Probabilistiskt lås - ytterligare ett hashvärde per bräde

Transpositionstabell Sparad information: Hashlås (normalt 32 bitar) Sökdjup Undre gräns för värdet Övre gräns för värdet Bästa draget!

Transpositionstabell Om bräde finns i hash vid uppslagning Om djup ≤ sparat djup, använd hashat värde: Om upper < alpha, sluta sök Om lower > beta, sluta sök Annars Prova sparat drag först!

Transpositionstabell Bräden i hashen: ca 1/4 av trädets storlek Hashade drag ger väldigt bra gissning på vilket drag som är bäst

Utökad transpositionsbeskärning (eng: enhanced transposition cutoff) Vänta med att utföra dragen (söka djupt i trädet) Slå istället upp alla drag i hashtabellen Hittar vi ett som ger beskärning så kan vi sluta söka!

Iterativ fördjupning Dragen i hashen är ofta bra gissning Vi vet inte hur mycket tid sökning på djup n kommer att ta När tiden är slut måste vi ha ett drag Vi söker djup 1, 2, ..., n!

Iterativ fördjupning Onödigt arbete? Djup n kan ta 30 ggr längre tid än djup n-1 Det går oftast snabbare att söka 1, 2, ..., n än att söka n-1, n! Hashen är fylld med användbar information

Iterativ fördjupning Finns inget drag i hashen har vi ingen gissning Vi kan då tillämpa intern iterativ fördjupning Vi söker ett par nivåer för att fylla hashen med nyttig information Försumbart arbete om vi får en tidig beskärning

Aspirationssökning Poängen i ett parti ändras oftast inte så mycket Med snävare ingångsvärden i alfa-beta-sökningen går sökningen snabbare Vi gissar på föregående värde och lägger på en bråkdel av en bonde Alfa-beta med fönster (α, β) = (v-30, v+30)

Aspirationssökning Alfa-beta med fönster (α, β) = (v-30, v+30) Får vi ett värde w ≤ v-30 så vet vi att det rätta värdet x är ≤ w Får vi ett värde w ≥ v+30 så vet vi att det rätta värdet x är ≥ w Vi måste göra en omsökning för att hitta det rätta värdet, α < x < β

Nollfönster En ambitiös gissning är ett s.k. nollfönster (α, β) = (v-1, v) Vi kan aldrig träffa det rätta värdet, men med flera sökningar kan vi ta reda på värdet Vi får bara information om huruvida värdet är < v eller ≥ v

NegaScout Idé: Vi söker bara noggrant i det första barnet i varje nod De övriga får frågan: Är ditt värde < v eller ≥ v ? Är värdet mindre än v är allt bra Är värdet större måste vi söka om

NegaScout Algoritmen kallas NegaScout Den är en förbättring av huvudvariantssökning (principal variation search, PVS) PVS söker noggrant på den mest troliga dragutvecklingen och mindre noggrant på andra NegaScout dominerar Alfa-beta-algoritmen, dvs Alfa-beta beskär inget som NegaScout besöker

function NegaScout(node, alpha, beta, depth) a = alpha; b = beta; if depth == 0 then g = evaluate(node); else if node == MAXNODE then c = firstchild(node); while (a < beta) and (c != NOCHILD) do t = NegaScout(c, a, b, depth - 1); if (t > a) and (t < beta) and (c != FIRST) and (depth > 1) a = NegaScout(c, t, beta); a = max(a, t); b = a + 1; c = nextbrother(c); return a; else /* node is a MINNODE */ c = firstchild(node); while (b < alpha) and (c != NOCHILD) do if (t > alfa) and (t < b) and (c != FIRST) and (depth > 1) b = NegaScout(c, alfa, t); b = min(b, t); a = b - 1; return b;

MTD(f) MTD(f) är en sökalgoritm som bara använder nollfönster Den anropar Alfa-beta-sökning upprepat Beroende på om returvärdet slår i alfa eller beta så stegar vi ett steg nedåt resp. uppåt Resultatet kan bli hundratals små men väldigt snabba sökningar

MTD(f) Varför tar man då inte större steg? Jag har gjort lite experiment med steglängder och binärsökning Med nollfönster som ligger intill tidigare sökta nollfönster blir varje ny sökning liten Längre steg ger stor ökning i tid Intressant, men osäkert om det lönar sig

function MTDf(root, f, depth) g := f; upper := +INFINITY; lower := -INFINITY; repeat if (g == lower) beta = g + 1; else beta = g; g := AlphaBeta(root, beta - 1, beta, depth); if (g < beta) upper = g; lower = g; until (lower >= upper) return g;

Horizonteffekten (eng: horizon effect) Om man söker till djup n kan man ha otur och sluta mitt i en slagväxling Det kan då se ut som om man ligger en pjäs under, fast detta åtgärdas i nästa drag Man kan även få för sig att ens hopplöst förlorade dam går att rädda, det är bara att offra tornet och sen löparen och sen en bonde På så sätt så slipper man se att damen går förlorad Detta kallas för horizonteffekten

Stabil sökning och horizonteffekten (eng: quiescense search) Man bör därför bara utvärdera stabila positioner (eng: quiet) Exempel på instabila positioner: Slagväxlingar Kungen i schack Bonde till sista raden Man fortsätter söka tills positionen är stabil och utvärderar först då

Selektiv utvidgning (eng: selective extensions) En människa spelar inte schack på samma sätt som en dator En människa söker djupt på lovande positioner En dator provar alla drag till djup n För att förbättra datorns spel kan man utvidga lovande stigar

Kostnad och bråkdelsdjup (eng: fractional depth) Ett sätt att utvidga en stig är att tilldela en kostnad/belöning till egenskaper som uppkommer utmed stigen Ex: Drag med bara ett motdrag, sök +0.5 djupare Hot mot tung pjäs, sök +0.25 djupare Bonde på sjunde raden, sök +0.5 djupare Summan kan ge ytterligare djup

Nolldrag (eng: null move heuristic) För att minska sökträdets storlek kan man ta till potentiellt farliga heuristiker Idé: Om motståndaren får göra tre drag på rad och ändå inte leder, sluta sök (eller sök -2.0 mindre djup etc.) Farligt: man kan missa djupa kombinationer Farligt: det finns situationer där det är bra att inte vara vid draget (Zugzwang)

Hopplöshet (eng: futility pruning) Om följande kriterier är uppfyllda: Situationen är stabil och nästa drag slår inte en pjäs Motståndaren ligger minst en lätt pjäs efter Isåfall, utvärdera inte nästa drag Man spar stora delar av sökdjup n Razoring - ungefär: om motståndaren ligger en dam efter och bara två drag till horizonten, sluta sök Mycket farligt, många besparingar

Öppningsbok (eng: opening book) Datorn har dålig positionell känsla Svårt att starta spelet på ett vettigt sätt Lösning: öppningsbok med acceptabla drag Att ladda ned: ECO - vanligaste öppningarna

Slutspelstabeller (eng: end game table bases, EGTB) Slutspelet har få pjäser och mycket positionell karaktär Man har spelat samtliga spel med upp till fem pjäser (några med sex) och sparat till disk! Begränsad användbarhet (6 pjäser = många terabyte)

Slut Moderna schackdatorer innehåller det mesta av det vi berört och mycket därtill Ladda ner och prova Rainman: http://www.nada.kth.se/~johnny/chess_comp.html