プチボナ 56shogi について


プチボナ 56shogi は、Bonanzaをベースにした5×6マス将棋盤で動作する思考エンジンです。
以下、Bonanzaを改変したポイントについて。

ver 1.0

・指し手生成
 Bonanzaのソースをほぼそのまま利用
 5×6マス将棋盤で動作するように改変
 SSE不使用(32bitに30マスが収まるため)

・探索
 Bonanzaのソースをほぼそのまま利用
 ただし、スレッド並列探索は行わない
 評価関数を変更したため、それに伴ってfutility pruningの一部を変更

・詰みルーチン
 3手詰みルーチン、df-pnでの詰み探索は行わない
 1手詰みルーチンを5×6マス将棋盤で動作するように改変
 Bonanzaが3手詰みルーチンで詰み判定している部分を1手詰みルーチンに変更

・評価関数
 簡単なものに変更(fv.bin不使用)
 駒の価値はBonanzaのものをそのまま使用(param.h)
 歩・金と同等の動きをする駒・銀・馬・龍の価値を敵玉との位置関係で調整
 飛・龍・角・馬・香の利きがあるマスの数によって加点
 飛・龍・角・馬・香のラインに敵玉が入っている場合に加点

・その他
 Ponder、easy moveは未実装
 定跡データは利用できないので不使用
 序盤はMultiPVで探索して、評価値が一定の範囲内の指し手の中からランダムで選択
 (そのため、読み筋に表示されている指し手とは違う手を選ぶことがある)

ver1.0では、Bonanzaの特徴である、機械学習による局面評価は行っていません。
今後、機械学習部分のコードを改変し、なんらかの方法で5×6マス将棋の棋譜を集めて、
機械学習による局面評価をやってみたいと思っています。(いつになることやら)
相入玉形については、トライルールを採用したいと思っていますが、
プチ将棋がトライルールに対応していないため、
現状では勝敗がつかないことがあります。
今後、ミニ将棋GUIを自作することになるかもしれません。(これもいつになることやら)


ver 2.0

ver 1.0から変更、追加した点は以下の通りです。

・自己対戦棋譜からの学習を繰り返すことによる、評価関数の自動調整

56将棋の棋譜から学習できるように、Bonanzaの評価関数と学習部を改変しました。

最初は駒割りのみの評価関数同士の自己対戦棋譜から、
以降は学習してできあがった評価関数同士の自己対戦棋譜から学習させました。

0. 駒割りのみ
1. ↑の自己対戦棋譜22976局から学習 ↑に対して911勝89敗       ver 1.0に対して615勝384敗(1千日手)
2. ↑の自己対戦棋譜30000局から学習 ↑に対して616勝380敗(4千日手) ver 1.0に対して695勝304敗(1千日手)
3. ↑の自己対戦棋譜30000局から学習 ↑に対して565勝428敗(7千日手) ver 1.0に対して691勝309敗
4. ↑の自己対戦棋譜30000局から学習 ↑に対して464勝535敗(1千日手) ver 1.0に対して675勝324敗(1千日手)

勝率を調べるための連続対局の条件はすべて1手1秒1000局で行いました。
学習に用いる自己対戦棋譜は、100000ノード探索したら終了して指し手を返すという条件で生成しました。
また、自己対戦では、序盤はMultiPVで探索した指し手の中からランダムで選び(ver 1.0と同様)、
なるべく同じ展開にならないようにしました。

4は学習元の3に対して負け越したため、ここで実験を終了しました。

2から学習した3は、直接対決では3が勝ち越しましたが、
ver 1.0に対する勝率はほぼ同じ(誤差レベルの差)という結果になりました。

2と3のどちらをver 2.0とするか悩ましいところでしたが、
直接対決で勝ち越している3をver 2.0としました。

・トライルールへの一部対応

トライされたときに投了するように変更しました。
エンジン側がトライしたときは、対局が続行されます。(プチ将棋の仕様)

探索中はトライ判定を一手詰みと同様に扱っているので、
それなりにトライに向かった指し手を選ぶようになっているはずです。

・序盤で指し手をばらつかせることを指定できるように変更

引数に「mpv_on」を指定したときのみ、序盤で指し手をばらつかせるように変更しました。
ver 1.0と同様、MultiPVで探索した中からランダムで指し手を選びます。

引数に何も指定しなければ、MultiPVではなく通常の探索を行います。