どうぶつしょうぎのAIを作ってみるというわけで「どうぶつしょうぎ」のAIを作ってみた。先日「石取りゲーム」のAIを作ったのは、実はこの布石だったりする。「石取り」にもかかわらず「布石」とはこれ如何に。実は、いきなり「どうぶつしょうぎ」のAIを作ろうとして、盤面クラスから作り始めたのだが、イザAIを実装しようとしたところで、混乱をきたし、まったく実装が進まず、一度は撃沈していたのであった。「設計」は大事ということか。オイラの場合、紙の上でも、頭の中でもなく、全体を表現するような試作品が「設計」に当たるようだ。事実「石取りゲーム」の設計をそのままに、単にルールを追加していったら、いつのまにか「どうぶつしょうぎ」になっていた感じだ。遅ればせながら「どうぶつしょうぎ」とは、本将棋のサブセットのようなゲーム。以前から興味はあったものの、駄菓子屋で「どうぶつしょうぎガム」を購入したのがトリガになった。多少なりとも、ウチの小学生のガキが興味を持ったのも大きい。短時間で勝負がつくこともあり、我が家ではプチブームなのである。駄菓子屋を再訪し、追加で10セット入りの商品を「箱買い」した挙句、ガキの友達や、実家に配って布教しだす始末。それくらいのポテンシャルを持ったゲームだと思う。今回のプログラミングは楽しかった。なんだか、コードが書かれるべき場所に、コードを書いてくれと呼びかけられるような感覚を味わった。時々、小説家や漫画家が、作中の登場人物が勝手に動き出した、などというコメントをするが、まさにそんな感じ。コードが勝手に成長したというか。そんなコードはRubyで500行ちょっと。思考部分は、純粋なミニマックス法の実装で、例によって「αβの枝刈り」は含まれていない。思考の深さを4手読みにしたら、オイラはサッサと勝てなくなってしまった。ちなみに、思考に与えているパラメータは、駒の価値だけ。「将棋盤の駒」も「持ち駒」も同価値とし、単に「自分の駒の価値の合計」から「相手の駒の価値の合計」を引いたものを「優勢度」とし、それが最も高くなる状態を目標にミニマックスする。70,}実際に対戦してみると「将棋盤の駒」と「持ち駒」を同価値としている都合か、駒を溜め込む傾向があるので、多少、持ち駒の評価点を下げたほうがいいかもしれない。実際に作ってみてわかったのだが、持ち駒は任意の場所に打てるため、想定される盤面が爆発的に増え、持ち駒が多くなると極端に思考速度が落ちてしまう。チェスに比べ、将棋は持ち駒のルールがあるせいで、コンピュータが人間を負かす時期が遅れた、というが、なるほど確かに実感できる話だ。今回のAIの製作が一段落してから、ふとBonanzaのWikipediaの記事を読んでみたが、棋譜の学習により駒の評価値を最適化する、という以外、意外と素直な戦略のプログラムというように読めた。今回の製作を通じて、電王戦に挑戦するプログラマに共感できたような気がしたのは、なかなか有益だったと思う。そもそも、今回AIを作ってみたくなったきっかけは、ガキと対戦させてみたかったからだったっけ。次は、coffeeスクリプトに移植して、ちゃんとGUIで遊べるようにしてみようかな。Ruby版のコードを置いておく。1.8.7-p374。