å€ãç°è²ã®ããEeyoreã¯æ£®ã®èã«èŠãããã¢ã¶ãã®è§ã«äžäººã§ç«ã¡ã足ã倧ããé¢ããé ãçåŽã«ã¶ãäžããé倧ãªããšãèããŸããã
A.ãã«ã³ãããŸã®ããŒãããšãã¹ãŠãã¹ãŠã
-ãããèŠãŸããïŒ èŠå®ã«å°ããŸãã -ããã«å°ããªç°è²ã®ãããããŸã...èšäº2908ãäŸ¡æ Œã¯32ã³ããã¯ã§ãã 圌ã«ã¯çŽ æŽãããæªæ¥ããããŸãã
ãããã¯ãããè¡ãããšèŠå®ã¯åæããã -圌ãã¯æã
éåžžã«çŽ æŽãããæªæ¥ãæã£ãŠããŸãã
ãã³ãªãŒã»ã¢ã«ããããããšå
¬çã
ããŒãã²ãŒã ã®éçºã§æãé£ããéšåã¯äœã§ããïŒ æããã«ãããŒãäžã§ããŒã¹ãåããã¢ãã¡ãŒã·ã§ã³ã§ã¯ãããŸããã åççã§èå³æ·±ãã²ãŒã ã«ãŒã«ãèæ¡ããã®ã¯å°é£ã§ãã ã²ãŒã ã®ãã©ã³ã¹ã確ä¿ããããšã¯éåžžã«å°é£ã§ãã ã³ã³ãã¥ãŒã¿ãŒéçºã«æºãã£ãŠããå Žåãé«å質ã®AIãå®è£
ããã®ã¯ãã£ãã«å°é£ã§ãïŒå²Goãå°giãªã©ã®ã²ãŒã ã§ã¯ããã®åé¡ã¯ãããŸã§è§£æ±ºãããŠããŸããïŒã ãããŠãããšãæ©èœããAIãå®è£
ã§ãããšããŠãããã®äœæ¥ã®å質ãè©äŸ¡ããããã€ãã®å¯èœãªãªãã·ã§ã³ããæé©ãªãã®ãéžæããããã«ãéåžžã«å€ãã®äœæ¥ãè¡ãå¿
èŠããããŸãã
ããããã¹ãŠã®åé¡ã«å¯Ÿãããœãªã¥ãŒã·ã§ã³ã倧å¹
ã«ç°¡çŽ åã§ããããŒã«ã«ã€ããŠã話ããããšæããŸãã
Axiom Development Kit㯠ã
Zillions of Gamesãæ¹åããæ¹æ³ãšããŠéçºè
ã«ãã£ãŠèæ¡ãããŸããã ç¹ã«ãAI ZoGãéåžžã«è²§åŒ±ãªé åã®çºäœã«é¢é£ããã²ãŒã ïŒGoãªã©ïŒã®å®è£
ã«çŠç¹ãåœãŠãŠããŸãã ããã«ãAxiomã¯ZoGéçºè
ã®æ©èœã倧å¹
ã«æ¡åŒµããåŸæ¥ã®ZRFïŒã«ãŒã«èšè¿°èšèªïŒã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯å®éã«ã¯å®çŸãããªãå€ãã®æ©äŒãæäŸããŸãã ããã«ãããAxiomã¯ãZoGãã³ã³ãã¥ãŒã¿ãŒã«ã€ã³ã¹ããŒã«ãŸãã¯è³Œå
¥ãããããšããªãå Žåã§ããå®å
šã«ç¬ç«ããŠåäœã§ããŸãã ãããããŸãæåã«...
ç»åã§
ZoGã«ã¯å€ãã®æ¬ ç¹
ãããããšããã§ã«
æžããŸããã 幞ããªããšã«ãéçºè
ã¯ãããã®ããã€ãã«å¯ŸåŠããã¡ã«ããºã ãæäŸããŠããŸãã æ¡åŒµã¢ãžã¥ãŒã«ïŒãšã³ãžã³ïŒã¯ãèŠèŠåãé€ãã²ãŒã ã®ããããåŽé¢ãå¶åŸ¡ããåçã«ããŒããããã©ã€ãã©ãªïŒDLLïŒã§ãã ããã§ã¯ããã®ãããªæ¡åŒµã®äŸãèŠãããšãã§ããŸãã
ç¬èªã®æ¡åŒµæ©èœãèªåã§éçºããã«ã¯ãéåžžã«æéããããå ŽåããããŸãã ãšã³ãžã³ãæ¥ç¶ãããšãéåžžã®ZoG AIãç¡å¹ã«ãªããããAIãéçºããå¿
èŠããããŸãïŒã»ãšãã©ã®å ŽåãC ++ã§ïŒã Axiomã¯ãAIã¢ã«ãŽãªãºã ãªã©ãéçºè
ã«ãšã£ãŠé£ãããã®ãå®è£
ãã
ããã°ã©ã å¯èœãªãšã³ãžã³ã§ãããã²ãŒã ããžãã¯ã«éäžããæ©èœãæäŸããŸãã
Royal Game of Urãå®è£
ããŠã¿ãŸãããã åäœããã«ã¯ãæå°éã®ZRFãã¡ã€ã«ãå¿
èŠã§ãã
ãšã³ãžã³æ¥ç¶(version "2.0") (game (title "Ur") (engine "../Axiom/Ur/axiom.dll") (option "animate captures" false) (option "animate drops" false) (option "show moves list" false) (option "pass turn" forced) (option "highlight goals" false) (option "prevent flipping" true) (option "recycle captures" true) (drop-sound "Audio/Dice_cup.wav") (move-sound "Audio/Clack.wav") (capture-sound "") (players Black White ?Dice) (turn-order White ?Dice ?Dice ?Dice ?Dice Black ?Dice ?Dice ?Dice ?Dice) (board (image "Images\Ur\board.bmp") (grid (start-rectangle -503 -13 -442 79) (dimensions ("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q" (67 0))
ããã«ãã¬ã€ã€ãŒã®èª¬æãåãã®ã·ãŒã±ã³ã¹ãããŒã¹ããããŸãããããŒã¹ãè¡ãã«ãŒã«ã®èª¬æã¯ãããŸããã ãŸããããŒãäžã®æ¹åãã²ãŒã ãŸãŒã³ãã²ãŒã ãçµäºããæ¡ä»¶ãããã³ã²ãŒã ã«ãŒã«ã«é¢é£ããä»ã®ãã¹ãŠã®å®çŸ©ã¯ãããŸããã ãããã¯ãã¹ãŠå
¬çã¹ã¯ãªããã«å«ãŸããŸãã æ²ããç¹ã¯ããšã³ãžã³ãšã®ZoGã€ã³ã¿ãŒãã§ãŒã¹ã¯ãZRFãã¡ã€ã«ã«å«ãŸããæ
å ±ã®è»¢éãæäŸããªãããšã§ãã ã€ãŸãããããã®èª¬æã¯ãã¹ãŠAxiomã¹ã¯ãªããã§è€è£œããå¿
èŠããããŸãã
幞ããªããšã«ãAxiom Development Kitã«ã¯ããã®ããã»ã¹ãèªååãããŠãŒãã£ãªãã£ãä»å±ããŠããŸãã ZRF Converterã¯éåžžã«æ©å«ãæªãã§ãã ZRFãã¡ã€ã«å
ã®äœãïŒããšãã°ããã¯ãå
ã®ããŒãã®èª¬æïŒãæ°ã«å
¥ããªãã£ãå Žåãå€æããã»ã¹ãäžæãããé ãçããäžæè°ãªèšºæãè¡ãããŸãã ãã¹ãŠãããŸããã£ãå Žåãåºåã«æ¬¡ã®èª¬æã衚瀺ãããŸãã
Ur.4th {board {position} a5 {position} b5 {position} c5 {position} d5 {position} e5 {position} f5 {position} g5 {position} h5 {position} i5 {position} j5 {position} k5 {position} l5 {position} m5 {position} n5 {position} o5 {position} p5 {position} q5 {position} a4 {position} b4 {position} c4 {position} d4 {position} e4 {position} f4 {position} g4 {position} h4 {position} i4 {position} j4 {position} k4 {position} l4 {position} m4 {position} n4 {position} o4 {position} p4 {position} q4 {position} a3 {position} b3 {position} c3 {position} d3 {position} e3 {position} f3 {position} g3 {position} h3 {position} i3 {position} j3 {position} k3 {position} l3 {position} m3 {position} n3 {position} o3 {position} p3 {position} q3 {position} a2 {position} b2 {position} c2 {position} d2 {position} e2 {position} f2 {position} g2 {position} h2 {position} i2 {position} j2 {position} k2 {position} l2 {position} m2 {position} n2 {position} o2 {position} p2 {position} q2 {position} a1 {position} b1 {position} c1 {position} d1 {position} e1 {position} f1 {position} g1 {position} h1 {position} i1 {position} j1 {position} k1 {position} l1 {position} m1 {position} n1 {position} o1 {position} p1 {position} q1 board} {players {player} Black {player} White {player} ?Dice {random} players} {pieces {piece} lock {piece} init {piece} prom {piece} wdice {piece} bdice {piece} Dummy pieces} {turn-order {repeat} {turn} White {turn} ?Dice {turn} ?Dice {turn} ?Dice {turn} ?Dice {turn} Black {turn} ?Dice {turn} ?Dice {turn} ?Dice {turn} ?Dice turn-order} {board-setup {setup} ?Dice wdice q4 {setup} ?Dice bdice q3 {setup} ?Dice bdice q2 {setup} ?Dice lock q1 {setup} Black init i5 {setup} Black init j5 {setup} Black init k5 {setup} Black init l5 {setup} Black init m5 {setup} Black init n5 {setup} Black init o5 {setup} White init i1 {setup} White init j1 {setup} White init k1 {setup} White init l1 {setup} White init m1 {setup} White init n1 {setup} White init o1 board-setup}
ããã§æåã®é©ããåŸ
ã£ãŠããŸãã Axiomã§ã¯ãããŒããããã³ã³ãã¯ãã«èšè¿°ã§ããŸãããé倧ãªå¶éããããŸãã
ã°ãªãããã¶ã€ã³ã§ã¯ããæšæºãã»ã«åãæã€é·æ¹åœ¢ã®ããŒãã®ã¿ãèšè¿°ã§ããŸãïŒããã«ãããŒãã®èª¬æã§ã¯
ã°ãªããã1ã€ã ã䜿çšã§ããŸãïŒã ããè€éãªåœ¢ç¶ïŒ3次å
ãªã©ïŒã®ããŒããèšè¿°ããå¿
èŠãããå Žåã¯ãZRFã³ã³ããŒã¿ãŒãšåãæ¹æ³ã§åäœçœ®ãæ瀺çã«èšè¿°ããå¿
èŠããããŸãã ãã®å Žåããã¹ãŠã®å¶éãå°éãããããïŒZRFå®è£
ãšæ¯èŒããŠãããŒãã®åãšè¡ã®ååãå€æŽããå¿
èŠããããŸããïŒãããã³ã³ãã¯ããªã¬ã³ãŒãã䜿çšããŸãã
{board 5 17 {grid} board}
次ã«ãæ°åã移åã§ããæ¹åã決å®ããå¿
èŠããããŸãã ChessãCheckersãªã©ã®ã²ãŒã ã§ã¯ã座æšã®å¢åã«é¢ããŠæ¹åãå®çŸ©ããã³ã³ãã¯ããªè¡šèšæ³ã䜿çšã§ããŸãã
{directions -1 0 {direction} North 1 0 {direction} South 0 1 {direction} East 0 -1 {direction} West -1 1 {direction} Northeast 1 1 {direction} Southeast -1 -1 {direction} Northwest 1 -1 {direction} Southwest directions}
æ²ããããªãç§ãã¡ã®å Žåããã®æ¹æ³ã¯é©åã§ã¯ãããŸããã ãŠã«ã®ã²ãŒã ã§ã¯ãããŒãäžã®ãããã®åãã®è»è·¡ã¯éåžžã«å¥åŠãªã®ã§ãäœçœ®éã®é¢ä¿ãæ確ã«æ±ºå®ããå¿
èŠããããŸãã
éé {directions ( Anext ) {link} Anext i1 l2 {link} Anext j1 l2 {link} Anext k1 l2 {link} Anext l1 l2 {link} Anext m1 l2 {link} Anext n1 l2 {link} Anext o1 l2 {link} Anext l2 k2 {link} Anext k2 j2 {link} Anext j2 i2 {link} Anext i2 i3 {link} Anext i3 j3 {link} Anext j3 k3 {link} Anext k3 l3 {link} Anext l3 m3 {link} Anext m3 n3 {link} Anext n3 o3 {link} Anext o3 o2 {link} Anext o2 p2 {link} Anext p2 p3 {link} Anext p3 p4 {link} Anext p4 o4 {link} Anext o4 o3 ( Bnext ) {link} Bnext i5 l4 {link} Bnext j5 l4 {link} Bnext k5 l4 {link} Bnext l5 l4 {link} Bnext m5 l4 {link} Bnext n5 l4 {link} Bnext o5 l4 {link} Bnext l4 k4 {link} Bnext k4 j4 {link} Bnext j4 i4 {link} Bnext i4 i3 {link} Bnext i3 j3 {link} Bnext j3 k3 {link} Bnext k3 l3 {link} Bnext l3 m3 {link} Bnext m3 n3 {link} Bnext n3 o3 {link} Bnext o3 o4 {link} Bnext o4 p4 {link} Bnext p4 p3 {link} Bnext p3 p2 {link} Bnext p2 o2 {link} Bnext o2 o3 ( Cnext ) {link} Cnext p3 p4 {link} Cnext p4 o4 {link} Cnext o4 o3 {link} Cnext o3 n3 {link} Cnext n3 m3 {link} Cnext m3 l3 {link} Cnext l3 k3 {link} Cnext k3 j3 {link} Cnext j3 i3 {link} Cnext i3 h3 ( Dnext ) {link} Dnext p3 p2 {link} Dnext p2 o2 {link} Dnext o2 o3 {link} Dnext o3 n3 {link} Dnext n3 m3 {link} Dnext m3 l3 {link} Dnext l3 k3 {link} Dnext k3 j3 {link} Dnext j3 i3 {link} Dnext i3 h3 directions}
é»ãšçœã®ãããã®åãã¯ç°ãªããããçœã®å Žåã¯
Anext ãé»ã®å Žåã¯
Bnextã®æ¹åã決å®ãã
å¿
èŠããããŸããã ããã«ãå€æãã£ãŒã«ããééãããããã«ã€ããŠã¯ã
Cnextããã³
Dnextã®æ¹åã決å®ããå¿
èŠããã
ãŸã ã ãããè¡ãããªãå Žåããã©ãŒã¯ã
o3ãã£ãŒã«ãäžã«åœ¢æããããã¹ãŠã®ããããå°ããªãããã¯å
ã§å圢ã«å転ããå©çšå¯èœãªæåã®ã«ãŒããéžæããŸãã
{symmetries Black {symmetry} Anext Bnext Black {symmetry} Cnext Dnext symmetries}
ãã®èšèšã«ãããã察称æ§ããå®çŸ©ã§ããŸãã è¯ãäŸã¯ããã§ã¹ã®ããŒã³ã®åãã§ãã ããŒã³ã¯åžžã«åæ¹ã«ç§»åããŸãããçœã®å Žåã¯ããŒããäžã«ç§»åããé»ã®å Žåã¯å察æ¹åã«ç§»åããŸãã ããè€éãªå¯Ÿç§°åœ¢åŒããããŸãã ããšãã°ããã§ã¹ã®4蟺ã®å€åœ¢ã§ã¯ãè²ã«å¿ããŠãåæ¹ããžã®ç§»åã¯ã4ã€ã®ãåºæ¬ãã€ã³ããã®ããããã®æ¹åã«çºçããå¯èœæ§ããããŸãã ã察称æ§ããå®çŸ©ã
ãã ãå³ã®è²ã«æ³šæãæããã«ãåžžã«åãæ¹åïŒããšãã°
Anext ïŒã䜿çšã§ããŸãã é»ã®å Žåãèªåçã«å¯Ÿç§°ïŒ
Bnext ïŒã«å€æãããŸãã
èŠå¡
ãã©ãŒããšã®ç¥ãåãã¯æ©ãã£ãããéåžžã«é·ãéæ°ãŸããã®ãŸãŸã ã£ãã ãã©ãŒããåããŠèŠãã®ã¯ãBC-ShekãšMikroshã®ãšãã§ããã ç§ã®å人ã«ã¯
Vector 06Cããã ããã¹ãŠã®èŠªã®å
±åã®åªåã«ãããè³ããã®ã¿æåããŸããã Vektorã«ã¯ãã²ãŒã ã®å
¥ã£ãã«ã»ãããæã
賌å
¥ããããäžæããæã
çºèŠãããŸããã ãã®ãããªåå äžæã®äžã§ããã©ãŒãã®å®è£
ãèŠã€ãããŸããã å人ãšã¹ã¿ãã¯ã§ååã«éãã ã®ã§ãå人ãšç§ã¯ãahaããšèšã£ãŠãæ°åäœç³»ã®åºç€ããŒãã«èšå®ããŸããïŒFortã«ã¯ãšãŠã楜ããæ©äŒããããŸãïŒã ç Šã¯åœç¶ããã«èããããšãã§ããããã°ããå¿ããŠããŸããã
ãã®åŸããã§ã«ç 究æã§ããã©ãŒãã¯ç§ã®æ³šæã®è¡šé¢ã«ç¹°ãè¿ãæµ®äžããŸãããã圌ãã¯ããã«çå£ã«å¯ŸåŠããããšãã§ããŸããã§ããã å®éãFortã®ãã€ã¯ãã³ã³ãããŒã©ãŒããã°ã©ãã³ã°ããã®ä»ã®äŸ¿å©ãªã¢ããªã±ãŒã·ã§ã³ã«åºäŒãæ©äŒã¯ãããŸããã§ããã ãããŠä»ãAxioméçºè
ã®ãããã§ãç§ã«ã¯ãã®ãããªæ©äŒããããŸãïŒ å®éã«ã¯ãForthãšããåèªãçç±ã§ForthScriptã«è¡šç€ºãããŸãã å®éãAxiomèªäœãšForthScriptã®äžéšã®äž¡æ¹ãFortã«å®è£
ãããŠããã
axiom.dllã«ã¯ãããã䜿çšã§ããã€ã³ã¿ãŒããªã¿ãŒããããŸãã å¿
èŠã«å¿ããŠã
axiom.4thããã³
CORE.4THã§å®è£
ã®è©³çŽ°ã確èªããããããä¿®æ£ããããšãã§ããŸãã
ãããã£ãŠããã¹ãŠã®ã²ãŒã ããžãã¯ãããã°ã©ãã³ã°ããã«ã¯Fortãå¿
èŠã§ãã ããããã©ãããéçºãå§ããŸããïŒ æå§ãã«ãããŒãäžã®ããŒã¹ã®ç°¡åãªåããå®çŸããããšã¯çŽ æŽãããããšã§ãã åå³ã¯ãç¬èªã®è»éã«æ²¿ã£ãŠ1ã2ã3ããŸãã¯4åã®ã»ã«ã移åã§ããå¿
èŠããããŸãïŒã骚ãã«ã©ã³ãã ãªãã€ã³ããæããŠæ°ãæ£ãããŸã§ïŒã
ãã£ã®ã¥ã¢ã®åã : common-move ( 'dir n -- ) SWAP BEGIN DUP EXECUTE verify SWAP 1- DUP 0= IF DROP TRUE ELSE SWAP FALSE ENDIF UNTIL empty? IF from here move add-move ENDIF ; : i-move-1 ( -- ) ['] Anext 1 common-move ; : i-move-2 ( -- ) ['] Anext 2 common-move ; : i-move-3 ( -- ) ['] Anext 3 common-move ; : i-move-4 ( -- ) ['] Anext 4 common-move ; : p-move-1 ( -- ) ['] Cnext 1 common-move ; : p-move-2 ( -- ) ['] Cnext 2 common-move ; : p-move-3 ( -- ) ['] Cnext 3 common-move ; : p-move-4 ( -- ) ['] Cnext 4 common-move ; {moves i-moves {move} i-move-1 {move} i-move-2 {move} i-move-3 {move} i-move-4 moves} {moves p-moves {move} p-move-1 {move} p-move-2 {move} p-move-3 {move} p-move-4 moves} {pieces {piece} init {moves} i-moves {piece} prom {moves} p-moves pieces}
å®è¡æã«ZRF-kuãå®è¡ãããšãæ°åã移åã§ããããã«ãªããŸãã ã©ã®ããã«æ©èœããŸããïŒ
common-moveã®å®è£
ãèŠãŠã¿ãŸãããã ååã®çŽåŸã«ããã³ã¡ã³ãïŒãã©ãŒãã¹ã¿ã€ã«ïŒã¯ãã¹ã¿ãã¯äžã®2ã€ã®ãã©ã¡ãŒã¿ãŒïŒã³ã³ãã€ã«æžã¿ã®æ¹åé·ç§»ã³ãã³ããšç§»åã¹ãããæ°ïŒãåãããšã瀺ããŠããŸãã å®è£
èªäœã¯2ã€ã®éšåã§æ§æãããŠããŸãã ãŸããæå®ãããåæ°ã®ãµã€ã¯ã«ã§æ¹å転æãå®è¡ããã次ã«ã¿ãŒã²ãããã£ãŒã«ãã空ã§ããããšã確èªããåŸã移åïŒãããã®ç§»åïŒã圢æããäžé£ã®Axiomã³ãã³ããå®è¡ãããŸãã æãéèŠãªããšã¯ããã®ãã©ã³ã¹ããšããã¹ãŠã®è¡çºäžã«ãã¹ã¿ãã¯ãç Žå£ããªãããšã§ãïŒ
å®è¡å¯èœãªåã³ãã³ãã®èª¬æã¯ãAxiom Development Kitã«ãã³ãã«ãããŠããForthScriptããã³Axiomã®ããã¥ã¢ã«ã«èšèŒãããŠããŸããããã®ã³ãŒããšZRFã䜿çšããŠèšè¿°ã§ãããã®ãšã®ããã€ãã®éèŠãªéãã«æ³šç®ããŠãã ããã
- Axiomã§ã¯ãæ¹åé·ç§»ã³ãã³ãïŒäžèšã®ã¹ã¯ãªããã§ã¯EXECUTEã䜿çšããŠå®è¡ãããŸãïŒã¯ãé·ç§»ã®æåã確èªããããã«äœ¿çšã§ããããŒã«ã³ãŒããçæããŸãïŒç¹å®ã®ã»ã«ã®æ¹åãå®çŸ©ãããŠããªãå Žåãé·ç§»ã¯å®è¡ãããã FALSEãã¹ã¿ãã¯ã«é
眮ãããŸãïŒ
- add-moveå®äºã³ãã³ãã¯ãmove moveã³ãã³ããšã¯åé¢ãããŠããŸãïŒããããªããããªã«éèŠãªã®ããèšäºã«æžããŸããïŒã
ãã®ããŒãžã§ã³ã§ãã°ããéãã åŸãå°ããªãããã¯ã«å°éããããããåãæãããã«ãªã£ãŠããããšãããããŸãã ãããããã®ã茪廻ã®èŒªãããæãåºãã«ã¯ãè£è¿ãã«ããå¿
èŠããããŸãïŒè£è¿ãããããã«ã€ããŠã¯ããã£ããã·ã¥ã«è³ãæ¹å
Cnextããã³
DnextãäžããããŸãïŒã Urã®ã²ãŒã ã§ããããåãã®ã¯é£ããããšãæãåºãããŠãã ããã ãããã¯è£è¿ãããå€æãã£ãŒã«ãäžã«ç«ã€ã®ã§ã¯ãªããééããŸãã ããã«ããããã¯æåŸãŸã§é²ãããšãã§ããã®ã§ããã£ããã·ã¥ã«éããããŒãããããããåãé€ãããšãå¿ããªãã§ãã ããïŒ
ãããã®å転 VARIABLE isPromouted : common-move ( 'dir n -- ) FALSE isPromouted ! SWAP BEGIN current-player White = IF here p2 ELSE here p4 ENDIF = IF TRUE isPromouted ! ENDIF DUP EXECUTE verify SWAP 1- DUP 0= IF DROP TRUE ELSE SWAP FALSE ENDIF UNTIL empty? IF from here move here h3 = IF capture ENDIF isPromouted @ IF current-piece-type 1+ change-type ENDIF add-move ENDIF ;
ããã«ãã©ãŒãã®å€æ°ã«é¢ããããã€ãã®èšèããããŸãã
VARIABLEããŒã¯ãŒãã䜿çšããŠ
isPromoutedå€æ°ãå®çŸ©ããŸãã å€æ°ãå®çŸ©ãããåŸãã³ãŒãå
ã§å€æ°ãèšåããããšããã®å€æ°ã®
ã¢ãã¬ã¹ãã¹ã¿ãã¯ã«ããã·ã¥ãããŸãã æå®ãããã¢ãã¬ã¹ã«ããå€ãååŸããã«ã¯ã
@ã³ãã³ãã
ïŒ å€æ°ã®å€ãäžæžãããŸãã
Axiomã®è€éãã¯ã圢ç¶ã®çš®é¡ã®æäœã«ãã£ãŠè¡šãããŸãã å®éã®ãšãããå³ã®å®çŸ©ã¯ããããã®åããå¶åŸ¡ããã³ãŒãã®
åŸã«ãããŸãïŒãããã䜿çšãããŠããããïŒã ãã®ãããã³ãŒãã§åœ¢ç¶ã®ã¿ã€ãã®ååã䜿çšããããšã¯ã§ããŸããïŒãã®æç¹ã§ã¯ãŸã å®çŸ©ãããŠããªãããïŒã ååãšããŠããã®äžå¿«ãªç¶æ³ããæãåºãããšãã§ããŸãã ããšãã°ãã³ãŒãã§ã¯ãããããããªããããããã«ã移åãå®è¡ããããŒã¹ã®ã¿ã€ããåçŽã«ã€ã³ã¯ãªã¡ã³ãããŸãã
ã²ãŒã ãã¬ã€ã®éèŠãªéšåã¯ããã¬ã€ã€ãŒã®åããã¹ãããããæ©èœã§ãã ãã¬ãŒã€ãŒã¯ãå¯èœã§ããã°ç§»åãå®äºãããã以å€ã®å Žåã¯ç§»åãã¹ãããããå¿
èŠããããŸãã ãããšãããæ°ã«ããªãå Žåãã²ãŒã ã¯ãã¬ã€ã€ãŒã®ããããã«ããæåã®ç§»åäžå¯èœæ§ã§åŒãåãã§èªåçã«å®äºããŸãã ãŸããçžæã®ã¿ãŒã³ãã¹ãããããããšã«ããããã¢ãŠãã¬ããããžã®ç§»åã®åŸã«ãã¬ã€ã€ãŒã®2çªç®ã®ç§»åãå®è£
ããããšã¯è«ççã§ãã ããããã£ãŠã¿ãŸãããïŒ
é²æãã¹ããã : is-rosette? ( -- ? ) here i2 = here i4 = OR here l3 = OR here o2 = OR here o4 = OR ; : common-move ( 'dir n -- ) q5 enemy-at? NOT IF FALSE isPromouted ! SWAP BEGIN current-player White = IF here p2 ELSE here p4 ENDIF = IF TRUE isPromouted ! ENDIF DUP EXECUTE verify SWAP 1- DUP 0= IF DROP TRUE ELSE SWAP FALSE ENDIF UNTIL empty? IF from here move here h3 = IF capture ENDIF isPromouted @ IF current-piece-type 1+ change-type ENDIF is-rosette? IF q1 piece-type-at q5 create-piece-type-at ELSE q5 capture-at ENDIF add-move ENDIF ENDIF ; : pass-move ( -- ) q5 capture-at Pass add-move ; {moves i-moves {move} i-move-1 {move-type} normal-type {move} i-move-2 {move-type} normal-type {move} i-move-3 {move-type} normal-type {move} i-move-4 {move-type} normal-type {move} pass-move {move-type} pass-type moves} {moves p-moves {move} p-move-1 {move-type} normal-type {move} p-move-2 {move-type} normal-type {move} p-move-3 {move-type} normal-type {move} p-move-4 {move-type} normal-type {move} pass-move {move-type} pass-type moves} {move-priorities {move-priority} normal-type {move-priority} pass-type move-priorities}
is-rosetteã®ãã£ãããŒãªå®çŸ©ãæåã«
ãã£ããããŸãããïŒ ã æ®å¿µãªãããAxiomã§ã¯ãZRFãšã¯ç°ãªããã²ãŒã ãŸãŒã³ãå®çŸ©ããæ¹æ³ã¯ãããŸããã ãã¹ãŠã®ãã£ãŒã«ããåå¥ã«ãã§ãã¯ããå¿
èŠããããŸãã
ã¹ãããã®å®è£
ã¯ãZRFã§äœ¿çšãããã¢ãããŒããšãç°ãªããŸãã ããã¹ã¿ãŒã³ããªãã·ã§ã³ã®èšå®ã¯ãAxiomã«ãã£ãŠç¡èŠãããŸãã 代ããã«ã
Passã³ãã³ãã§ã¹ããããæ瀺çã«
æ§æããå¿
èŠããã
ãŸã ã ããã¯ãZSGã ãŒãèšé²èšæ³æ©èœïŒãšã³ãžã³ããZoGã«ã ãŒãã転éããããã«äœ¿çšïŒã®ããå®å
šãªäœ¿çšã®äžäŸã§ãã å¥ã®ãã®ãããªäŸã¯ãZRFã«å®è£
ãããŠããªããéšåçãªç§»åãå®è¡ãããšãã«
ããããã³ãã³ãã䜿çš
ããæ©èœã§ãã
ã泚æç¬èªã®æ¡åŒµã¢ãžã¥ãŒã«ïŒ ãšã³ãžã³ ïŒãéçºããå ŽåãZSGè¡šèšæ³ãç解ããããšã¯éåžžã«éèŠã§ãã ZoGã§ç§»åãå®è¡ããèœåã¯ãZSGè¡šèšã§èšè¿°ã§ãããã©ããã«ãã£ãŠå®å
šã«æ±ºå®ãããŸãã ZoGã¯ãã®åœ¢åŒãææžåããŸããããAxiomã®ææžã«ã¯ããã説æããã»ã¯ã·ã§ã³ããããŸãïŒä»é²BïŒã ãã®ã»ã¯ã·ã§ã³ã«ç²ŸéããŠãããšãZSGè¡šèšã®æ©èœãæ確ã«ããããã«ãéçºè
ãé·æéã®å®éšãè¡ãå¿
èŠããªããªããŸãã
ä»ã®ç§»åã®å¯èœæ§ããªãå Žåã«ã®ã¿ãã¹ãæ©èœããããã«ã¯ãåªå
é äœã䜿çšããå¿
èŠããããŸãã åªå
床ã®äœã移åã¯ãåªå
床ã®é«ã移åã®å¯èœæ§ããªãå Žåã«ã®ã¿å®è¡ã§ããŸãã æ®å¿µãªãããããã¹ã¿ãŒã³ããªãã·ã§ã³ã
forceã«èšå®ããå ŽåãAxiomã¹ã¿ã€ã«ã®ã¹ãããã¯ZoGã®åäœãšæ©èœçã«å®å
šã«åçã§ã¯ãããŸããã ZRFå®è£
ã§ã¯ãã¹ãããã¯èªåçã«å®è¡ãããŸããAxiomã®å Žåããã¿ã³ãã¯ãªãã¯ããå¿
èŠããããŸãã

ããã¯çŽããããããšã§ãã
ãã¢ãŠãã¬ããããžã®ç§»ååŸã«ã¹ããã移åãå®è£
ããããã«ãç®ã«èŠããªãå³åœ¢
ããã¯ãäœçœ®
q5ã«é
眮ãã
ãŸãããããã¯ã²ãŒã ã§ã¯äœ¿çšãããŸããã
common-moveã®æåã«ããã®ãã£ãŒã«ãã«æµã®ãã£ã®ã¥ã¢ãååšãããã©ããã®ãã§ãã¯ãè¡ãããŸãã ãã£ãŒã«ããæµã«å é ãããŠããå Žåã移åããããšã¯ã§ããŸããã
ããŠããããããæ¯ãæ¹æ³ãåŠã³ãŸãããã
骚æã {players {player} White {player} Black {player} ?Dice {random} players} {turn-order {turn} White {turn} ?Dice {of-type} clear-type {turn} ?Dice {turn} ?Dice {turn} ?Dice {turn} Black {turn} ?Dice {of-type} clear-type {turn} ?Dice {turn} ?Dice {turn} ?Dice turn-order} : drop-dices ( -- ) q2 here = q3 here = OR q4 here = OR empty? AND IF drop add-move ENDIF ; : count-dices ( -- n ) q2 piece-at piece-value q3 piece-at piece-value + q4 piece-at piece-value + DUP 0= IF DROP 4 ENDIF ; : clear-dices ( -- ) q1 here = verify q2 not-empty-at? q3 not-empty-at? q4 not-empty-at? AND AND IF drop q2 capture-at q3 capture-at q4 capture-at add-move ENDIF ; : i-move ( -- ) ['] Anext count-dices common-move ; : p-move ( -- ) ['] Cnext count-dices common-move ; {moves p-moves {move} p-move {move-type} normal-type {move} pass-move {move-type} pass-type moves} {moves drops {move} drop-dices {move-type} normal-type {move} pass-move {move-type} pass-type moves} {moves clears {move} clear-dices {move-type} clear-type moves} {pieces {piece} lock {moves} clears {piece} init {moves} i-moves {piece} prom {moves} p-moves {piece} wdice {drops} drops 1 {value} {piece} bdice {drops} drops 0 {value} pieces}
ãããŒã³ãïŒ
drop-dices ïŒã®
ã¹ããŒã¯åºæ¬çã«å®è¡ãããŸãã ã¿ãŒã²ãããã£ãŒã«ãããµã€ã³ããæããããã®ãã®ã§ããããšã確èªãã
ããããã³ãã³ãã§ã·ã§ã€ããé
眮ãã
add-moveã³ãã³ãã§ç§»åãçµäºããŸãã
ã¯ãªã¢ãã€ã¹ã¯ããå°ãè€éã§ãã ZoGã§ã¯ãããŒãããããŒã¹ãåãé€ãã ãã§æ§æãããã ãŒãã圢æããæ¹æ³ã¯ãããŸããã ã¯ãªãŒãã³ã°ããã»ã¹ããã²ãŒã ã§äœ¿çšãããŠããªã
q1ãã£ãŒã«ãã«äžå¯èŠã®æ°åããªã»ããããããšã«é¢é£ä»ããŸãã ããŒãããã骚ããåãé€ãããšã¯ããã®åãã®å¯äœçšã§ãã ããããããããã€ã³ããã«ãŠã³ããïŒ
count-dices ïŒããã®å€ã
common-moveã«æž¡ããŸãã
ã²ãŒã ãçµäºããæ¡ä»¶ã決å®ããããã«ãããŒããé¢ããããããæ°ããå¿
èŠããããŸãã å®äºãã§ãã¯èªäœã¯ããªãŒããŒã©ã€ããããåèª
OnIsGameOverãåŒã³åºãããšã«ãããAxiomã«ãã£ãŠå®è¡ãããŸãã ã²ãŒã ã®éå§æã«åæã¢ã¯ã·ã§ã³ïŒç䌌乱æ°ãžã§ãã¬ãŒã¿ãŒã®åæåãªã©ïŒãå®è¡ããã«ã¯ã
OnNewGameããªãŒããŒã©ã€ãããå¿
èŠããããŸãã
çµäºæ¡ä»¶ {board 5 17 {grid} {variable} WhitePieces {variable} BlackPieces board} : WhitePieces++ WhitePieces ++ ; : BlackPieces++ BlackPieces ++ ; : common-move ( 'dir n -- ) q5 enemy-at? NOT IF FALSE isPromouted ! SWAP BEGIN current-player White = IF here p2 ELSE here p4 ENDIF = IF TRUE isPromouted ! ENDIF DUP EXECUTE verify SWAP 1- DUP 0= IF DROP TRUE ELSE SWAP FALSE ENDIF UNTIL empty? IF from here move here h3 = IF current-player White = IF COMPILE WhitePieces++ ELSE COMPILE BlackPieces++ ENDIF capture ENDIF isPromouted @ IF current-piece-type 1+ change-type ENDIF is-rosette? IF q1 piece-type-at q5 create-piece-type-at ELSE q5 capture-at ENDIF add-move ENDIF ENDIF ; : OnNewGame ( -- ) RANDOMIZE ; : OnIsGameOver ( -- gameResult ) repetition-reset #UnknownScore current-player White = IF BlackPieces @ 7 - 0= IF DROP #LossScore ENDIF ENDIF current-player Black = IF WhitePieces @ 7 - 0= IF DROP #LossScore ENDIF ENDIF ;
ã泚æãªã³ããŒãå€æ°ã®äœ¿çšã«ã€ããŠã¯ãAxiomããã¥ã¡ã³ãã®ã»ã¯ã·ã§ã³3.9.4ãããŒãå€æ°ã®æŽæ°ãã§èª¬æããŠããŸãã
å®å
šãªã²ãŒã ãååŸããã«ã¯ããã£ã®ã¥ã¢ã®æŠããšç¹å¥ãªãã£ãŒã«ãã®åŠçãå®è£
ããå¿
èŠããããŸãã ãããã®è©³çŽ°ã¯åºæ¬çã«æ°ãããã®ãäœãèŒããŠããªãã®ã§ããããã®è©³çŽ°ã§èšäºãæ£ããããŸããã èå³ã®ããæ¹ã¯ã
GitHubã§ãRoyal Game of Urãã®å®å
šãªå®è£
ã確èªã§ã
ãŸã ã
åºæ¬çãªæ¬èœ
ZoGã®äž»ãªãã€ã©ã€ãã¯ããã®æ±çšæ§ã§ãã ZRFã§ã¯ãã«ãŒã«ã宣èšããã ãã§ãæ°ããã²ãŒã ãäœæïŒãŸãã¯æ¢åã®ã²ãŒã ãèšè¿°ïŒã§ããŸãã ã¯ããããã¯ç¹æ®ãªããã°ã©ã ãããèããæªãã§ãããã»ãšãã©ãã¹ãŠã®ã²ãŒã ã®ãããã¿ã€ãã
ãã°ããäœæãããã®ãããªæ©äŒã¯äŸ¡å€ããããŸãïŒ ZoGçšã«éçºãããã¢ããªã±ãŒã·ã§ã³
ã®æ°ã¯ ãããèªäœãç©èªã£ãŠããŸãã
å
¬çãæ®éçã§ãã ZoGã®äžæå¿«ãªå¶éã®å€ããåãé€ããZoGã察å¿ããŠããªãããŒãã²ãŒã ãèšè¿°ããããšãã§ããŸãã ããŒã«ãã©ã°ãæäœãã代ããã«æ¬æ Œçãªç®è¡æŒç®ã䜿çšãã1ã€ã®å¯èœæ§ã¯ããã®è£œåã質çã«é«ãã¬ãã«ã«åŒãäžããŸãããããã¯Axiomã®äž»ãªå©ç¹ã§ã¯ãããŸããïŒ ZoGã®ãã¬ã€ã¯è¯ããæªãããããŸãããç§ãã¡ã«ãšã£ãŠAIã¯ãã©ãã¯ããã¯ã¹ã§ãã 圌ã®ã²ãŒã ã®å質ã«åœ±é¿ãäžããããšã¯ã§ããŸããïŒ Axiomã¯ãæé©ãªåããéžæããããã®ã¢ã«ãŽãªãºã ã®éçºã«åå ããæ©äŒãæäŸããŸãïŒãã ããå¿
é ã§ã¯ãããŸããïŒã
AI Axiomã®äœæ¥ã劚ããæãæçœãªå¯èœæ§ã¯ãåäœçœ®ãè©äŸ¡ããããã®éã¿é¢æ°ã®éžæã§ãã ç§ãã¡ã«å¿
èŠãªã®ã¯ã
OnEvaluateãåå®çŸ©ããããš
ã ãã§ãã ãããã®æåããæåŸãŸã§ã®å
šäœçãªããã¢ãŒã·ã§ã³ãåºç€ãšããŠãéåžžã«åçŽãªè©äŸ¡é¢æ°ãäœæããŠã¿ãŸãããã éå§äœçœ®ã§ã®ãããã®é
眮ãéã¿0ã§è©äŸ¡ãããã«ãã¹ãééãããããã¯ãããšãã°100ãªã©ã®ãã倧ããªæ°ã§è©äŸ¡ãããŸããåé²ïŒã ãã¡ãããæµã«ã€ããŠã¯ãå察ã®ç¬Šå·ã§ååŸããåãæšå®å€ã䜿çšããŸãã æµã®äœçœ®ãè¯ãã»ã©ãäœçœ®ãæªããªããŸãã
ç°¡æè©äŸ¡æ©èœ VARIABLE whiteScored VARIABLE blackScored : Score ( value piece-type player pos -- score ) DUP not-empty-at? IF DUP player-at White = IF whiteScored -- ELSE blackScored -- ENDIF DUP ROT SWAP player-at = ROT ROT piece-type-at = AND NOT IF DROP 0 ENDIF ELSE DROP DROP DROP DROP 0 ENDIF ; : OnEvaluate ( -- score ) 7 whiteScored ! 7 blackScored ! 0 1 White i1 Score 0 1 White j1 Score + 0 1 White k1 Score + 0 1 White l1 Score + 0 1 White m1 Score + 0 1 White n1 Score + 0 1 White o1 Score + 0 1 Black i5 Score + 0 1 Black j5 Score + 0 1 Black k5 Score + 0 1 Black l5 Score + 0 1 Black m5 Score + 0 1 Black n5 Score + 0 1 Black o5 Score + 1 1 White l2 Score + -1 1 Black l4 Score + 2 1 White k2 Score + -2 1 Black k4 Score + 3 1 White j2 Score + -3 1 Black j4 Score + 4 1 White i2 Score + -4 1 Black i4 Score + 5 1 White i3 Score + -5 1 Black i3 Score + 6 1 White j3 Score + -6 1 Black j3 Score + 7 1 White k3 Score + -7 1 Black k3 Score + 8 1 White l3 Score + -8 1 Black l3 Score + 9 1 White m3 Score + -9 1 Black m3 Score + 10 1 White n3 Score + -10 1 Black n3 Score + 11 1 White o3 Score + -11 1 Black o3 Score + 12 1 White o2 Score + -12 1 Black o4 Score + 13 1 White p2 Score + -13 1 Black p4 Score + 14 2 White p3 Score + -14 2 Black p3 Score + 15 2 White p4 Score + -15 2 Black p2 Score + 16 2 White o4 Score + -16 2 Black o2 Score + 17 2 White o3 Score + -17 2 Black o3 Score + 18 2 White n3 Score + -18 2 Black n3 Score + 19 2 White m3 Score + -19 2 Black m3 Score + 20 2 White l3 Score + -20 2 Black l3 Score + 21 2 White k3 Score + -21 2 Black k3 Score + 22 2 White j3 Score + -22 2 Black j3 Score + 23 2 White i3 Score + -23 2 Black i3 Score + 1 1 White c2 Score + 1 1 White c3 Score + 1 1 White c4 Score + -1 1 Black d2 Score + -1 1 Black d3 Score + -1 1 Black d4 Score + 3 1 White a2 Score + 3 1 White a3 Score + 3 1 White a4 Score + -3 1 Black b2 Score + -3 1 Black b3 Score + -3 1 Black b4 Score + 7 1 White f2 Score + 7 1 White f3 Score + 7 1 White f4 Score + -7 1 Black f2 Score + -7 1 Black f3 Score + -7 1 Black f4 Score + 10 1 White g2 Score + 10 1 White g3 Score + 10 1 White g4 Score + -10 1 Black g2 Score + -10 1 Black g3 Score + -10 1 Black g4 Score + 11 1 White e2 Score + 11 1 White e3 Score + 11 1 White e4 Score + -11 1 Black e2 Score + -11 1 Black e3 Score + -11 1 Black e4 Score + 17 2 White e2 Score + 17 2 White e3 Score + 17 2 White e4 Score + -17 2 Black e2 Score + -17 2 Black e3 Score + -17 2 Black e4 Score + 18 2 White g2 Score + 18 2 White g3 Score + 18 2 White g4 Score + -18 2 Black g2 Score + -18 2 Black g3 Score + -18 2 Black g4 Score + 21 2 White f2 Score + 21 2 White f3 Score + 21 2 White f4 Score + -21 2 Black f2 Score + -21 2 Black f3 Score + -21 2 Black f4 Score + whiteScored @ 100 * + blackScored @ 100 * - current-player Black = IF NEGATE ENDIF ;
, Axiom . , . , ( ), , , :
: Mobility ( -- mobilityScore ) move-count \ Number of moves available to us. current-player TRUE 0 $GenerateMoves \ Generate moves for opponent move-count \ Number of moves available to opponent. - \ #friendlyMoves - #unfriendlyMoves $DeallocateMoves \ Deallocate the opponent's move list ; : OnEvaluate ( -- score ) Mobility current-player material-balance 3 * + ;
move-count ,
material-balance , ,
{value} ( , «»).
, ,
? , , , , .
, « », « »! Axiom :
VARIABLE BestScore \ Keep track of the best score found so far by our search engine. VARIABLE Nodes \ The number of possibilities explored by our search engine. VARIABLE Eated VARIABLE Rosettes : enemy-value-at ( pos -- value ) DUP empty-at? IF DROP 0 ELSE 0 SWAP player-at current-player <> IF DROP 1 ENDIF ENDIF ; : friend-value-at ( pos -- value ) DUP empty-at? IF DROP 0 ELSE 1 SWAP player-at current-player <> IF DROP 0 ENDIF ENDIF ; : Make_enemy_p ( pos -- ) <BUILDS , DOES> @ enemy-value-at ; : Make_friend_p ( pos -- ) <BUILDS , DOES> @ enemy-value-at ; i1 Make_enemy_p e0 j1 Make_enemy_p e1 k1 Make_enemy_p e2 l1 Make_enemy_p e3 m1 Make_enemy_p e4 n1 Make_enemy_p e5 o1 Make_enemy_p e6 i5 Make_enemy_p e7 j5 Make_enemy_p e8 k5 Make_enemy_p e9 l5 Make_enemy_p e10 m5 Make_enemy_p e11 n5 Make_enemy_p e12 o5 Make_enemy_p e13 i2 Make_friend_p r0 i4 Make_friend_p r1 l3 Make_friend_p r2 o2 Make_friend_p r3 o4 Make_friend_p r4 : CountEated ( -- count ) e0 e1 + e2 + e3 + e4 + e5 + e6 + e7 + e8 + e9 + e10 + e11 + e12 + e13 + ; : CountRosettes ( -- count ) r0 r1 + r2 + r3 + r4 + ; : Score ( -- score ) Eated @ CountEated < IF 10 ELSE 0 ENDIF Rosettes @ CountRosettes < IF 5 ELSE 0 ENDIF + ; : Custom-Engine ( -- ) -1000 BestScore ! \ Keep track of the best score. 0 Nodes ! \ Count the number of possibilities explored. CountEated Eated ! CountRosettes Rosettes ! ( Notes: 1 - We do not need to invoke $GenerateMoves since they have already been generated for the current player { since ZoG has called DLL_GenerateMoves prior to calling DLL_Search}. 2 - ZoG does not invoke the search engine if there are no moves, so we can safely assume. that at least one move exists. Thus we can use BEGIN..UNTIL instead of BEGIN...WHILE..REPEAT for iterating moves. ) $FirstMove \ Obtain the address of the first move. BEGIN $CloneBoard \ Create a temporary copy of the current board. DUP $MoveString CurrentMove! \ Inform ZoG of the current move being examined. DUP .moveCFA EXECUTE \ Apply the move to the board by executing its code. Score \ Calculate the score for the new board. BestScore @ OVER < \ Have we found a better score? IF DUP BestScore ! \ Save the improved score. Score! \ Inform ZoG of the improved score. DUP $MoveString BestMove! ELSE DROP \ We didn't find a better move, drop the score. ENDIF $DeallocateBoard \ Done with the revised board. Nodes ++ \ Count one more node explored. Nodes @ Nodes! \ Inform ZoG of the node count. $Yield \ Allow ZoG to dispatch Windows messages. $NextMove \ Advance to the next move. DUP NOT \ No more moves? UNTIL DROP ; {players {player} White {search-engine} Custom-Engine {player} Black {search-engine} Custom-Engine {player} ?Dice {random} players}
. , , . , ,
OnEvaluate , . . «», , , .
, Axiom
{first} {random} . axiom.4th:
: $RandomMoveEngine $FirstMove 0 $movesList @ CELLSIZE + @ 1- $RAND-WITHIN BEGIN DUP 0> WHILE SWAP @ SWAP $Yield 1- REPEAT DROP ( move ) $MoveString DUP CurrentMove! BestMove! 1 Nodes! 0 Score! 0 Depth! ; : {random} ['] $RandomMoveEngine $CompileEngine ; : $FirstMoveEngine $FirstMove $MoveString DUP CurrentMove! BestMove! $Yield ; : {first} ['] $FirstMoveEngine $CompileEngine ;
å
ã»ã©èšã£ãããã«ããªãŒãã³ãœãŒã¹ã®ïŒäžéšã§ãïŒãœãŒã¹ã³ãŒãã¯çŽ æŽãããã§ãïŒåãé²éªšãªåãšçµ±èš
ããŠãæ°ããã²ãŒã ãäœæããZoGã䜿çšããŠãã¬ã€ã§ããŸããããŸããŸãªç§»åéžæã¢ã«ãŽãªãºã ãåããããã€ãã®ã²ãŒã ãªãã·ã§ã³ãå®è£
ããŸããããã©ããããè¯ãããã©ã®ããã«å€æããã®ã§ãã ãã¡ãããããŒã¹ã®ãå°é家ããéããŠãããããã®ãªãã·ã§ã³ã§100åãã¬ã€ããããã«äŸé Œããããšãã§ããŸããç§ã®å人ãèšã£ãããã«ããããã¯äœå¹Žãç¶ãããšãã§ããŸããããã£ãšè¯ãæ¹æ³ããããŸãïŒAxiomã¯ããã¹ãããã»ã¹ãèªååããAutoPlayãŠãŒãã£ãªãã£ãæäŸããŸããèªååã®ãã¹ããã©ãæåã®ããšã¯ãã²ãŒã ãªãã·ã§ã³ãäœæããããšã§ãã (variant (title "Ur [random]")) (variant (title "Ur [simple evaluation]")) (variant (title "Ur [aggressive]"))
ãããã®è¡ãZRFãã¡ã€ã«ã®æåŸã«è¿œå ããåŸãZRF Converterãå床起åããŠãã²ãŒã ã®4çªç®ã®ããŒãžã§ã³ãååŸããŸãããããã®ãã¡ã€ã«ãå€æŽããŠãããã°ã©ã ã§äœ¿çšãããæŠç¥ã«åœ±é¿ãäžããå¿
èŠããããŸããããã§ã¯ãããšãã°ãæãåçŽãªãªãã·ã§ã³ã®1ã€ã«èŠããŸãã LOAD Ur.4th ( Load the base Ur game ) {players {player} White {random} {player} Black {random} {player} ?Dice {random} players}
èŠãããããã«ã説æã®åã
ã®ã»ã¯ã·ã§ã³ãåå®çŸ©ããŠããã¹ãŠã®å
±æã³ãŒããããŒããããã¹ã¯ãªãããã¡ã€ã«ã«åã蟌ãããšãã§ããŸãããªãã·ã§ã³ãäœæãããåŸããããªãã·ã§ã³ã®ã²ãŒã ã¢ãŒãã§å¥ã®ãªãã·ã§ã³ã«å¯ŸããŠã²ãŒã ãéå§ã§ããŸãããããèªååçã®äž»ãªå©ç¹ã§ãïŒãã¬ã€ã€ãŒãããŸããŸãªæŠç¥ã䜿çšããŠãã¬ã€ãããªãã·ã§ã³ãäœæããå¿
èŠã¯ãããŸããã次ã®ã³ãã³ããå
¥åããã ãã§ååã§ãã AutoPlay Ur-[random] Ur-[random] 100
. ( AutoPlay ) . . , ZoG! , ZSG-. , , , , , ( , «»):
Final results: Player 1 "Ur-[random]", wins = 52. Player 2 "Ur-[random]", wins = 48. Draws = 0 100 game(s) played
ZSG- , , ZoG . ,
( , ).
ZSG-, , , , , / . , , «» :
ããã§ãéçºãããªãã·ã§ã³ã®ã²ãŒã å質ãæ¯èŒããããã«å¿
èŠãªãã¹ãŠãæããŸããã次ã®3ã€ã®ãªãã·ã§ã³ãæ€èšããŸãã- 移åã®ã©ã³ãã ãªéžæïŒã©ã³ãã ïŒ
- åçŽãªè©äŸ¡é¢æ°ïŒsimpleïŒ
- ãç©æ¥µçãªãéžæã¢ã«ãŽãªãºã ã¹ãããŒã¯ã«ïŒç©æ¥µçãªïŒ
ã©ã³ãã vsã©ã³ãã ( , , 150 ):

, ( â ):

«» :

, , , :
Final results: Player 1 "Ur-[random]", wins = 52. Player 2 "Ur-[random]", wins = 48. Draws = 0 100 game(s) played
ã©ã³ãã vsã·ã³ãã«:

:
Final results: Player 1 "Ur-[random]", wins = 50. Player 2 "Ur-[simple-evaluation]", wins = 50. Draws = 0 100 game(s) played
åçŽå¯Ÿã©ã³ãã :

«» :

Final results: Player 1 "Ur-[simple-evaluation]", wins = 87. Player 2 "Ur-[random]", wins = 13. Draws = 0 100 game(s) played
ã©ã³ãã vsã¢ã°ã¬ãã·ã:
random ( ):

, , «» :

«» , !
Final results: Player 1 "Ur-[random]", wins = 25. Player 2 "Ur-[aggressive]", wins = 75. Draws = 0 100 game(s) played
ã¢ã°ã¬ãã·ãvsã©ã³ãã :

«» «» !

, «» , :

Final results: Player 1 "Ur-[aggressive]", wins = 90. Player 2 "Ur-[random]", wins = 10. Draws = 0 100 game(s) played
ã·ã³ãã«vsã¢ã°ã¬ãã·ã, . ,
simple :

!

Final results: Player 1 "Ur-[simple-evaluation]", wins = 73. Player 2 "Ur-[aggressive]", wins = 27. Draws = 0 100 game(s) played
ã¢ã°ã¬ãã·ãvsã·ã³ãã«,
agressive :

«» , , «»:

Final results: Player 1 "Ur-[aggressive]", wins = 64. Player 2 "Ur-[simple-evaluation]", wins = 36. Draws = 0 100 game(s) played
ãšããã§ã次ã®ãã°ãããè¡ã«æ³šæããŠãã ããã Draws = 0
, Axiom «3-Time Repetition Draw!». . , ZoG . (3-4 ) . « », , , ZoG ( Axiom) ! AutoPlay, . , , ZoG, .
⊠!
ãã¡ããããã£ã1ã€ã®èšäºã§ã¯ãAxiom Development Kitã®ãããªè€éã§å€é¢çãªè£œåã«ã€ããŠãã¹ãŠãäŒããããšã¯äžå¯èœã§ããéçºè
ã«ãã£ãŠçºè¡šãããæ©èœãåç
§ããŠãã ãããå
¬çãšã³ãžã³ã®æ©èœ- Contains a universal game engine designed to play a large variety of games. The search engine is not optimized for any particular class of games.
- Allows (actually requires) the game programmer to specify a custom game AI. This is one of the main benefits of Axiom. Some 'built-in' AI helpers are provided. For example, one helper is simply the difference between the number of available moves for each player, another takes into consideration material advantage. The list is expected to grow over time.
- «Minimax with Alpha-Beta pruning» search algorithm.
- Iterative deepening with transposition table.
- Zobrist hashing
- Limited move reordering based on 'best move from previous iteration' stored in the transposition table.
- Full width searching.
- Support for 'partial' and 'pass' moves.
- Supports 'teams'.
- Time management.
- Supports additional user-supplied custom engines.
- Programmer controlled quiescence (currently experimental)
, , ZoG. Axiom (Ring Buffer) «» « ». , ( ZoG, , ), Axiom , .
. , . , ZoG
60 , Axiom, .