ãã£ã±ãã鳩ã眪ãç¯ããªãã§ïŒ
ããªãã®ãããŒã奪ããŸãã
ç§ã¯ãéã®ããã§ã¯ãããŸããã
ç§ã¯éã®ããã§ãã
ã¬ãªããŒãã»ãã£ã©ããã å°æåº§ãã§ããã®ç©èªã倧èãªè¥è
ã
楜ãã¿ã®ããã ãã«ã
ã©ã€ãã¹ã»ããŒãã«ãºäººã
ãå€ãã®æ¹æ³ã§æ¥œããã®ã¯ç§å¯ã§ã¯ãããŸããã ãã¬ããèŠãã®ã奜ããªäººãããã°ãã¯ã¢ããã³ãã¿ãŒãéãã人ãããŸãã ã¬ã·ããå
±æãããã ãã¹ãŠã®äººã«åœ¹ç«ã€ãšã¯èããããŸãããã誰ããèå³ãæã€ãããããŸããã ç§ã¯ããã°ã©ã ãæžãã®ã奜ãã§ãïŒãããŠãããã¯ããã®ããã°ã©ããŒã®éã§ãçããããšã§ã¯ãªããšæããŸãïŒãããã®ããã»ã¹ãéå±ãªã«ãŒãã³ã«å€ãããšãã¯ããŸã奜ãã§ã¯ãããŸããã
ãããããããšã«ãããã°ã©ãã³ã°ã¯äžçš®ã®ãå¿ã®è² æ
ãã§ãªããã°ãªããŸããã ãã®ãããªïŒæçšãªïŒãšã³ã¿ãŒãã€ã³ã¡ã³ãã®è¯ãäŸã¯ãSQLã¯ãšãªãã³ã³ãã€ã«ããã¹ãã«ã®åäžã«å°å¿µããæåãª
ãªãœãŒã¹ã§ãã ããããçããŠããäžäººã®SQLããã°ã©ããŒã§ã¯ãããŸããïŒ æè¿ã
ãã©ãŒãã®æææš©ãåäžãããçŽ æŽãããæ¹æ³ãèŠã€ããŸããã
Axiomã䜿çšãããšãFortã§ååã«ããã°ã©ã ã§ããŸãïŒ
å
¬çãæ¥œããããããã®ç§ã®ã¬ã·ãã¯ç°¡åã§ãïŒ
- ZoGã³ãã¥ããã£ã«ãã£ãŠãŸã å®è£
ãããŠããªããã®ã®äžãããããå®å
šãªã«ãŒã«ãæã€ã²ãŒã ãéžæããŸã
- Axiomã䜿çšããŠããããå®çŸããããšããŠããŸãã
- ç§ãã¡ã¯ããããçããåé¡ã解決ããéçšã§æ¥œãã¿ãŸã
- çµæã®ã¢ããªã±ãŒã·ã§ã³ãåçããããšãé¢çœãå ŽåãçæãããFunã¯èªåçã«2åã«ãªããŸãïŒ
ãã®èšç»ã®æåã®æ®µèœã®å®è£
ã«ãããã€ã³ã¿ãŒãããã¯éåžžå©ãã«ãªããŸãã ä»åã¯ãé人éçãªå®éšã®å¯Ÿè±¡ãšããŠ
Splutãéžæã
ãŸããã ã IG Game Centerã«é¢ãã圌ã®
説æã以äžã«ç€ºããŸãã ã«ãŒã«ãæ¹ããŠèª¬æããããšãªãããã®ã²ãŒã ã®é
åã説æããŸãã
- 3人以äžã®ãã¬ã€ã€ãŒããã¬ã€ããŸãïŒããçšåºŠãAIã¢ã«ãŽãªãºã ã®èª²é¡ã§ãïŒ
- ãã¬ãŒã€ãŒã®ã¿ãŒã³ã«ã¯ãããã€ãã®ïŒ1ãã3ïŒããŒã¹ã®é£ç¶ããåããå«ãŸããŸã
- åå©ã«è³ããŸã§ã®åãã¯åçŽã§ã¯ãããŸããïŒããŒã¹ãåããé£ã¹ãã ãã§ã¯ãªãã1ã€ã®ç®æšã«åãããŠäžé£ã®åããå®è¡ããå¿
èŠããããŸãïŒ
- ãã®ã²ãŒã ã®ã«ãŒã«ã¯éåžžã«ææ
®æ·±ããéåžžã«ç¬åµçã§ãã
çºèšèè
ã¯åœŒã®ã²ãŒã ã®æš©å©ã«ã€ããŠæ¬¡ã®ããã«æžããŠããŸãã
SPLUTã²ãŒã ã®ã¢ã€ãã¢ãšãã¶ã€ã³ã¯èäœæš©ã§ä¿è·ãããŠããŸãã ãã¶ã€ããŒã®Tommy De Coninckã®æžé¢ã«ããèš±å¯ãªãã«ããã®åºçç©ã®ã¢ã€ãã¢ãã³ã³ãã³ãã忥ç®çã«äœ¿çšããããšã¯ã§ããŸããã
ç§ã¯ã²ãŒã ã®ã¢ã€ãã¢ããã¶ã€ã³ã忥ç®çã§äœ¿çšããã€ããã¯ãªãã®ã§ããã®ã¢ã€ãã ã¯ãã¹ãŠæ£åžžã«æ©èœããŠããŸãã
éæ³ãæããã«ãã
Funã®éçºãå§ããŸãããã ç°¡åãªããšããå§ããŸããã-ãããŒã«ã®åãããã å³ã®éåžžã®ç§»åã¯ãåé¡ãåŒãèµ·ãããŸããã ãã®å®è£
ã¯æçœã§ãããAxiomã®æŠå¿µã説æããã®ã«é©ããŠããŸãã
éããªã©ã³ãã³ã°: one-step ( 'dir -- ) EXECUTE verify \ empty? verify \ ? from \ here \ move \ add-move \ ;
ããã«ã¢ããã€ã¹ãããã®ã§ãã³ã¡ã³ãã«æ³šæããŠãã ããïŒæ¬åŒ§å
ïŒã ã¹ã¿ãã¯ã§äœãèµ·ãã£ãŠããã®ãæ··ä¹±ããªãããã«ããã®ã«åœ¹ç«ã¡ãŸãïŒããã¯Fortã§æ¬åœã«éèŠã§ãïŒã ã¹ããŒã¹ã«ã泚æãæã䟡å€ããããŸãã èšå®ãããŠã
ãªãã¹ããŒã¹ãééã£ãå Žæã«ãããšãå€ãã®æéãè²»ããããšã«ãªããŸãã
ã³ãŒãèªäœã«ãããšããã¹ãŠãæç¢ºã ãšæããŸãã
EXECUTEã³ãã³ãã䜿çšããŠãïŒã¹ã¿ãã¯ããååŸããïŒæ¹åã«é·ç§»ãå®è¡ãããã®åŸãé·ç§»ã®ããŒã«çµæã確èªããŸãïŒ
TRUEã§ãªãå Žåãç§»åã®èšç®ãå®äºããŸãïŒã 次ã«ãã¿ãŒã²ããã»ã«ã空ã§ããããšã確èªããŠãããFigureãç§»åããŸãã
ç§»åãå®è¡ãã
ç§»åã³ãã³ãã¯ãã¹ã¿ãã¯ãã2ã€ã®å€ãååŸããŸããç§»åã®éå§ç¹ïŒ
from ïŒãšç§»ååŸã®äœçœ®ïŒ
ãã ïŒã§ãã
add-moveã³ãã³ãã¯ãç§»åã®åœ¢æãå®äºããŸãã
ç³ã®åãã䌎ãããå°ãè€éãªåãïŒ
ã¹ããŒã³ãã©ãã° : drag ( 'dir 'opposite -- ) EXECUTE verify \ is-stone? verify \ ? piece-type \ SWAP here SWAP \ DUP EXECUTE DROP EXECUTE verify \ empty? verify \ ? from \ here \ move \ capture-at \ , from create-piece-type-at \ , add-move \ ! ; : drag-to-north ( -- ) ['] north ['] south drag ; : drag-to-south ( -- ) ['] south ['] north drag ; : drag-to-east ( -- ) ['] east ['] west drag ; : drag-to-west ( -- ) ['] west ['] east drag ;
ããã§ãã¹ã¿ãã¯ã«2ã€ã®æ¹åãã€ãŸãç§»åã®æ¹åãšåå¯Ÿã®æ¹åãåæã«é
眮ããŸãã ã¹ã¿ãã¯ãæäœãããããã³ãŒãèªäœã¯ããè€éã«èŠããŸãããæ
£ããããšãã§ããŸãã ã¡ã€ã³ãã£ã®ã¥ã¢ãç§»åãã
åŸããã£ã®ã¥ã¢ããã£ããã£ãŸãã¯äœæããããã®ãã¹ãŠã®ããµã€ããã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠãããããšãéåžžã«éèŠã§ãã ãŸããåã³ãã³ãã®åŸã«ã¹ã¿ãã¯ã«äœãäœã®é åºã§é
眮ãããŠããããèŠããŠããããšãéèŠã§ãã ã³ãã³ãèªäœã®è©³çްãªèª¬æã¯ãåžžã«Axiomããã¥ã¢ã«ã«èšèŒãããŠããŸãã
ãã ããããæç¹ã§ã¯ãç¹ã«åæ¢ãã䟡å€ããããŸãã
is-stoneè¿°éšã¯ãçŸåšã®ã»ã«ã®åœ¢ç¶ãStoneã§ããããšãæ€èšŒã
ãŸããïŒ ã ãã¡ãããããã¯çµã¿èŸŒã¿ã®Axiom颿°ã§ã¯ãªããç§ãã¡ã®ãã®ã§ãã ãã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
ç³ïŒ DEFER SSTONE DEFER NSTONE DEFER WSTONE DEFER ESTONE : is-stone? ( -- ? ) piece-type SSTONE = piece-type NSTONE = OR piece-type WSTONE = OR piece-type ESTONE = OR ; ... lock pass-moves sstone stone-drops nstone stone-drops wstone stone-drops estone stone-drops wizard wizard-moves dwarf dwarf-moves troll troll-moves pieces} ' sstone IS SSTONE ' nstone IS NSTONE ' wstone IS WSTONE ' estone IS ESTONE
ååã®
èšäºã§ ããªããžã§ã¯ãã®ååïŒãã®å Žåã¯å³åœ¢ïŒãå®çŸ©ãããŸã§äœ¿çšã§ããªããšäžæºãèšã£ãããšãèŠããŠããŸããïŒ
DEFERã䜿çšãããšããã®åé¡ã«å¯ŸåŠã§ã
ãŸã ã å¯äžã®æªãéšåã¯ããã®éèŠãªãã¿ãŒã³ãAxiomã®ããã¥ã¡ã³ãã«èšèŒãããŠããªãããšã§ãã
ãããããªã4çš®é¡ã®ç³ãããã®ã§ããããïŒ ã§ããŸãããïŒ æ²ããããªãSplutã®ã«ãŒã«ïŒ ç³ã®ãåæ§ããªãã§ã¯ã§ããªããããªæ¹æ³ã§ç·šéãããŠããŸãã ãªããããå¿
èŠãªã®ããåŸã§ç€ºããŸãã
ããã§ãããŒã«ã¯ç§»åããïŒãªãã·ã§ã³ã§ïŒãã®åŸãã«ã¹ããŒã³ããã©ãã°ã§ããŸãããäœãå¿ããŠããããã§ãã å®éã®ãšãããSplutã§ã·ã§ã€ããèªç¶ã«æžããå¯äžã®æ¹æ³ã§ãïŒ ããã«ã¯åœŒãã«ç³ãæãããšããäºå®ã®ããã«ïŒ ã³ãŒãããŸãšããŠãäžè¶³ããŠããæ©èœã远å ããŸãã
ãããŒã«ã®åã DEFER CONTINUE-TYPE : one-step ( 'dir -- ) check-continue? IF EXECUTE verify empty? verify from here move add-move ELSE DROP ENDIF ; : step-to-north ( -- ) ['] north one-step ; : step-to-south ( -- ) ['] south one-step ; : step-to-east ( -- ) ['] east one-step ; : step-to-west ( -- ) ['] west one-step ; : drag ( 'dir 'opposite -- ) check-continue? IF EXECUTE verify is-stone? verify piece-type SWAP here SWAP DUP EXECUTE DROP EXECUTE verify empty? verify from here move capture-at DUP lock-stone from create-piece-type-at add-move ELSE DROP DROP ENDIF ; : drag-to-north ( -- ) ['] north ['] south drag ; : drag-to-south ( -- ) ['] south ['] north drag ; : drag-to-east ( -- ) ['] east ['] west drag ; : drag-to-west ( -- ) ['] west ['] east drag ; : take-stone ( 'dir -- ) check-continue? IF EXECUTE verify is-stone? verify CONTINUE-TYPE partial-move-type from here move add-move ELSE DROP ENDIF ; : take-to-north ( -- ) ['] north take-stone ; : take-to-south ( -- ) ['] south take-stone ; : take-to-east ( -- ) ['] east take-stone ; : take-to-west ( -- ) ['] west take-stone ; : drop-stone ( 'opposite 'dir -- ) check-edge? check-wizard? OR on-board? AND IF check-troll? piece-is-not-present? AND IF player piece-type drop WIZARD = IF drop-team ELSE DROP ENDIF lock-continue current-piece-type lock-stone add-move ENDIF ENDIF ; : drop-to-north ( -- ) ['] north ['] south drop-stone ; : drop-to-south ( -- ) ['] south ['] north drop-stone ; : drop-to-east ( -- ) ['] east ['] west drop-stone ; : drop-to-west ( -- ) ['] west ['] east drop-stone ; {moves troll-moves {move} step-to-north {move-type} normal-type {move} step-to-south {move-type} normal-type {move} step-to-east {move-type} normal-type {move} step-to-west {move-type} normal-type {move} drag-to-north {move-type} normal-type {move} drag-to-south {move-type} normal-type {move} drag-to-east {move-type} normal-type {move} drag-to-west {move-type} normal-type {move} take-to-north {move-type} normal-type {move} take-to-south {move-type} normal-type {move} take-to-east {move-type} normal-type {move} take-to-west {move-type} normal-type moves} {moves stone-drops {move} drop-to-north {move-type} continue-type {move} drop-to-south {move-type} continue-type {move} drop-to-east {move-type} continue-type {move} drop-to-west {move-type} continue-type moves} ' continue-type IS CONTINUE-TYPE
ãã«ããŒé¢æ°ã«ã€ããŠã¯èª¬æããŸããã
ããã§ãããã®å®è£
ãèŠãããšãã§ã
ãŸã ã ç§ã¯ã¹ããŒã«ã®ã¿å°å¿µããŸãã ããã«ã¯ã
ãã€ã¯ã¹ããŒã³ã ãŒãïŒãã®é¢æ°ã®å®è£
ã¯ç°¡åã§ãïŒã§ã¹ããŒã³ãåãããšãã§ããŸãããã®åŸã
partial-move-typeã³ãã³ãã¯ãæå®ãããã¿ã€ãïŒ
continue-type ïŒã§ã ãŒãã®ç¶ç¶ãæå¹ã«ããŸãã ãã®ã¿ã€ãã§ã¯ãç»é²ãããŠããç§»åã®å¯äžã®ã¿ã€ãã¯ãããŒããžã®ã¹ããŒã³ã®
ããããã§ã ã
ãšã«ããæããããšã¯ã§ããŸããããå³å¯ã«å®çŸ©ãããå Žæã«æããŠãã ããïŒ ã«ãŒã«ã«ããã°ãç³ã¯ãããŒã«ãããŸã£ããïŒåçŽãŸãã¯æ°Žå¹³ã«ïŒé£ã³ããã¯ãŒãã®é äžãé害ç©ïŒéé士ãããŒãã®ç«¯ãŸãã¯å¥ã®ãããŒã«ïŒã«åãã£ãŠé£ãã§ãããŸãã ã¡ã€ãžã¯ããã«ããã¯ããä»ã®å Žåã«ã¯ããŒãã«èœã¡ãŸãã ãã¯ãŒãããã®å Žæã§çµãã£ãå Žåã圌ã¯åã«éãæªãã£ãã ããã¯å®è£
ããã®ãé£ããã«ãŒã«ã§ãããããäžæ¹ã®ç«¯ããéå§ããæ¹ã䟿å©ã§ãã é害ç©ã«é£æ¥ãããã£ãŒã«ããæ¢ãã空ã®ã»ã«ãŸãã¯ãã¯ãŒããå æããŠããã»ã«ã«æ²¿ã£ãŠãå察æ¹åã«ç§»åããŸãã éè·¯ã«æ²¿ã£ãŠãããŒã«ã«åºäŒã£ãå Žåãç§»åãéå§ããå Žæã«ç³ãæããããšãã§ããŸãã
ããã«ãé¢é£ããã«ãŒã«ãã³ãŒãã«å®è£
ãããŠããŸãã ããšãã°ãã¡ã€ãžã殺ããããšã圌ã®ããŒã å
šäœããã£ãŒã«ãããåé€ããããšããäºå®ãšãç³ãæããããåŸããã®åãã¯ããã«å¥ã®ãã¬ã€ã€ãŒã«æž¡ããšããäºå®ã§ãã ããã«ã€ããŠã¯è©³ãã説æããŸããã
ãããã«ç°ãªãçš®é¡ã®ããºã«ã¯ãç¹å¥ãªGnomeã®åãã§ãã ããŒã ã¯ãç¬èªã®åã§ããã®åã«ããä»»æã®æ°ã®ãã£ã®ã¥ã¢ïŒã¹ããŒã³ãå«ãïŒãäžåã«åããããšãã§ããŸãã ããããã¹ãŠã®åœ¢ç¶ãä¿åããã«ã¯ãæããã«ã¹ã¿ãã¯ãå¿
èŠã§ãã ä»ã®ãã¹ãŠã®ããã«ã倿°ã䜿çšã§ããŸãïŒ
ããŒã ã¹ãããŒã¯ VARIABLE forward VARIABLE backward VARIABLE step-count VARIABLE here-pos : push-step ( 'opposite 'dir -- ) check-continue? IF 0 step-count ! forward ! backward ! forward @ EXECUTE verify not-empty? verify step-count ++ player piece-type here here-pos ! BEGIN forward @ EXECUTE IF empty? IF TRUE ELSE step-count ++ player piece-type FALSE ENDIF ELSE BEGIN step-count @ 0> IF step-count -- DROP DROP FALSE ELSE TRUE ENDIF UNTIL TRUE ENDIF UNTIL step-count @ 0> verify from here-pos @ move BEGIN step-count @ 0> IF step-count -- DUP is-stone-type? IF DUP lock-stone ENDIF create-player-piece-type backward @ EXECUTE DROP FALSE ELSE TRUE ENDIF UNTIL add-move ELSE DROP DROP ENDIF ;
ã¯ãããããçè§£ããããšã¯åã®ã³ãŒããããå°é£ã§ãããã¢ã¯ã·ã§ã³ã®æ¬è³ªã¯ç°¡åã§ãã ç§ãã¡ã¯äžæ¹åã«ç§»åããã¹ã¿ãã¯äžã®ããŒã¹ã空ã®ã»ã«ã«ã¹ã¿ãã¯ããŠãããããŒãäžã§ããããäœæãã1ã¹ãããç§»åããŸãïŒåãã»ã«ã«è€æ°ã®ããŒã¹ã眮ãããšã¯ã§ããªããããããŒã¹ãåé€ããããšãå¿é
ããå¿
èŠã¯ãããŸãã-ZoGã¯ããããåé€ããŸãç¬ç«ããŠïŒã ãã®ã³ãŒããã©ã®ããã«æ©èœããããçè§£ããŠã¿ãŠãã ãã;ããã¯è¯ããå¿ã®äœæãã§ãã
ãã¡ãããã¡ã€ãžãç§ãã¡ã«æå€§ã®åé¡ãåŒãèµ·ãããªããã°ãã¡ã€ãžã¯ã¡ã€ãžã§ã¯ãããŸããã ã¡ã€ãžã¯ç³ãæµ®éãããããšãã§ããŸãã ä»»æããã ã...ç¹å®ã®æ¡ä»¶äžã§ã ããšãã°ãåã®ç§»åã§ïŒäœããã®åœ¢ã§ïŒç§»åããç³ãæµ®äžãããããšã¯ã§ããŸããã ããã¯ããã«çåãæèµ·ããŸãïŒåã®åããšããŠäœãèæ
®ããã¹ãã§ããïŒ æ®å¿µãªãããã«ãŒã«ã¯ãã®ç¬éãè§£èªããŸããã ç§ã®ã³ãŒãã§ã¯ãåããæåã®ãã¬ãŒã€ãŒã«æž¡ãçŽåã«ãåãç³ã®å
åã®ã¯ãªãŒãã³ã°ãå®è£
ããŸããïŒããã§ã¯ãåæ§ãå¿
èŠã§ããåç³ã«ã¯ç¬èªã®ãã©ã°ããããŸãïŒã ãã¡ãããããã¯åœŒã«æ·±å»ãªå©ç¹ããããããŸãïŒåœŒã¯ã©ã®ç³ãåããããšãã§ããåŸç¶ã®ãã¬ã€ã€ãŒã¯åœŒãåããªãã£ããã®ã ããåããããšãã§ããŸãïŒãããã®ã«ãŒã«ã®ä»ã®å¯èœãªå®è£
ãå®ç§ã§ã¯ãããŸããã
æµ®æç³ : fly-stone ( 'dir -- ) check-continue? IF DUP EXECUTE empty? AND IF a5 to BEGIN is-stone? not-locked? AND IF here here-pos ! DUP piece-type SWAP EXECUTE SWAP can-fly? AND IF from to DUP EXECUTE DROP from here move here-pos @ to DUP piece-type SWAP capture EXECUTE DROP DUP lock-stone DUP begin-fly create-piece-type add-move ENDIF here-pos @ to ENDIF DUP next NOT UNTIL ENDIF DROP ELSE DROP ENDIF ;
ããã§ã¯ãå¿
èŠãªãã®ããã¹ãŠå®è£
ããŠããããšãèãããšãééããç¯ããããã§ãã ãããããã¹ãŠã®å¯èœæ§ãå®çŸããŠããããã§ã¯ãããŸããïŒ ã¹ããŒã³ã®é£ã«ç©ºã®ã»ã«ãããå Žåãã¡ã€ãžã¯ã¹ããŒã³ãå æããŠããã»ã«ã«ç§»åã§ããŸããïŒ ã²ãŒã ã®ã«ãŒã«ã«ã¯ãã¯ãããšãããŸãããã³ãŒãã¯ããã§ã¯ãªããšèããŠããŸãã å®éãã¡ã€ãžã¯åœŒã®åã§ã¹ããŒã³ããããã·ã¥ãããããšãã§ããŸãã ããã¯äžçš®ã®æµ®æã§ãïŒ
ç®ã®åã§ç³ãæŒã : push-stone ( 'dir -- ) check-continue? IF DUP EXECUTE is-stone? not-locked? AND AND IF piece-type can-fly-lock? IF here SWAP piece-type SWAP EXECUTE empty? AND IF SWAP from SWAP move DUP lock-stone DUP begin-fly create-piece-type add-move ELSE DROP DROP DROP ENDIF ELSE DROP ENDIF ENDIF ELSE DROP ENDIF ;
ãã®ã³ãŒãã¯ããã£ãŒã«ãå
šäœã§Stonesãæ€çŽ¢ããå¿
èŠããªããããããç°¡åã§ãã ç³ã§å ãããããã£ãŒã«ãã«ç«ã¡ããå Žåãæµ®æã§ããç³ã¯ããã ãã§ãã
AãšBã¯ãã€ãã®äžã«åº§ã£ãŠãã
äžèšã§è¿°ã¹ãããã«ã3人以äžã®ãã¬ãŒã€ãŒãé¢äžããã²ãŒã ã®AIã®å®è£
ã«ã¯ãããã€ãã®å°é£ã䌎ããŸãã ã²ãŒã ãçµäºããããã®æ¡ä»¶ã決å®ãããšããåé¡ã¯ãã§ã«å§ãŸããŸãã ããšãã°ãç§ãæè¿å®æœããã²ãŒã
Yonin Shogi ïŒ4人çšã®æ¥æ¬ã®ãã§ã¹ã®ããªã¢ã³ãïŒã§ã¯ãæåæ¡ä»¶ã次ã®ããã«å®çŸ©ããã®ã¯é
åçã§ãã
(loss-condition (South North West East) (checkmated King))
ãã®ãšã³ããªã¯ããã¬ã€ã€ãŒã®ããããã®çã«ãããã®åã«ã²ãŒã ããã¬ã€ããå¿
èŠãããããšãæå³ããŸãã æ®å¿µãªããããã®ã¢ãããŒãã¯æ©èœããŸããïŒ ç§ã¯ãã§ã«ã
checkmatedã³ãã³ããæã€ãéæ³ããå€ããããš
æžããŸããã ç¹ã«ãçã¯åžžã«ã·ã£ãŒãé¢ããªããã°ãªããªãïŒãããŠã·ã£ãŒã®äžã«æ±ºããŠç«ã¡å
¥ããªãïŒãšåœŒå¥³ã¯æ±ºå®ããŸãã å
šäœãšããŠã2人ã®ãã¬ã€ã€ãŒãã²ãŒã ã«åå ããŠããéããæ©èœããŸãã ãããªã¯åé¡ã瀺ããŠããŸãïŒ
ã芧ã®ãšããã
ãã§ãã¯ã¡ã€ãã¯4人ã®ãã¬ã€ã€ãŒã®ãã¡1人ã ãã§åé¡ãªãåäœããŸãã ä»ã®ãã¬ã€ã€ãŒã®å Žåããã§ãã¯ã«å¯Ÿããé²åŸ¡ã¯å¿
é ã®åããšã¯èŠãªãããŸããïŒ ãã¡ãããæ¬¡ã®åãããã®ãããªç
ã¯é£ã¹ããã
ãããããŸãããããã®äºå®ã¯ç¶æ³ãæªåãããã ãã§ãã 奜ããšå¥œãŸãããšã«ãããããããã®ãããªã²ãŒã ã§ã¯éåžžã®ãããã䜿çšããããšã¯ã§ããŸããã
SplutïŒ ç¶æ³ã¯ããã«æªåããŠããŸãã ããŒãã«ããŒã ã1ã€ã ãæ®ããŸã§ãã²ãŒã ããã¬ã€ããå¿
èŠããããŸãã ãã ããZoGã§ã¯ã²ãŒã äžã«ç§»åã®é åºã倿Žããããšã¯ã§ããŸããïŒ ããã¯ãåºãŠè¡ãåããŒã ã¯ãããã«é¢ããŠã¯åããããªããã°ãªããªãããšãæå³ããŸãïŒãã¡ãããåããããä»ã®æ¹æ³ããªãã®ã§ãããã¯ãã©ãŒã«ãããŸãïŒã Splutã§ãïŒ åããŒã ã¯é£ç¶ããŠè€æ°ã®åããããŸãïŒã²ãŒã ã®éå§æã«1ã2åãã²ãŒã ã®éäžã«3åïŒã äžè¬çã«ãéåžžã®AI Axiomããã®ã²ãŒã ã«å¯ŸåŠã§ããªãã£ãã®ã¯é©ãã§ã¯ãããŸããã§ããã
ããã¯ç¢ºãã«æ©èœããããã°ã©ã ã¯åããŸãïŒç§ã®æèŠã§ã¯ããªãæãã§ãïŒãããã¬ã€ã€ãŒã®1人ãæé€ãããåŸãåé¡ãå§ãŸããŸãã éããååããèšç®ãããšããããã°ã©ã ã¯ãæå®ãããæéæ ã®ãããã«ã該åœããã«ããŸããŸããèããå§ããŸãã è©äŸ¡é¢æ°ïŒ
OnEvaluate ïŒãåå®çŸ©ããŠããç¶æ³ã¯ä¿®æ£ãããŸããã äžè¬ã«ãAxiomã«ã¯ãã®ãããªæ©äŒãããã®ã§ããããç¬èªã®AIã¢ã«ãŽãªãºã ãå®è£
ããããšããæ£åœãªçç±ãšèããŸããïŒå
ãèŠãŠãããŸããããªãã£ããšèšããŸããã詊ããŠã¿ã䟡å€ããããŸããïŒã
åºç€ãšããŠãç§ã¯ãå€ãã®äººã«ããç¥ãããŠããæ¬¡ã®ã¢ã«ãŽãªãºã ãYevgeny Kornilovã®æ¬ãProgramming Chess and Other Logic GamesãããåããŸããã
ã¢ã«ãã¡ããŒã¿ããŠã³ã¹ãªãã¯ãªããã³ã° int AlphaBeta(int color, int Depth, int alpha, int beta) { if (Depth == 0) return Evaluate(color); int score = -INFINITY; PMove move = GenerateAllMoves(color); while (move) { MakeMove(move); int tmp = -AlphaBeta(color==WHITE?BLACK:WHITE, Depth - 1, -beta, -alpha); UnMakeMove(move); if (tmp > score) score = tmp; if (score > alpha) alpha = score; if (alpha >= beta) return alpha; move = move -> next; } return score; }
ç°¡åã«ãããããã«ãå
ã®åœ¢åŒã§ã¯ããã®ã¢ã«ãŽãªãºã ã¯å®å
šã«äžé©åã§ãã 3人以äžã®ãã¬ã€ã€ãŒãããŸããã亀äºã®åãã¯ã¯ããã«è€éã§ãã ãããããã®ã¢ã«ãŽãªãºã ã¯ãç¬èªã®ããŒãžã§ã³ãéçºããããã®è¯ãåºçºç¹ã§ãã
å°ãèããŠã¿ããšãææªã®ã·ããªãªã§ã¯ãç§»åãã«ãŠã³ããããã¬ã€ã€ãŒã«å察ãã3人ã®ãã¬ã€ã€ãŒãåãåãããããšãçè§£ã§ããŸãã èšãæããã°ãç§ãã¡ã«ãšã£ãŠããã¯æµå¯Ÿçãªãã¬ã€ã€ãŒã§ãïŒåœŒããå£çµããªããã°ã圌ãã«ãšã£ãŠã¯ããã«æªãããšã§ãïŒã ãã1ã€ã®éèŠãªç¹ã¯ãè©äŸ¡é¢æ°ã®èšç®ã§ãã ç§»åãèšç®ãããšããè©äŸ¡é¢æ°ã¯åžžã«åããã¬ã€ã€ãŒïŒç§»åãèšç®ããããã¬ã€ã€ãŒïŒã®ãèŠç¹ãããèšç®ãããå¿
èŠããããŸãã æµå¯Ÿçãªãã¬ã€ã€ãŒã®å Žåãã¹ã³ã¢ã¯å察ã®èšå·ã§åãããã¹ãã§ãïŒç§ãã¡ãè¯ãã»ã©ã圌ãã¯æªããšæããŸãïŒã ãããã®èæ
®äºé
ãèæ
®ããŠãã¢ã«ãŽãªãºã ãæ¬¡ã®ããã«æžãæããããšãã§ããŸãã
äžè¬åãããã¢ã«ãã¡ããŒã¿ã¯ãªããã³ã° VARIABLE Depth MaxDepth [] CurrMove[] MaxDepth [] CurrTurn[] MaxDepth [] CurrScore[] : Score ( alpha beta turn -- score ) Depth -- Depth @ 0< IF EvalCount ++ SWAP DROP SWAP DROP Eval SWAP turn-offset-to-player current-player <> IF NEGATE ENDIF ELSE DUP turn-offset-to-player FALSE 0 $GenerateMoves Depth @ CurrTurn[] ! $FirstMove Depth @ CurrMove[] ! -10000 Depth @ CurrScore[] ! BEGIN $CloneBoard Depth @ CurrMove[] @ .moveCFA EXECUTE 2DUP Depth @ CurrTurn[] @ next-turn-offset RECURSE $DeallocateBoard $Yield DUP Depth @ CurrScore[] @ > IF Depth @ CurrScore[] ! ELSE DROP ENDIF Depth @ CurrTurn[] @ turn-offset-to-player current-player <> IF NEGATE SWAP NEGATE ENDIF OVER Depth @ CurrScore[] @ < IF SWAP DROP Depth @ CurrScore[] @ SWAP ENDIF 2DUP >= IF OVER Depth @ CurrScore[] ! TRUE ELSE Depth @ CurrTurn[] @ turn-offset-to-player current-player <> IF NEGATE SWAP NEGATE ENDIF Depth @ CurrMove[] @ $NextMove DUP Depth @ CurrMove[] ! NOT ENDIF UNTIL $DeallocateMoves DROP DROP Depth @ CurrScore[] @ Depth @ CurrTurn[] @ turn-offset-to-player current-player <> IF NEGATE ENDIF ENDIF Depth ++ ;
åããšäœçœ®ã®çæã«é¢é£ãããã©ãŒããšå
¬çã«ã¯å€ãã®ãéæ³ãããããŸãããç·åŒµããããããå
ã®ã¢ã«ãŽãªãºã ã¯ããªãç®ã«èŠããŸãã ã¹ã¿ãã¯ãã¢ã³ããŒãããã«ã¯ãååž°åŒã³åºãã§äœ¿çšããã倿°ã§ããã€ãã®ã¹ã¿ãã¯ããšãã¥ã¬ãŒãããå¿
èŠããããŸããã ã¹ã¿ãã¯èªäœã«ã¯ãèšç®ããã»ã¹äžã«ã
alphaãš
betaã® 2ã€ã®å€ãããããŸããã ååž°åŒã³åºãïŒ
RECURSE ïŒã§ã¯ããããã¯åžžã«åãé åºã§éä¿¡ãããŸãããèšç®ãæµå¯Ÿçãªãã¬ã€ã€ãŒã«å¯ŸããŠå®è¡ãããå Žåã笊å·ã倿ŽããåŸããããã®å€ã倿ŽããŸãã ãŸããæµãã¬ã€ã€ãŒã«ãã£ãŠäœçœ®ãè©äŸ¡ãããšãã«åŸãããè©äŸ¡ã®ããŒã¯ã倿ŽããŸãã
ãã®é¢æ°ã¯ãååã®èšäºã§æ¢ã«ããªãã¿ã®ã«ã¹ã¿ã ãšã³ãžã³ã®å®è£
ããåŒã³åºãããŸãã
ã«ã¹ã¿ã ãšã³ãžã³ 3 CONSTANT MaxDepth VARIABLE BestScore VARIABLE Nodes : Custom-Engine ( -- ) -10000 BestScore ! 0 Nodes ! $FirstMove BEGIN $CloneBoard DUP $MoveString CurrentMove! DUP .moveCFA EXECUTE MaxDepth Depth ! 0 EvalCount ! BestScore @ 10000 turn-offset next-turn-offset Score 0 5 $RAND-WITHIN + BestScore @ OVER < IF DUP BestScore ! Score! 0 Depth! DUP $MoveString BestMove! ELSE DROP ENDIF $DeallocateBoard Nodes ++ Nodes @ Nodes! $Yield $NextMove DUP NOT UNTIL DROP ;
ãã®ã³ãŒãã§ã¯ãè©äŸ¡å€ã«1ã5ã®ä¹±æ°ã远å ããŠããŸãããããã¯ãæšå®ãããåãããããã«ç°ãªãå Žåã«ããã°ã©ã ãåžžã«åãã«ãªããªãããã«ããããã§ãã
ãã€ãã®ããã«ãäž»ãªå°é£ã¯è©äŸ¡é¢æ°ãæ§ç¯ããããšã«ãããŸãã çŸåšã®ããŒãžã§ã³ïŒ
GitHubã®ã³ãŒããåžžã«è¡šç€ºã§ããããšãåžæãã人ïŒããªã¹ãããŠèšäºãããŠã³ããŒãããããšã¯ãããŸãããçŸåšã次ã®ç¹ãèæ
®ã«å
¥ããŠãããšèšããŸãã
- æµã®ã¡ã€ãžã®æ°ïŒäž»ãªç®æšã¯ãã®å€ãæžããããšã§ãïŒ
- 峿¹ã¡ã€ãžã®æ°ïŒãã®å€ã1ãã0ã«å€ãããšãã²ãŒã ã¯çµäºããŸãïŒ
- æµã®ãã¯ãŒãã®æ°ïŒçžæã®æãçµã¶ã®ã¯ãã€ã§ãããããšã§ãïŒ
- å奜çãªãã¯ãŒãã®æ°ïŒãããªãã§ã¯ã§ããªãã£ãã®ã§ã¯ãªãããšã«ããèªåã®æ°åïŒ
- ã¹ããŒã³ãšäžŠãã§å奜çãªã¡ã€ãžãèŠã€ããããšã«å¯Ÿããããã«ãã£ïŒããã¯æ¬åœã«å±éºã§ãïŒ
- Stonesãšåãã©ã€ã³ã§æµã®ã¡ã€ãžãèŠã€ããããã®ããŒãã¹ïŒåãçç±ã§ïŒ
- TrollsããStonesãŸã§ã®åèšã¹ãããæ°ïŒç§ãã¡ã¯èªåèªèº«ã§æžãããä»ã®äººã§å¢ããããšã詊ã¿ãŸãïŒ
ããã¯ç¢ºãã«çæ³çãªãªãã·ã§ã³ã§ã¯ãããŸããã ééå€ã¯ããæé©ã«éžæããå¿
èŠããããŸããããšãã°ãéè¡åž«ãç³ãšåãç·äžã«ãããšããäºå®èªäœã¯ãããèªäœã§ã¯äœã®æå³ããããŸããã ãã£ã¹ãã©ã€ã³ã¯ãããšãã°ãããŒã«ã«ãã£ãŠãããã¯ãããå¯èœæ§ããããæããããããã«ã¯ç³ã«ãå°éããå¿
èŠããããŸãã ãªãããã®æ¹æ³ã§ã³ãŒããèšè¿°ããã©ã®ããã«æ©èœãããã確èªã§ããŸãã
äºæ³ã©ãããAIã¯ã€ã³ããªãžã§ã³ã¹ã§èŒããæŸã¡ãŸããïŒãããŠãéåžžã«ãã£ãããšåäœããŸãïŒããå°ãªããšããã¹ããŒãã«ãã¹ãããããšããŸãã å°ãªããšãããã¯ãã§ã«åçã§ããŸãã
ã«ãŠã³ã-æ³£ãã
ãã¡ãããAIã®å質ãè©äŸ¡ããããã«ãäœåºŠã䜿çšããŠããšãã¹ããŒãè©äŸ¡ããæ§ç¯ã§ããŸãããããã¯ç§ãã¡ã®æ¹æ³ã§ã¯ãããŸããã Axiomã«ã¯ããã®ããã»ã¹ãèªååã§ããçŽ æŽãããAutoPlayãŠãŒãã£ãªãã£ãä»å±ããŠããŸãã æ®å¿µãªããã圌女ã¯2人以äžã®ãã¬ãŒã€ãŒåãã«èšèšãããã²ãŒã ã®æäœæ¹æ³ãç¥ããŸããããããã¯åé¡ã§ã¯ãããŸããã ç¹ã«åœŒå¥³ã®ããã«ã2人ã®ãã¬ã€ã€ãŒã§æ§æãäœæããŸãïŒ4ã€ã®ç³ãæ®ããŸãïŒã
決é LOAD Splut.4th ( Load the base Splut game ) {players {player} South {search-engine} Custom-Engine {neutral} West {player} North {search-engine} Custom-Engine {neutral} East {player} ?Cleaner {random} players} {turn-order {turn} South {turn} North {turn} North {repeat} {turn} ?Cleaner {of-type} clear-type {turn} South {turn} South {turn} South {turn} North {turn} North {turn} North turn-order} {board-setup {setup} South sstone e1 {setup} South wizard d2 {setup} South dwarf e2 {setup} South troll f2 {setup} South lock f1 {setup} West wstone a5 {setup} North nstone e9 {setup} North wizard f8 {setup} North dwarf e8 {setup} North troll d8 {setup} North lock h1 {setup} East estone i5 board-setup}
ãŸãããã¬ã€ã€ãŒãã©ã³ãã ãªåããããæ§æãå¿
èŠã§ãã
ã©ã³ãã LOAD Splut.4th ( Load the base Splut game ) {players {player} South {random} {neutral} West {player} North {random} {neutral} East {player} ?Cleaner {random} players} {turn-order {turn} South {turn} North {turn} North {repeat} {turn} ?Cleaner {of-type} clear-type {turn} South {turn} South {turn} South {turn} North {turn} North {turn} North turn-order} {board-setup {setup} South sstone e1 {setup} South wizard d2 {setup} South dwarf e2 {setup} South troll f2 {setup} South lock f1 {setup} West wstone a5 {setup} North nstone e9 {setup} North wizard f8 {setup} North dwarf e8 {setup} North troll d8 {setup} North lock h1 {setup} East estone i5 board-setup}
çµæã¯ãé©ãã¹ãããšã§ã¯ãããŸããã§ããïŒ100ã²ãŒã ãèšç®ããã®ã«äžæ©ããããŸãããïŒïŒ
Final results: Player 1 "Random", wins = 13. Player 2 "Duel", wins = 87. Draws = 0 100 game(s) played
ãªãããã°ã©ã ãããã»ã©é·ãæ©èœããã®ã§ããïŒ ã³ãŒã¹ãèšç®ãããšãã«ãè©äŸ¡é¢æ°ãåŒã³åºãããåæ°ã確èªããŸãããïŒæ·±ã5ã®åãã®èšç®ããŒã¿ïŒïŒ

ã¯ããè©äŸ¡é¢æ°ã®8000åã®åŒã³åºãã¯ç¢ºãã«ãããããããŸããããªãããã«3ã€ã®è¡ãããã®ã§ããïŒ èª¬æããããšæããŸãã EvalåŒã³åºãã®æ°ãã«ãŠã³ãããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
çµ±èšåé $gameLog ON VARIABLE EvalCount : Score ( alpha beta turn -- score ) Depth -- Depth @ 0< IF EvalCount ++ ... ELSE ... ; : Custom-Engine ( -- ) ... BEGIN ... 0 EvalCount ! BestScore @ 10000 turn-offset next-turn-offset Score 0 5 $RAND-WITHIN + EvalCount @ . CR ... UNTIL DROP CR ;
åºåã§ã¯ã次ã®ã·ãŒã±ã³ã¹ãååŸãããŸãã
çµæ992
655
147
3749
22
1
22
22
22
22
1
1
336
132
50
382
42
213
35
392
21
62
40
49
1465
189
1
1
1
1
1
1
1
52
91
122
75
50
1509
2074
637
492
249
800
415
877
963
5608
90
4
4
4
4
4
4
4
4
æ°åã®åã°ã«ãŒãïŒç©ºã®è¡ã§åºåãããŠããïŒã«ã¯ãçŸåšã®äœçœ®ããã®ãã¹ãŠã®ãã¬ãŒã€ãŒã®åãã衚瀺ããçµæãå«ãŸããŠããŸãã äžèšã®ã°ã©ãã§ã¯ãæåã®è¡ã¯ã°ã«ãŒãå
ã®æå°å€ã2çªç®ã¯å¹³åã3çªç®ã¯æå€§å€ã瀺ããŠããŸãã æå€§å€ãšæå°å€ã®å·®ã¯ãã¢ã«ãã¡-ããŒã¿ã¯ãªããã³ã°ã®å¹æã«ãã£ãŠæ±ºãŸããŸãã
å¹³åå€-ç¹å®ã®æ€çŽ¢æ·±åºŠã§æåŸ
ã§ããããã©ãŒãã³ã¹ã決å®ããŸããã°ã«ãŒãã®æ°ãäž»ã«æžå°ããŠããããšã«æ°ä»ããããããŸããããåèª¿ãªæžå°ã«éåãããããŒã¹ãããæã
ãããŸãããã®æ°ãèšç®ããŠã¿ãŸãããïŒ
å€ãããïŒäžéšã®ã°ã«ãŒãã§ã¯ã16ãè¶
ããå調æžå°ã®éåããããŸããåããããæé©ãªé åºã§è¡šç€ºããããšãã§ããå Žåãããã©ãŒãã³ã¹ã€ã³ãžã±ãŒã¿ãŒãæ¹åããããšã¯ç¢ºãã«å¯èœã§ãïŒãããŠãããæ·±ãæ€çŽ¢ãå®çŸããããšã¯å¯èœã§ãïŒãæ®å¿µãªãããæ¬¡ã®2ã€ã®ç¹ã«ããããããè¡ãããšãã§ããŸããã- ç§ã¯ãã²ãŒã Splutã§ã®åãã®ãå質ãã®äºåè©äŸ¡ãè¡ãããšãã§ãããã¥ãŒãªã¹ãã£ãã¯ãæã¡ãŸããã
- , Axiom ( )
æ€çŽ¢ã®æ·±ããå¢ããå¥ã®æ¹æ³ã¯ãã匷å¶ãç§»åã®ã詳现ãªãæ€çŽ¢ã§ãããŸããç¹°ãè¿ãããäœçœ®ãåãåããšããã§ãããïŒZobristããã·ã¥ã¯ããã«å€§ãã«åœ¹ç«ã¡ãŸãïŒæ€çŽ¢æ·±åºŠã®å¢å ã«äŒŽã£ãŠè¡šç€ºãããäœçœ®ã®æ°ãã©ã®ããã«å€åããããèŠãŠã¿ãŸãããïŒ
ãã¹ãŠã®å¯ŸæŠçžæã®åãã®å®äºãŸã§ã®å¹³ååŸ
æ©æéïŒæ·±åºŠ5ã®åãïŒã¯çŽ1åã§ããããããããã¢ã«ãŽãªãºã ã®çŸåšã®å®è£
ã§æåŸ
ã§ããæå€§ã®æ¢çŽ¢æ·±åºŠã§ããããšã¯æããã§ãïŒãããå¢ãããšãããã°ã©ã ã§ã®ã²ãŒã ãå®å
šã«äžå¿«ã«ãªããŸãïŒãããããSplutã²ãŒã ã®5ã€ã®åãã«ã€ããŠèããŠã¿ãŸããããïŒããã¯ããã¹ãŠã®ãã¬ã€ã€ãŒã®å¯èœãªåããèšç®ããã®ã«ãååã§ã¯ãããŸããïŒãã¥ãšã«ã¢ãŒãã§ãããã§ã¹ã®ã²ãŒã ã1ã¿ãŒã³å
ã«æ°ãããããªãã®ã§ãïŒãã®ãããªããã°ã©ã ããç¹å¥ãªç¥æ§ãæåŸ
ããããšã¯å°é£ã§ãããã¡ãããSplutïŒãã§ã¹ãããããŒã¹ãã¯ããã«å°ãªãã§ãããåãã¯ããè€éã§ãïŒåã€ããã«ã¯ãããã°ã©ã ã¯é·æèšç»ãç«ãŠãããšãã§ããªããã°ãªãããå€ãã®åé²ããããŸããAxiomã䜿çšããŠãããéæããæ¹æ³ã¯ããããŸããããããããäœããã®åœ¢ã§å¯èœã§ããç§ã¯ããã«åãçµãã§ããŸããPSAxiom. Greg Schmidt â . Axiom 10 , . , Axiom- ZoG, , Axiom. , , -. !