SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

2016-01-07(Thu) 石取りゲームのAIを作ってみる

  ひょんなことから、いわゆる「AI」を作ってみたくなった。

  で、とりあえず、習作として「石取りゲーム」を作ってみることにした。ルールは簡単で、まとめて置いてある数十個の石ころから「1~3個の石を順に取り合い、最後の1個を取った(取らされた)ら負け」というルールである。

  単純なルールなので、容易に必勝法に思い至るが、そのロジックをプログラミングしても発展性がない。ここは「ミニマックス法」を採用するべき状況なのである。というわけで、秘蔵のインデックスを検索し「Oh!X1990年4月号」を引っ張り出し、故祝一平氏の連載「C調言語講座PRO-68K」から「第21回 思考よ~ん(その4)」の記事を参照するのであった。ホンマOh!Xは一生もんでっせ。

  当記事では「ミニマックス法」よりは「αβの枝刈り」の説明を主としつつも、成果物(コード)には実装しない、というある意味で潔い(?)内容になっているが、内容的には十分に参考になるものだ。とりあえず、記事を参考に「ミニマックス法」をRubyで実装してみた。「αβの枝刈り」は、まぁ、余裕があったらやるということで。

  いざ対戦してみると、ゲームのルールがシンプルなだけに、ゲーム開始時の石数が十数個であれば、容易に読み切れてしまうことがわかった。「読み切り」とは、勝負の完了に至るすべてのパターンの把握をいう。それには、えらく複雑な処理が必要かと言えばさほどでもなく、評価関数に至ってはルールをそのまま表した、以下のコードだけ。

149     def evaluate(game)
150         point = 50                                              # 標準の評価点
151         game.stones == 1 and point = 99999                      # 手番後に石の残りを 1 にしたら勝ち
152         point
153     end

  突き詰めれば、この条件だけでコンピュータが勝利に向かって「思考」らしきことをするようになるってんだから、面白いったらない。

  画像の説明

  コードを置いておく。