2017/5/6 23:50追記。皆さんのお陰で解決しました!ご協力いただいた皆さん、ありがとうございました。
標題の件、状況がよくわからないのですが、
Elmo公開ということで、棋譜解析関連についての雑感をどこかに書くかも。Twitterか、選手権とまとめてブログか。
探索やねうら王では、ShogiGUIの棋譜解析時に読み筋が数手しか表示されないことがよくあるため、今までは解析時にはあまり用いていなかった。今後どうしましょう
— Shota Chida (@mizumon_) May 5, 2017
魔女ではうまく表示できているのだと思うのですが、PVの出力には大きくわけて2つの方法があります。
1) 置換表から指し手を集めてきて出力する
2) 探索のときに作成したpv配列の内容をそのまま出力する
Stockfishの昔のバージョンは1)だったのですが、いつしか2)になって、それで、2)だとnull moveのときにうまく表示できないという問題かと思ったので、やねうら王V4.46では1)の方式で出力するようにしました。
ところが、これでも解決していないようです。
@yaneuraou @mizumon_ 4.46でも読み筋出なかったりしました。5月1日の名人戦 佐藤名人・稲葉戦の85手目▲24歩の局面です。ご確認下さい
— よりこぉね (@yorikone) May 6, 2017
これは以下の局面のようです。(USIコマンド表記)
1 |
position startpos moves 2g2f 3c3d 2f2e 2b3c 7g7f 3a2b 3i4h 4a3b 3g3f 8c8d 6i7h 8d8e 4h3g 8e8f 8g8f 8b8f P*8g 8f8e 3g4f 7a6b 5i6i 7c7d 5g5f 3c8h+ 7i8h 2b3c 8h7g 6c6d 7g6f 6b6c 5f5e 6a5b B*5f 8a7c 8i7g 8e8a 3f3e 3d3e 4f3e 7d7e 6f7e 7c6e 7g6e 6d6e 3e4f P*7d 7e8f 5a6b 5f4e 4c4d 4e2g 4d4e 2g4e 3c4d 4e1h P*4e N*5f 3b4c 5f4d 4c4d 4f5g 5c5d 5e5d B*5e S*5c 5b5c 5d5c+ 6b5c 4g4f P*5f 5g5f 5e4f G*3g 4f5g+ 3g4g 5g4g 5f4g N*5g 6i7i 5g4i+ 2i3g 2a3c P*3d 4d3d 2e2d |
おかしいなと思って魔女のソースコードを見ると2)の方式で出力しているので、魔女がうまく出力できているのだとしたら、この問題ではなさげ?
そんなわけで、どうも状況がよくわかりません。
2)の方式で出力してそれでうまくいくのだとしたら、やねうら王のpv配列の更新処理にバグがあって正しく更新できていないのか、更新を3秒に1回に抑制している影響でPVが出力されないことがあるのが問題なのか…。
お気づきの点があればコメント欄で教えてください。
2017/5/6 18:00 追記
@yaneuraou 反映してくださりありがとうございます。
こちらでは、検討モード解析モードのいずれの場合も改善されています。大変助かりました。— Shota Chida (@mizumon_) May 6, 2017
V4.46で改善しているとのことのようです。うーん、なんでだろ…。
2017/5/6 20:40追記
@yaneuraou V4.47で直っているようです
— よりこぉね (@yorikone) May 6, 2017
おお!?PvIntervalを0に設定しても1ms以内には複数PVを出力しないコードになっていたのですが( “≦” にすべきところを “<” にしていた)、これか原因だったのかも知れませんね…。
4.46は以前あった読み筋が1手しか表示されないといったことはないので問題ないような気がします。
確かに短いのもありましたが。微妙?
https://pastebin.com/hiVBpcrc
あとなんか長いのもありました(笑
https://pastebin.com/3q5Twu4A
自分でビルドした奴なので参考までに。
詳しい情報、ありがとうございます。あとで調査しますね。
4.48は4.46に比べて圧倒的に短いPVが増えるような…..Windows版での確認ですが以下
https://pastebin.com/hmSVE6QC
どうしてこうなった(´・ω・`)
lowerboundとupperboundとが出力されているところは、fail low/fail highという現象が起きているところ(詳しくはググレカス)なので、PVが短くなるのがむしろ正しいです。4.46は、そのときにも無理やり置換表を漁ってPVを出力していただけで…。
了解です。(`・ω・´)シャキーン
なるほどそういうことか。
PS.複数のデバイスでコメントして申し訳ありません
ShogiGUIは探索深さを設定した時、設定した深さ以上を思考したときにその一つ前の手を返すみたいです(あくまで推測なので真偽不明)
やねうら王の思考を見てると探索深さ2手読みからいきなり20手オーバーの探索をすることがあるので、そのせいかもしれないと私は考えてます
それでしたら、PvIntervalを0にした場合、どうでしょうか?
V4.46を落としてみましたが、PvIntervalを0にしても2~3手読みから9~10手読みに飛躍することがあります。
また読み筋が途中までしか表示されないことがまだあるようです
といっても20読みの時に、18手しか表示されていない程度の差なので何度かやり直せばなんとかなります
なるほど、少し状況がわかってきました。以前のバージョンでPvIntervalを0にした場合はどうでしょうか?
あとV4.47リリースしました。検討モードだとPvIntervalを0とみなしてPVを出力します。あと前回から1ms以内に続けてPVを出力しないようになっていたのでこれを修正しました。こちらではどうでしょうか?
以前のバージョンもPvIntervalを0にしたところ飛躍がありました。後ほどV4.47を落としますね
(`・ω・´)ゞ
V4.47でPvIntervalを0にして検討モードと棋譜解析モードを試したところPVの飛躍がなく、読み筋も探索深さ分表示されていました。
ただPvIntervalを300にして検討モードで試すと飛躍が出ます。
「検討モードだとPvIntervalを0とみなしてPVを出力します。」←これがPvIntervalにどんな数字を入れても検討モードでは無理やり0にするって意味だと解釈していましたが、勘違いならすいません
> ただPvIntervalを300にして検討モードで試すと飛躍が出ます。
go infiniteで思考が開始されたときにPvIntervalを0とみなすように変更したんですけど、もしかしてShogiGUIの検討モードというのは、go infiniteではない?
また、棋譜解析のときは、思考時間固定とか、探索深さ固定とかなんですかね…。うーむ..。
当方、プログラムに疎い身ですが、情報提供まで。
v4.47にすると、詰みのある局面で検討が深さ2などで止まってしまう問題は解決しました。ありがとうございます。
しかし、棋譜解析した際に読み筋が1,2手しか入らないことがあります。(ShogiGUI0.0.6.10)
(佐藤天彦 名人 vs. 稲葉 陽 八段 第75期名人戦七番勝負第3局の棋譜で確認)
(1手1秒で解析、5秒で解析、深さ15で解析などいずれの時も)
これは、PVIntervalを手動で0にしても起こります。
また、コンピュータ同士の対局時にやねうら王の思考を見てみると、急に読み筋が減って表示されることがあります。(秒読み1秒対局時に0.9秒などでよくなる)
参考までに限定公開で動画を上げました。(そのうち消します)
https://youtu.be/K0orrP0IKA8
> 急に読み筋が減って表示されることがあります。
これ、秒が来たので、思考の途中で打ち切っていて、そのときの読み筋を出力しているのですが、その読み筋が未完成なので、まあそうなります。
この思考の打ち切りタイミングでは読み筋を出力しないようにするか、棋譜解析のときは探索深さを固定して解析させるとかですかね…。うーん..。前者の処置をすると、PvIntervalに0以外を指定されている場合にPvを出力しないまま指し手を指すことになります。PvIntervalが0でかつ思考を中断するときに読み筋を出力しなければいいですかね…。V4.48でとりあえずそうしておきました。
読みづらくなりそうなので返信ではなく新しくコメントを書きます。
V4.48では、PvIntervalを300にしても飛躍はありませんでした。
(もしかしたらV4.47で試した時にgithubのexeファイルの入れ替え前を使ったためかもしれません)
2017Earlyでは
検討モード、棋譜解析モードともに
PvInterval 0 + 探索深さ設定で解決されますね。
お忙しい中素早い対応本当にありがとうございました
解決してますか?やりましたですぞ(`・ω・´)b
ごめんなさい、コメント書いた後に数回試したら
検討モードでPvInterval 300 + 時間設定だと飛躍することがありました。。。。
PvInterval 0 + 探索深さ設定で解決しているので問題はないのですが
ShogiGUIの検討モードの仕様、よく知らないんですが、go infiniteではなく、秒固定での思考だったりするんですか?
go infiniteならPvInterval 0とみなしてPVを出力しているはずなんですけど..
ひとつわかりました。
go infiniteは検討モードで時間無制限にチェックを入れた時に始まります。
http://www.geocities.jp/shogidokoro/usi.html
時間設定したらgo byoyomiとか
深さ設定ならgo depth
ノード設定したらgo nodes かな?
https://sites.google.com/site/shogigui/home
GUIとエンジンのやりとりってどこで確認できるんですか?
おお、なるほど。そういうことなんですね。> 検討モード
> GUIとエンジンのやりとりってどこで確認できるんですか?
将棋所だとあるのですが、もしかするとShogiGUIはその機能ないのかも…。やねうら王側は、「log」というコマンドが送られてくればファイルにログを書き出す機能はあるので、手動で思考エンジンに対してこのコマンドを一度発行できると良いのですが…。やねうら王をビルドしなおせるなら、「log」オプションをデフォルトで有効の状態にしてもらえればと…。
エンジン設定にWriteDebugLogというオプションがあって、それをOnにすれば良いことをいま思い出しました。
V4.48でPvIntervalを0に設定して時間指定で棋譜解析してみたのですが、
やはり読み筋が数手しか表示されないことが多いような気がします。
エンジン設定画面でWriteDebugLogをTrueにしてログを見ますと
時間指定の棋譜解析では「go btime 0 wtime 0 byoyomi XXXX」が送られてくるようです。
また、適当にデバッグログを入れて確認しましたところ
V4.48でPvIntervalが0であっても、各指し手の最後にSignals.stopがtrueのときの読み筋(短い読み筋)を送っているように見えます。
試しに以下のように直して棋譜解析してみましたところ
少し改善したような気がします。
■V4.48
if ((Signals.stop && pv_interval) ||
// MultiPVのときは最後の候補手を求めた直後とする。
// ただし、時間が3秒以上経過してからは、MultiPVのそれぞれの指し手ごと。
((PVIdx + 1 == multiPV || Time.elapsed() > 3000)
&& (rootDepth < 3 || lastInfoTime + pv_interval <= Time.elapsed() )))
■改修案
if ((Signals.stop ||
// MultiPVのときは最後の候補手を求めた直後とする。
// ただし、時間が3秒以上経過してからは、MultiPVのそれぞれの指し手ごと。
((PVIdx + 1 == multiPV || Time.elapsed() > 3000)
&& (rootDepth < 3 || lastInfoTime + pv_interval <= Time.elapsed() )))
&& !(Signals.stop && !pv_interval))
ただし、思考打ち切り時ではなく通常のpvが短いときには上記修正は効いてこないので
V4.46のように「#define USE_TT_PV」も併用する方がよいかと思います。
(実際、時間指定2秒では「#define USE_TT_PV」なしでもうまくいったように見えたのですが、
時間指定10秒にするとfail low/fail highが増えて棋譜解析結果が1~2手のことが多くなってしまいました...)
また、PvIntervalが0か否かで判定するのは苦肉の策のように思いますので
「思考打ち切り時の読み筋を出力するか否か」を新たなオプションで定義してしまった方がすっきりするような気もしています。
その修正、なるほどですね。
> 時間指定10秒にするとfail low/fail highが増えて棋譜解析結果が1~2手のことが多くなってしまいました...)
ShogiGUIの「fail low/fail highのときの読み筋を棋譜解析のときに書き出す仕様」なのがおかしいような気もしますが、かと言ってそうなっていないとbestmoveがXなのに読み筋の初手がYみたいな状況になって、これはこれでおかしいのかも知れませんね。
そのため、USE_TT_PVを有効にしないといけないというところまでは理解しました。
その場合(USE_TT_PVを有効にする場合)、読みを打ち切るときにpvを出力してはいけないのでしょうか?これを出力しておかないと読みの1手目とbestmoveが違うケースが出てきて少し気持ち悪い気がしなくもないのですが。
読みの1手目とbestmoveの件、確かにおっしゃるとおりですね。
結局のところ、USE_TT_PVを有効にすれば思考打ち切り時の条件はV4.47以前のままでよく
PvIntervalの値を0にする必要もない、ということのようですね。
そのように直して棋譜解析1手10秒をPvIntervalが0msと300msで試してみましたところ
読み筋が極端に短くなることはなくなったように思います。
(githubを今確認しましたら、既にV4.49で修正済みでしたね...)
V4.49ではなおってますでしょうか?情報が錯綜してて、いまいちよくわかりません><
githubのexeにあるV4.49だと棋譜解析・検討で14手読みの時に表示されている読み筋は9手だったりすることがあります。
これは、時間設定でも深さ設定でもそうなりますしPvIntervalを0にしても飛躍はありませんが読み筋の表示は少なくなっています。
V4.48を書き直したり、V4.49のソースコードからコンパイルすることが難しいので何が原因かはわかりませんが一応報告しておきます。
> 14手読みの時に表示されている読み筋は9手だったり
これ、null move(読みのなかでの1手パス)があるので、まあ、そういうことはあるかなと思うのですが、魔女ではこの現象起きないのですか?
4.49試しました。読み筋が全く表示されないこともあります。空白。途中で表示されたりしましたが、長時間読ませてると表示されなくなったり。
pv_intervalを0に設定してますか?
0にしないといけないのですか100にしていました。これから試してみますね
0に設定したら問題なく候補手が表示されるようになりました
(`・ω・´)b それは良かったです
fukudaさんの返信がこのコメントに対する返信になっていなかったので、削除させていただいて、ここに要点だけコピペさせていただきますね。
> やねうら王+elmo 候補手が表示されない
> 魔女+elmo 候補手が表示される
> たぬき+elmo 候補手が表示される
> 読み太+elmo 候補手が表示される
> カパック 候補手が表示される
まだ詳しく調査してないんですけど、もしかしてAVX2版ではなく他のCPU用の実行ファイルをお使いということはないのでしょうか。他のCPU用の実行ファイル、ここのところ更新してないので…。
ここにかけばいいのかな?
今試したのですが
YaneuraOu-2017-early-sse2.exeを登録して検討モード使うと候補手表示されますね。
YaneuraOu-2017-early-sse2.exe
これをYaneuraOu-2017-early.exeとリネーム無しでSHOGIGUI登録し検討モードで試した所、候補手が表示されました。
そうなんですね。わかりました。あと、コメントが返信になってないです。とりま、このコメントも含めて、あとで読む人のために、のちほどコメント、いくつか削除して整理しますね。
その更新で読み筋まわりの変更はしてないので、fukudaさんが試していた一つ前のバージョンが、一つ前のバージョンではない可能性が高いかなと…。
P.S. コメント欄、あとで整理します。
githubでdownload ZIPからダウンロードしても、タイムラグなどで最新版をダウンロードしているつもりでも過去のバージョンになっているとかですかね?
まあ、そういうケースもあるかと…。あとは私が実行ファイルを差し替えていないこともありますし、そちらで差し替えたつもりで差し替わってないケースもあるでしょうし、ともかく、思考エンジンの実行ファイルを直接実行して「usi」とタイプすれば、バージョンナンバーが表示されるので、そうやって確認してもらうと良いかと…。
とりあえず、この問題は解決済みということで、修正作業は終わりとして、のちほど本記事のコメント欄を整理しますね。