SSブログ

コンピュータ将棋ソフトウェアの時間制御 [コンピュータ将棋]

 Yaneuraou+Apery評価関数版god whaleがあるというのを書き込みで教えてもらったのに放置してしまったのだが、理由がある(いきなり言い訳)

 理想的には、YaneuraOuはStockfishのバグ無しバージョンであるという話なのでStockfish丸パクリのように見えるSILENT MAJORITYより強いはずで、実際0.1秒だとSILENT MAJORITYがかなり弱いのだが、2秒超えるとSILENT MAJORITYのほうが強いという結果が出てしまった。

 計測方法が悪いのかと思ってたが、公式でも0.1秒ではYaneuraOuのほうが勝ち越すようだし、コメントを見るとやはりSILENT MAJORITYのほうが強いんじゃないかという書き込みもある。

http://yaneuraou.yaneu.com/2016/06/04/%E3%82%84%E3%81%AD%E3%81%86%E3%82%89%E7%8E%8B2016-mid%E3%81%AE%E9%96%8B%E7%99%BA%E3%81%AE%E9%80%B2%E6%8D%97/

 自分がやった限りでも、SILENT MAJORITYで0.1秒対戦を行うと、大変弱いので自己対戦の結果が信用出来ない。以下は前にも乗っけた対Apery WCSC26とのグラフ(横軸btime設定時間、縦軸対Aperyレーティング)

silent_majority_vs_apery_rating.png

 上記のように1秒未満だと「ふーん、ま、こんなもんじゃね?」って感じなのだが、2秒を超えてからのレーティングが「んまぁ~い」というぐらい凄まじい。しかも読めば読むだけ味が出ているというか頭打ち感が無い。YaneuraOuにしろAperyにしろ時間を伸ばす=探索局面数が増えるごとに常識的なレーティングの伸びを見せているが、それを上回るSILENT MAJORITYの伸びは異常で、その秘訣を探ろうといろいろやってみたが結局わからなかった。

 丸ごともってきたほうが少しずつ持ってくるよりも大幅に強くなるというのはかなり衝撃だった。この点においてSILENT MAJORITYはコンピュータ将棋の強さには相当貢献した(orする)と思う。

 で、R200も変わるような自己対戦の結果に対する疑問点の一つに「そもそも時間制御がうまくいってないんじゃないの?」というのがあって、気になったので少し調べてみた。

 以下、環境構築

 やねうら王自己対戦フレームワーク
  サブディレクトリに対応:技巧やnozomiが実行ファイルと同じフォルダにbook.binが必要なため
  時間計測:サーバ側で計測するように修正。あと高精度タイマに変更した。

 自己対戦フレームワーク用アプリ(自作)
  時間設定とログ保存がメイン
  秒読みマージンを技巧に対応

 計測条件
  1コア(スレッド)、時間指定1秒、その他のマージン0での結果、Ponder off(のつもり)

 定跡を使ってるのと詰みを見つけた時は目視で除外したので試行回数はそれぞれ1回。
 サンプルの手数は同じソフトウェアでの自己対戦なので70手ぐらい
 結果は以下のとおり

time1s.png

 YaneuraOu:ルールを守る気が少しだけあるが、最大値が100ms以上オーバーするというルール無用っぷり
 Apery WCSC26:そんな早指ししなくてよいのにたまに勝手に早指しする  SILENT MAJORITY:Aperyより早指しする場合がある。
 nozomi:Aperyを参考にしているのか傾向としては似ている。ただ最小値になる確率は低いのと、1000ms超えることがなかったのが好印象。ルールに則った正統派といえる。
 技巧:安定性ではPC上のアプリケーションが制御できる限界レベルといって過言ではない。しかし必ずオーバーするのは完璧超人じゃないからだろうか。
 
→Apery関係は追記で修正しました

 技巧のソースは部分的にしか見てないから適当だが、あくまでも一般的な話としてWindows上でSleepやイベントを使用した場合、アプリケーションに起こりうる変動は10msなのでそれ以下なら十分だと思っている。なので直感的には1000ms指定して1000+-10msなら合格だと思ってたが、自己対戦する上では期待通りに動いているのが技巧だけという結果だった。ここまで精度が高いのになぜ1000msを超える場合があるのかは謎。また、ユーザー視点では将棋所の厳格な時間チェックをいれてまともに動くのは多分nozomiだけだろう。

 0.1秒にすると誤差がさらに明確になる

time100ms.png

 nozomiは内部的に1秒が最小になるようにしているようで、外部から0.1秒に設定できなかったので未計測。

 シングルスレッドの結果なので、マルチスレッドによる変動はないことを考えると、0.1秒自己対戦をやる前に、技巧を見習って時間制御をまともにするべきであろうと思う。技巧はこの精度出すために何か工夫してるのだろうか。

 平岡さんのツイートにも書いてあったがMargin設定0にした場合でも

・定跡(序盤)
・詰みを見つけた場合(終盤)

 は1000ms(1秒)設定のときに10msとか200msとかで返ってくるので目視で判別して弾いていたが、それでも中盤に頻繁に200msとか400msとかで応答を返してくることがあった。

 この現象はApery系統にしかない現象なので、そんなもんだろうと思っていたのだが、よくよく考えてみると将棋所では見たことがないのでピンときて、ツールを修正したところ、Apery系統でも期待通りの動きになった。

 原因は時間指定の方法だった。
 USIプロトコルには時間指定の方法には3種類ある。

 持ち時間:btime/wtime
 秒読み:byoyomi
 フィッシャールール:binc/winc

 で、ベースがやねうら王フレームワークなので、btime/wtimeを使っていたのが原因だった。Aperyに限らず切れまけの時代のソフトウェアは持ち時間に対して係数を掛けて考えても無駄なら読み切るコードになっていたはずで、そのルーチンが動いていたと思われる。

 持ち時間:考えても無駄な場合に読みを打ち切る
 秒読み:限界まで考えてもよい
 フィッシャールール:未調査(Inc_Marginが関連していると思われる)

 元々btime/wtimeはやねうら王の対戦フレームワークに指定されていた方法で、自分自身の改造やねうら王のデバッグに使っていたので気にしていなかったが、Aperyに使う際にはbyoyomiで指定する必要がある。

 やねうら王(とおそらく技巧も)の場合、持ち時間も秒読みも全部まとめて思考時間として処理しているようなので、そこまでは絶対考えるようになっているが、Aperyでは最小思考時間で1500が指定されていてもbtime/wtimeには効いていないというのが原因だった。

 というわけで、自己対戦ではApery系統にはbyoyomiを指定しなければならないことがわかったので、byoyomiを指定した100msの場合の処理時間は以下のとおり

time100ms_byoyomi.png

 平岡さんの言うように最小値+20msぐらいになった。

 今までのレーティングはbtime/wtimeでやっていたので短時間の場合、SILENT MAJORITYはただでさえ弱いのが更に弱くなっていた可能性があるので、ちょっとAperyと自己対戦をしてみたところ、対Aperyだと同じように強くも弱くもなるので、短時間が弱いのには変わりないようだった。

nice!(10)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 10

コメント 0

コメントを書く

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

トラックバック 0

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