1 / 54

Trädsökning och datorschack

Trädsökning och datorschack. Johnny Bigert Nada, KTH johnny@kth.se. Datorschack. Hobby: schackdatorn Rainman 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

aizza
Download Presentation

Trädsökning och datorschack

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Datorschack • Hobby: schackdatorn Rainman 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

  3. 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

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

  5. 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

  6. 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

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

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

  9. Minimaxsökning • Antag 50000 positioner/sekund • Förgreningsfaktor i schack: ca 30

  10. 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

  11. 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

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

  13. 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)

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

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

  16. 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;

  17. 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

  18. 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!

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

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

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

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

  23. 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

  24. 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)

  25. 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%

  26. 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

  27. 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

  28. 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.

  29. 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

  30. 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!

  31. 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!

  32. 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

  33. 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!

  34. 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!

  35. 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

  36. 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

  37. 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)

  38. 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 < β

  39. 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

  40. 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

  41. 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

  42. 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 • t = NegaScout(c, a, b, depth - 1); • if (t > alfa) and (t < b) and (c != FIRST) and (depth > 1) • b = NegaScout(c, alfa, t); b = min(b, t); • a = b - 1; • c = nextbrother(c); • return b;

  43. 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

  44. 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

  45. 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; • else • lower = g; • until(lower >= upper)return g;

  46. 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

  47. 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å

  48. 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

  49. 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

  50. 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)

More Related