Tr - PowerPoint PPT Presentation

About This Presentation
Title:

Tr

Description:

Title: PowerPoint Presentation Author: Johnny Bigert Last modified by: Johnny Bigert Created Date: 2/19/2003 2:38:04 PM Document presentation format – PowerPoint PPT presentation

Number of Views:75
Avg rating:3.0/5.0
Slides: 55
Provided by: Johnny94
Category:
Tags:

less

Transcript and Presenter's Notes

Title: Tr


1
Trädsökning och datorschack
  • Johnny Bigert
  • Nada, KTH
  • johnny_at_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
  • Allmänt
  • 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

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
Minimaxsökning
max
min
max
min
8
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

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
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
gt -20?
lt-5
-20
-3
gt -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
lt -3 ?
lt -3 ?
-3
-3
-1
7
lt -3 ?
gt-7? lt-3?
min
-7
-20
-3
-6
-7
-15
-1
-1
7
3
-10
-2
-5
-7
-15
4
1
7
5
-20
0
-6
2
-10
0
-1
8
8
-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 lt 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 gt 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
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 lt alpha, sluta sök
  • Om lower gt 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 (a, ß) (v-30, v30)

38
Aspirationssökning
  • Alfa-beta med fönster (a, ß) (v-30, v30)
  • 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 v30 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, a lt x lt ß

39
Nollfönster
  • En ambitiös gissning är ett s.k. nollfönster (a,
    ß) (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 lt 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 lt 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 lt beta) and
(c ! NOCHILD) do t NegaScout(c, a, b, depth -
1) if (t gt a) and (t lt beta) and (c ! FIRST)
and (depth gt 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 lt alpha) and (c !
NOCHILD) do t NegaScout(c, a, b, depth - 1) if
(t gt alfa) and (t lt b) and (c ! FIRST) and
(depth gt 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 fupper
INFINITY lower -INFINITYrepeat if (g
lower) beta g 1 else beta
gg AlphaBeta(root, beta - 1, beta,
depth)if (g lt beta) upper g else
lower g until (lower gt 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)

51
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

52
Ö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

53
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)

54
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
Write a Comment
User Comments (0)
About PowerShow.com