やねうら王の持ち時間制御、わりと複雑で、例えば、0.6秒で思考が終わっても繰り上げて1.0秒になるまでは思考を続けるようになっている。自己対戦によるとこのほうが勝率が上がるからである。
この直前にPVの初手が変化するとその先の部分木について読みが足りないことがある。将棋ソフトの開発者ならご存知の通り、PVとnonPVとで読みの量が桁違いに異なるからである。たまに大悪手を指してしまう可能性がなくはない。しかしまあ、Stockfishもそうなってるし、こちらのほうが強いはずなので、とりあえずそれは良しとしよう。
問題は、ネットワークの遅延時間があるということである。1.0秒に思考が完了し、指し手を送ったのでは、1.1秒とかになって、繰り上げ計測で2秒消費したことになってしまう。そこで、1.0秒より早めに指さないといけない。これは、やねうら王のNetworkDelayというオプションで指定する。
NetworkDelayの値は120(0.12秒)がデフォルトになっている。会場での遅延具合を見て、この値はもう少し大きめにしたほうが良いかも知れない。
しかし、この値はあまり大きめにしないほうが得ではある。というのも、ネットワークはいつも大きく遅延するわけではないし、10回に1回オーバーして1秒損しても、平均的には小さめの値にしておくほうがトータルでは得だからだ。
そうは言っても切れ負けになる瞬間だけは大きくマージンを取るべきである。これがNetworkDelay2である。デフォルトでは1120(1.12秒)にしてある。少し大きい気がしなくもないので各自調整して欲しい。
ところで、それとは別に、将棋ソフトにはponderという仕組みがある。相手の手番のときに思考していた指し手が当たることを「ponderがhitする」と言う。
持ち時間制御では、
A) ponderがhitしたとき
B) ponderがhitしなかったとき
のそれぞれの処理が必要になる。
また、今回の電王トーナメントでは15分+1手10秒である。持ち時間が残り30秒という状況でも、1手10秒はあるので、これは40秒である。このときの計算がバグっていないとも限らない。
さらに、ponderが絡んで、持ち時間がなくなる瞬間との組み合わせに何らかバグがあると切れ負けになってしまう。ここにNetworkDelayが絡むとさらに複合的に生じるバグがあるかも知れない。256手目ルールで256手目の使用時間の計算にバグがあって256手目で切れ負けになるかも知れない。ともかく、このへん、とてもややこしい処理であることは伝わったかと思う。
正直、やねうら王では十全なテストは出来ていない。以前、将棋所でponderと切れ負けをONにして数百局、正常に対局出来ることは確認したが、その程度である。何かバグがあれば許して欲しい。(というか早めに教えて欲しい)
私は、当日、切れ負けしたら、NetworkDelay2を2200ぐらいに変更して対局しようかと思っている。ついでにMaxMoveToDraw(引き分けまでの手数)を安全を見て256ではなく258にしたほうがいいんじゃないかとも思っている。
ともかく、電王トーナメント2日目は2時間切れ負けなので、このへんのややこしい問題はずいぶん緩和されるはずではあるが…。やねうら王ライブラリ使用チームが、やねうら王に起因するバグを踏まないことを祈っている。
時間制御、これ重要ですよね。
私が調べたときは、最も正確なのは技巧でした。SMはかなりルーズでプラスマイナス0.1秒も誤差がありました。
SMのこのレベルの誤差でも指し手1秒対局では正確なRを測れないくらいの誤差が出ました。
試行錯誤した結果、最終的にdepth18~22は指し手がほとんど変わらない点に着目し、
4コア8スレッド、指し手2秒、300局が最も最短で信頼値を得られるという結論になりました。
前記事で「出村さんがPR文書を更新していないことからも、お忙しいのかなと思いまして」とありましたが、
今回のPR文書内の「自己対戦のプロセスをRubyで自動化」「前のバージョンと3000局程度対局」とあったので、
指し手秒数が書いてありませんでしたが、技巧レベルの時間制御なら0.2秒の3000局とかで信頼値が得られるのかな?と勝手に想像してました。
2駒の限界が何処か分かりませんが、現verより相当に穴埋めされているんじゃないかと思います。
ただ2駒はどうしても3駒に比べ駒の連結があまいので、ソコを攻められて上手くさばけるかが技巧の見所かなと勝手に思っています。
> SMのこのレベルの誤差でも指し手1秒対局では正確なRを測れないくらいの誤差が出ました。
search.cppのほうに4096という定数があって、4096 nodes(局面)読むごとに今回の使用予定時間になっていないかをチェックするのですが、遅いマシンだと4096 node読むのにかかるのが0.02秒ぐらいぐらいあって(つまり0.02秒ごとにチェックしていることになります)、これによる誤差とかもあったりするかも知れないです。あとは、入出力の誤差とか、使っているタイマーのAPIの違い等…。時間を正確にするのもなかなか大変ですね…(´ω`)
将棋所の代わりに自前でCSAプロトコルで通信してNetworkDelayを極限まで小さくするようなアプローチは強さにはつながりませんかね?
もしNetworkDelayの120を20にすることができたら一手当たり0.1秒得できるし結構無視できなさそうな気もします。
ぎりぎりは危険なのかなー。
CSAプロトコルで直接通信すれば、将棋所が介在しない分だけ(プロセス間の出力のリダイレクトなので20ms程度?)は得でしょう。0.02秒のために大改造するのはいまどき流行らないんでしょうねぇ…。(´ω`)
自分と相手の残り時間を比較してこちらの思考時間を調整したりといったことはあるんでしょうか?
人間だと相手の持ち時間が少ないと時間攻めしたり
相手より潤沢に時間が残ってるから一手当たり長めに使っても大丈夫とか考えたりしますが。
そういう作りにすることは原理的には可能なのですが、なかなかそこまで手が回っているソフトは少ないのではないでしょうか…。