TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

水匠の定跡作成プログラム

第3回電竜戦の水匠の定跡作成プログラムと同様のプログラムを作成した。
DeepLearningShogi/make_book_minmax.py at master · TadaoYamaoka/DeepLearningShogi · GitHub

方式

水匠の定跡作成プログラムと同様に、末端局面(一定の対局数以上の局面)の勝率をMin-Maxで開始局面に伝播させて定跡を作成する。
このプログラムは定跡作成のみ行う。
連続対局はcshogi.cliで行い、cshogi.cliで生成したCSAファイルを元に定跡を作成する。

連続対局と定跡作成は、以下のようなシェルで自動化する。

kgr0.sh
#!/bin/sh
id=$1
nodes=$2
side=$3
th=$4
python -m dlshogi.utils.make_book_minmax /work/pgn/csa /work/YaneuraOu/bin/book${id}/user_book1.db --side ${side} --startsfen "lr5nl/3g1kg2/2n1ppsp1/p1pps1p1p/1p5P1/P1PPSPP1P/1PS1P1N2/2GK1G3/LN5RL w Bb 38" --th ${th}
for ((i=0; i < 10000; i++))
do
    python3 -u -m cshogi.cli /work/YaneuraOu/bin/YaneuraOu-by-gcc /work/YaneuraOu/bin/YaneuraOu-by-gcc --name1 suisho5-4th-1 --name2 suisho5-4th-2 --options1 NodesLimit:${nodes},FV_SCALE:24,USI_Hash:4096,Threads:4,PvInterval:9999,ResignValue:500,MaxMovesToDraw:320,NetworkDelay2:0,USI_OwnBook:true,BookDir:book${id},BookFile:user_book1.db,BookMoves:256,BookEvalDiff:0,BookEvalBlackLimit:-200,BookEvalWhiteLimit:-200,BookDepthLimit:0 --options2 NodesLimit:${nodes},FV_SCALE:24,USI_Hash:4096,Threads:4,PvInterval:9999,ResignValue:500,MaxMovesToDraw:320,NetworkDelay2:0,USI_OwnBook:true,BookDir:book${id},BookFile:user_book1.db,BookMoves:256,BookEvalDiff:0,BookEvalBlackLimit:-200,BookEvalWhiteLimit:-200,BookDepthLimit:0 --opening /work/opening/kgr0.sfen --opening-moves 100 --draw 320 --games 20 --pgn 20230105_suisho5-4th-1_vs_suisho5-4th-2_nodes${nodes}-${i}.pgn --csa csa/csa-20230105-s5vss5-kgr0/nodes${nodes} > log_20230105_suisho5-4th-1_vs_suisho5-4th-2_nodes${nodes}-${i}.txt
    python -m dlshogi.utils.make_book_minmax /work/pgn/csa /work/YaneuraOu/bin/book${id}/user_book1.db --side ${side} --startsfen "lr5nl/3g1kg2/2n1ppsp1/p1pps1p1p/1p5P1/P1PPSPP1P/1PS1P1N2/2GK1G3/LN5RL w Bb 38" --th ${th}
done

連続対局の開始局面は、角換わりの37手目基本図にする(/work/opening/kgr0.sfenに定義している)。

シェル実行例
./kgr0.sh 1 100000000 black 100 &
./kgr0.sh 2 100000000 white 50 &

水匠の定跡作成では、先手番の定跡と後手番の定跡を交互作成しているが、同時並行でも問題ないので、並列で実行する。
上記例では、先手と後手を1多重にしているが、CPUコア数の分だけ多重に実行できる。
その際、同じ棋譜が生成されないように、ノード数を少しばらけさせるとよさそうである。

考察

メリット
  • 末端局面の勝率を元にしているため、途中で評価が正しくない手順があったとしても、その先の局面で反省した場合は、定跡に反映することができる。
  • 先手番もしくは後手番のその時点の定跡を幹として、その周辺の枝を伸ばすため、効率よく探索できる。
デメリット
  • 末端局面の評価は、勝率を元にしているため、対局数が十分でない場合は誤差が大きくなる。ただし、作成に十分に時間をかければ末端局面が優劣がはっきりした局面になってくるので、対局数が少なくても誤差の影響は小さくなる。
  • 連続対局の勝率を元にするため、作成に時間がかかる。角換わりの37手目基本図など、変化の狭い局面を開始局面にしないと現実的な時間では長手数の定跡は作成できない。
  • 定跡を幹として分岐する枝は、連続対局で現れた手に限られるため、連続対局に使うソフトが指さない手に好手があると、この定跡作成方法ではカバーできない。

まとめ

第3回電竜戦の水匠の定跡作成プログラムと同様のプログラムを作成した。
現在、水匠5を使って試しに定跡を作成している。
水匠電竜の定跡が今後公開されることがあれば、比較してみたい。