SSブログ

やねうら王の連続自動対局フレームワーク [コンピュータ将棋]

 やろうやろうと思って放置してるうちにまったく手を付けられていなかった自己対戦フレームワークを連休中に使えるようにした。

 ある程度はマニュアルに書いてあるのでコピペ+補足。


・バイナリのビルド

 shogi.hの
 #define LOCAL_GAME_SERVER
 を有効にしてビルド。

 通常のやねうら王に昨日を追加するという形で実装しているので、マクロ切り替えてビルドするだけ。ただ、作成されたファイル名がYaneuraOu.exeなので適当(local-game-server.exe)にリネームする。


・他に用意するファイル

 通常の対局用ファイルとは別に設定ファイルを2個用意する。

engine-config1.txt : 1つ目の思考エンジン
engine-config2.txt : 2つ目の思考エンジン

1行目にengineの実行ファイル名(同じフォルダに配置)
2行目に思考時のコマンド
3行目以降にsetoption等、初期化時に思考エンジンに送りたいコマンドを書く。

例)
YaneuraOu.exe
go btime 100 wtime 100 byoyomi 0
setoption name Threads value 1
setoption name Hash value 128

 ここでスレッドとハッシュ値はちゃんと設定する。他にもPonder止めるだとかなんやかんやと必要になるので、usiコマンドでパラメータを確認する。

 スレッドは並列対局数との兼ね合いで決める必要がある。

 またマニュアルではハッシュ値を1024MBも確保しているが、0.1秒対局の場合、1%も使わないので128MBも確保すれば十分。(デフォルトの16MBだと流石に小さいと思うので増やす)。1024MB設定では1秒対局で良くて1%程度。


・対局開始

goコマンドで対局が開始できる。

 local-game-server.exe go btime 500

 とやると、何も設定しなければ論理CPUコア数/2*500回の対局が始まる。
 スレッド数が同時対局数になる。

setoption name Threads value 6
のようにして実行すると6スレッド(×2プロセス)が起動して、6局並列で対局が進行する。
btimeで指定した数の6倍の数の対局数が行われる。

 最初これの意味がわからず、3000を指定してしまい、12000回対局していた。

 btimeとか使ってるのはUSIインターフェイス的な話で、本来は思考エンジン動かすところにただ乗りしてるので名称が適当になっている。

stopもしくはquitで終了するまで対局結果が出力される。

win : engine1勝ち
lose : engine1負け
draw : 引き分け

 マニュアルだと○、×だったが、コンソールだと文字になっている謎。
 また終了時のSFENが出てくるが、終了時だけだとあまり意味が無いと思われるが、ここらへんはやりたいことがあったら改良する形になるだろう。

対局回数の指定など)
go btime [対局回数] wtime [定跡の手数] byoyomi [予約]

定跡はbook.sfenとしてsfen形式のファイルを与える。1行に1局が書かれているものとする。
このなかからランダムに1行が選ばれてその手数は上のwtimeのところで指定した手数まで進められる。
デフォルトでは対局回数は100回。定跡の手数は32手目から。

 定跡はやねうら王は自動対局用としてはうまく散らばらせているので特に手を加えなくて良い。
 Aperyの場合妙に偏る場合がある気がするが、数をこなせばなんだかんだで平均化される。


・その他

 コマンドラインから入力した文字列を連結して、USIコマンドとして実行する機能があるので、
 これを用いて、次のような.batファイルを作ってそれを実行すれば連続自己対局が簡単に開始できる。

> local-game-server.exe go btime 500

 このときにgoを打ち忘れるとかやるとダミープロセスが残ったりするので開始したらちゃんと動いているかタスクマネージャーで確認したほうが良い。


・やねうら王以外で使う場合の検討

 対局時間
  0.1秒で探索させた場合でも自分のCore i7で探索深さ10ぐらいまでは動くので時間としては十分
  評価関数が重いとかいう理由で3とか5だったら0.2秒とかのほうがよいかもしれない

 定跡
  やねうら王の定跡は十分ランダムに思えるので、1秒対戦と0.1秒対戦であまり差が出にくいように思える(単に圧倒的に不利な方に突っ込んでるのが互いに出るのでどっちに転ぶかわからない局面が少ないのかもしれないが)
  Aperyの定跡は妙に偏る場合がある気がするが、数をこなせば結果的に平均化される気もするので今のところ放置

 計測できない部分
  LazySMPの効果
  深いDepthが影響するパラメータ
   「Depthの3乗ボーナスがやりすぎではないか」というのを進言したことがあるが、これは自己対戦の結果だけ見てるとわかりにくい。たまたま将棋所の局面で大逆転かまされてたのを見たら、Fail-Lowでどの手を選んだらよいか選びあぐねてるときにボーナスがでかすぎると何でも無い手をさくっと選んでしまう(ように見えた)
  
 こういうのもあるので、地ならしはlocal-game-serverで行い、ある程度安定したら将棋所で1秒とか3秒で変なところがないかを確認するのが良いと思われる。


・改良

 自己対戦フレームワークを使ってると以下の面が不満になってきた

 エンジンの切り替えが面倒
 持ち時間の設定を変えるのも面倒
 自動でログが残らないので保存が面倒
 勝率とレーティングを出してくれないので計算が面倒
 あとどれぐらいで終わるかわからないので予定が立てにくい

 特にファイルを書き換えるのはミスが起こりそうで、気軽さがない気がしたので、GUIを作ってみた。

スクリーンショット 2016-05-16 22.37.16.png

 これによって上記の不満が全部解消された。
 さくっと実験して、さくっとログが取れて紛失することもないし、再現性もある。


nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

piro

便利そう。こういうので自己対戦した結果や棋譜を集める仕組みがあったら面白そうな気がした。
by piro (2016-05-17 12:50) 

woody

結果自体の出力は自己対戦フレームワーク自体の改造になるので私の頭では結構考える必要があるのです。
by woody (2016-05-19 22:05) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。