やはり「駒得」だけではダメ?
3三将棋アプリ、5五将棋アプリと作ったので、今度は7七将棋アプリをとりあえず今まで通りのやり方でリリースしようかと思っていたのですが、ちょっと気になる問題が見つかったのでリリースは先延ばしすることにしました。現行の評価関数は単純な駒得重視の評価関数なのですが、一応 Google Play に公開されている幾つかの5五将棋アプリと手動で対戦させてみても勝率は高い1ので、自分ではそれなりに満足していました。でも同じ評価関数を使って7七将棋を作ってみると、特徴的な変な指し手が目立ってきたので評価関数の改良に手をつけることにしました。
昔、オセロのシェアウェアを作った時に経験しているのですが、評価関数を弄りだすと何種類かの評価関数が出来上がって、あっちの評価関数はこっちの評価関数より強いけどこっちには負けるみたいな三竦み状態(ジャンケン状態)があちこちで発生して、無茶苦茶時間を取られます。なので評価関数に手をつけるのは後回しにしてきたのですが、取り敢えず駒の重み(駒得)以外にもう一つ評価する要素を追加することにしました。
現行の評価関数
3三将棋アプリの記事にも書いていますが、以下の表の通り駒の三つの状態(表、裏、持ち駒)別に駒の重みを設定してその合計値を評価関数に使用しています。
駒の種類 \ 重み | 表(不成) | 裏(成り駒) | 持ち駒 |
---|---|---|---|
玉(王) | 9999 | (9999) | (9999) |
飛 | 85 | 110 | 75 |
角 | 75 | 100 | 65 |
金 | 50 | (50) | 45 |
銀 | 45 | 50 | 40 |
桂 | 30 | 50 | 25 |
香 | 25 | 50 | 20 |
歩 | 10 | 50 | 7 |
評価関数=(先手の駒の重みの合計 ー 後手の駒の重みの合計)
とすることで先手が有利な場合は正の方向、後手が有利な場合は負の方向に評価値が動きます。また、盤上の駒より持ち駒の方が重みを低くしているのは、たとえ駒得していても持ち駒として溜め込んでいたのでは効果が薄いという考え方によるものです。
重みの数値自体は適当なので、いずれは学習によって重みを変化させていくような形にしようと考えてます。
現行評価関数で7七将棋を作ってAI対戦させてみると
下の局面は7七将棋の初期盤面です。
下の局面は7七将棋でAI同士の対戦させた時の最終局面です。
敵陣に成り駒が目立ちます。最終局面だけ見ても分かりにくいかもしれませんが、駒の重みだけの評価関数なのでAIはこの例のように敵陣に成り駒を作って点数稼ぎをしたがります。上の局面の場合、先手の7一と6二のと金や後手の1六の成香、2七の成桂は全く働きのない駒になっています。
これはほんの一例なのですが、酷い時は敵陣に自分の成り駒が団子状態に固まって身動き取れない駒だらけになった時もありました。3三将棋や5五将棋だと成り駒を作ることが直接相手玉に迫ることになり自然と相手玉を攻める形になるのですが、7七将棋だと盤面が広いので、相手玉とあまり関係ない場所でせっせと成り駒作りに励んでも局面が有利になるとは限りません。駒の重みだけで評価しているのでそうなるのは当たり前とも言えますが、もう少しマシな評価関数に出来ないか考えてみました。
将棋の形勢判断の指標に「駒の働き」というものがありますが、敵陣に団子状態になっている攻め駒を見て、「駒得」だけではなく少なくとも「駒の働き」も評価関数に組み込みたいと思ったわけです。
現行評価関数に「駒の働き」を加味する
例えば5五将棋の場合、最も可動域が広い場所に駒がある時は、香車で4ヶ所(7七将棋なら6ヶ所)で、竜なら12ヶ所(7七将棋なら16ヶ所)動けます。
そこで駒が最も可動域が広い時の動ける場所の数を保存しておいて、局面を評価する時にその時点で動ける場所の数によって駒の価値(重み)を変更するようにしてみました。
駒の価値=駒の重み(固定値) × (1 + \(\frac{現時点での駒の可動箇所数}{駒の最大可動箇所数}\) )
駒の重みを計算する時に現時点での駒の可動割合を係数として掛ける処理を追加しただけですが、それなりに効果はあるようです。
新評価関数を5五将棋に組み込んでみた結果
7七将棋の評価関数を改良しても比較するものが他に無い(と思う)ので、効果があったのかどうかなかなか判断つきません。旧評価関数と新評価関数で対戦させても同じパターンで決着がつくのでどちらが強いと言い切れないからです2。そこで、取り敢えず新しい評価関数を5五将棋に組み込んで、SDIN将棋のサイトで5五将棋のCPU対戦で手動対戦して試したのですが、「CPUレベル3」と20戦して18勝2敗でした(勝率9割!!)。以前の5五将棋の評価関数では勝率6割ほどだったので効果はあったと言えるんじゃないでしょうか?5五将棋に組み込んだ結果が以前の対戦成績より悪くなっていたら5五将棋はそのままにしておこうと思っていたのですが、結果が良かったので5五将棋にも組み入れてリリースしようと思っています。もしかしたら3三将棋でも効果があるかもしれません。
話題になった「AlphaZeroの棋譜」のように見たい人がいるとは思えませんが、一応CSA形式の棋譜を置いておきます。ネットで探してみるとJava製の5五将棋用棋譜Viewerがあったのでそのリンクも貼っておきます。
- 対SDIN将棋CPU対戦棋譜
-
5五将棋棋譜Viewer
(解凍してjava -jar 55kifu_viewer.jar
とコマンドを打てば使用出来ます)
それにしてもCSA形式の5五将棋の棋譜が読み込めるAndroidアプリは探したけど無いようで、ミニ将棋の市場が如何にマイナーな市場なのか痛感しますね
-
但し5五将棋の強さを競う大会に出るようなPCソフトには、評価関数というより読みの深さが全然違うので設定にもよると思いますが全く勝てません。自分で試した感じでは、序盤優勢(優勢・劣勢の判断はPCソフトによる)に進めていても終盤で逆転される感じです。 ↩
-
一応先手と後手を入れ替えて2局対戦させたところ、一勝一敗でした。 ↩