NetworkDelay,NetworkDelay2のデフォルト値は何故0ではないのですか?

標題の件、ときどき問い合わせを頂戴するので記事にまとめておく。

NetworkDelayのオプションが何を意味するのかについては以下の記事を参考にどうぞ。

やねうら王ライブラリのNetworkDelayオプションについて

ところで、このNetworkDelayとNetworkDelay2、ネットワーク対局するわけじゃないんだから、デフォルト値は両方0にしてくれないかという問い合わせを時々頂戴する。

というのも、なんとかちゃんねるでは、ソフト同士の対局で10局ぐらいの結果を投稿すると、対局数が少なすぎるんじゃないか、お前は統計を学校で習ってないのかとフルボッコにされる。

確かに10局は少ない。100局や1000局でも微妙な棋力の差は計測するのに十分ではない。やねうら王では、少ない時でも数千局、多い時は数万局やって計測していた。

とは言っても、個人がPCを何十台も持っているわけではないので、10局で少なすぎると言われると、そういう人は次に時間を極端に短くして対局させるわけだ。GUIで設定できる最小のところ…、つまり、1手1秒対局である。

しかし、やねうら王では、NetworkDelay2のデフォルト値が1000より大きな数値になっているので、GUI側で1手1秒に設定すると、思考エンジン的には0秒で指せと命令されていることになり、何も考えない即指しになる。そうすると「俺より弱いぞ、なんだ、このゴミソフトわwww」みたいなことをなんとかちゃんねるに書き込むことになる。それを見た人たちが、「こういう馬鹿が出ないようにNetworkDelay , NetworkDelay2のデフォルト値は0にすべき!」と言い出す。そして、このブログの感想の送信フォームからガンガン匿名でそういう文が送られてくるわけですわ。

私としてはとばっちりに近いのだが、とりあえず、「NetworkDelay、0はまずいぞ」という理由を以下に書く。

プログラマでない人は、「ローカル対局なので通信の遅延時間は0!」みたいに思っているかも知れないが、GUIと思考エンジンとは別のプログラムである。OSの「プロセス」という単位の、別のプログラム(別のプロセス)なのである。GUIと思考エンジンとはプロセス間通信をしているわけだ。その他、なんやかんやのオーバーヘッド(詳細略す)で0.1秒ぐらいの遅延はある。さっき私の書いたMyShogiとやねうら王との組み合わせで計測したら、片道 100ms(0.1秒)~150ms(0.15秒)程度の遅延時間があった。また思考エンジン側も時間が過ぎてそうなら止まるようなコードが書いてあるが、多少の誤差はあって少し超過することもある。その超過の時の誤差が最大で100msぐらいある。そんなわけで、往復 300ms + αぐらい早めに思考した指し手を思考エンジンはGUIに返さないといけない。

そこでやねうら王では、NetworkDelay = 300をデフォルト値としてある。実はこれはギリギリの値で、CPUをフルに使っているときは、ときどき超過している。NetworkDelay2 = 300だと切れ負けになりかねない。そこでNetworkDelay2 = 500~600がローカル対局のときのベストな値であると思う。これより小さいと切れ負けになりうる。

そんなわけで、NetworkDelay = NetworkDelay2 = 0には出来ない。

ここまで言うと「フィッシャールールのように1手n秒加算の時ならNetworkDelay = 0 , NetworkDelay2 = 600でどうか」と言う話が出てくる。

しかし、「NetworkDelay = 0」も以下の理由でお勧めできない。

この値を0に設定すると、思考エンジンとしては、例えば2秒以内(計測1秒)で指すつもりが、2.3秒で指していることになり、このとき計測2秒である。つまり倍かかっているようにGUI側から見えるし、残り持ち時間も1秒ではなく2秒引かれてしまう。持ち時間が不当に減るのである。だから「NetworkDelay = 0」に設定すると短い持ち時間の対局では極端に弱くなる。

追記[2018/10/3 23:45]

ただし、レーティング計測のためにNetworkDelay2を0にして1手N秒という秒読み設定で計測するのは適切な計測方法である。(uuunuuunさんのレーティング計測がこの方式)

秒読みモードであれば、関係してくるのはNetworkDelayではなくNetworkDelay2であり、これを0にして、かつ、GUI側の切れ負け判定をオフにする。(そうしないと切れ負けになってしまう) この条件であれば、思考エンジン側は1手N秒ぴったり使うことが出来て、1手N秒きちんと使った計測であると言える。

他方、1手N秒加算のフィッシャー方式でNetworkDelay2 = 0にするのは誤差が大きい計測となる。エンジン側からすると毎回1.99秒(計測1秒)で指しているはずが、2秒とちょっとで指していることになり、計測2秒となってしまう。これはエンジン側からすると大きな誤算である。

追記[2018/10/30 12:00]

結論をまとめておく。

  1. 通常対局時→NetworkDelay,NetworkDelay2を変更しないことを推奨
  2. 時間無制限の検討時→あえて変更する必要がないから変更しないことを推奨
  3. 1手N秒の検討時・1手N秒での棋譜解析時→NetworkDelayは影響しないから変更しないことを推奨。また、1手2秒設定にしても2秒からNetworkDelay2を引いた分の時間しか思考しないことになるので、NetworkDelay2を0にするのは悪いことではないが、そのままの設定で通常対局をして切れ負けになると嫌な人は、1手の思考時間をN秒 + NetworkDelay2(NetworkDelay2の時間だけ加算した秒数)に設定して検討したほうが良いと思う
  4. フィッシャー方式でのレーティング計測用の対局の時→NetworkDelay,NetworkDelay2を上に書いた理由により変更すべきではない
  5. N分切れ負け方式でのレーティング計測時の対局の時→これも上に書いた理由により変更すべきではない
  6. 1手N秒設定でかつ切れ負けをオフにした状態でのレーティング計測用の対局の時→このときに限りNetworkDelay2を0にすべき。

結論的には6.の時以外のケースでNetworkDelay、NetworkDelay2の値を変更するのは推奨しない。また、6.のレーティング計測方式は、いまでは古く、持ち時間制御の良し悪しを加味しない計測であるため、4.か5.のほうがより正確な棋力が計測できるように思う。このため、総合的に見てもNetworkDelay,NetworkDelay2の値をデフォルト値から変更するのは推奨しない。ただ、3.のケースには注意が必要だ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です