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|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2016-01-21(Thu) どうぶつしょうぎのAIを作ってみる

  というわけで「どうぶつしょうぎ」のAIを作ってみた。先日「石取りゲーム」のAIを作ったのは、実はこの布石だったりする。「石取り」にもかかわらず「布石」とはこれ如何に。なんちて。

  実は、いきなり「どうぶつしょうぎ」のAIを作ろうとして、盤面クラスから作り始めたのだが、イザAIを実装しようとしたところで、混乱をきたし、まったく実装が進まず、一度は撃沈していたのであった。

  やはり「設計」は大事ということか。オイラの場合、紙の上でも、頭の中でもなく、全体を表現するような試作品が「設計」に当たるようだ。事実「石取りゲーム」の設計をそのままに、単にルールを追加していったら、いつのまにか「どうぶつしょうぎ」になっていた感じだ。

  遅ればせながら「どうぶつしょうぎ」とは、本将棋のサブセットのようなゲーム。以前から興味はあったものの、駄菓子屋で「どうぶつしょうぎガム」を購入したのがトリガになった。多少なりとも、ウチの小学生のガキが興味を持ったのも大きい。短時間で勝負がつくこともあり、我が家ではプチブームなのである。

  遂には、駄菓子屋を再訪し、追加で10セット入りの商品を「箱買い」した挙句、ガキの友達や、実家に配って布教しだす始末。でも、優にそれくらいのポテンシャルを持ったゲームだと思う。

  画像の説明

  しかし、今回のプログラミングは楽しかった。なんだか、コードが書かれるべき場所に、コードを書いてくれと呼びかけられるような感覚を味わった。なんだろう。時々、小説家や漫画家が、作中の登場人物が勝手に動き出した、などというコメントをするが、まさにそんな感じ。コードが勝手に成長したというか。

  そんなコードはRubyで500行ちょっと。思考部分は、純粋なミニマックス法の実装で、例によって「αβの枝刈り」は含まれていない。思考の深さを4手読みにしたら、オイラはサッサと勝てなくなってしまった。

  ちなみに、思考に与えているパラメータは、駒の価値だけ。「将棋盤の駒」も「持ち駒」も同価値とし、単に「自分の駒の価値の合計」から「相手の駒の価値の合計」を引いたものを「優勢度」とし、それが最も高くなる状態を目標にミニマックスする。

@weight = {
    Lion => 1000,
    Graf =>   60,
    Elep =>   50,
    Baby =>   30,
    Cock =>   70,
}

  実際に対戦してみると「将棋盤の駒」と「持ち駒」を同価値としている都合か、駒を溜め込む傾向があるので、多少、持ち駒の評価点を下げたほうがいいかもしれない。

  実際に作ってみてわかったのだが、持ち駒は任意の場所に打てるため、想定される盤面が爆発的に増え、持ち駒が多くなると極端に思考速度が落ちてしまう。チェスに比べ、将棋は持ち駒のルールがあるせいで、コンピュータが人間を負かす時期が遅れた、というが、なるほど確かに実感できる話だ。

  今回のAIの製作が一段落してから、ふとBonanzaのWikipediaの記事を読んでみたが、棋譜の学習により駒の評価値を最適化する、という以外、意外と素直な戦略のプログラムというように読めた。今回の製作を通じて、電王戦に挑戦するプログラマに共感できたような気がしたのは、なかなか有益だったと思う。

  画像の説明

  さて、そもそも、今回AIを作ってみたくなったきっかけは、ガキと対戦させてみたかったからだったっけ。次は、coffeeスクリプトに移植して、ちゃんとGUIで遊べるようにしてみようかな。

  まずは、Ruby版のコードを置いておく。