SVX日記
2016-01-21(Thu) どうぶつしょうぎのAIを作ってみる
というわけで「どうぶつしょうぎ」のAIを作ってみた。先日「石取りゲーム」のAIを作ったのは、実はこの布石だったりする。「石取り」にもかかわらず「布石」とはこれ如何に。なんちて。
やはり「設計」は大事ということか。オイラの場合、紙の上でも、頭の中でもなく、全体を表現するような試作品が「設計」に当たるようだ。事実「石取りゲーム」の設計をそのままに、単にルールを追加していったら、いつのまにか「どうぶつしょうぎ」になっていた感じだ。
遅ればせながら「どうぶつしょうぎ」とは、本将棋のサブセットのようなゲーム。以前から興味はあったものの、駄菓子屋で「どうぶつしょうぎガム」を購入したのがトリガになった。多少なりとも、ウチの小学生のガキが興味を持ったのも大きい。短時間で勝負がつくこともあり、我が家ではプチブームなのである。
しかし、今回のプログラミングは楽しかった。なんだか、コードが書かれるべき場所に、コードを書いてくれと呼びかけられるような感覚を味わった。なんだろう。時々、小説家や漫画家が、作中の登場人物が勝手に動き出した、などというコメントをするが、まさにそんな感じ。コードが勝手に成長したというか。
ちなみに、思考に与えているパラメータは、駒の価値だけ。「将棋盤の駒」も「持ち駒」も同価値とし、単に「自分の駒の価値の合計」から「相手の駒の価値の合計」を引いたものを「優勢度」とし、それが最も高くなる状態を目標にミニマックスする。
@weight = {
Lion => 1000,
Graf => 60,
Elep => 50,
Baby => 30,
Cock => 70,
}
実際に作ってみてわかったのだが、持ち駒は任意の場所に打てるため、想定される盤面が爆発的に増え、持ち駒が多くなると極端に思考速度が落ちてしまう。チェスに比べ、将棋は持ち駒のルールがあるせいで、コンピュータが人間を負かす時期が遅れた、というが、なるほど確かに実感できる話だ。
今回のAIの製作が一段落してから、ふとBonanzaのWikipediaの記事を読んでみたが、棋譜の学習により駒の評価値を最適化する、という以外、意外と素直な戦略のプログラムというように読めた。今回の製作を通じて、電王戦に挑戦するプログラマに共感できたような気がしたのは、なかなか有益だったと思う。
まずは、Ruby版のコードを置いておく。