ShogiDroidでやねうら王の一部のエンジンオプションが正常に動かないらしい。
今回は、この問題について詳しく書く。
SkillLevelのオプション名について #111
https://github.com/yaneurao/YaneuraOu/issues/111
一言で言うと、USIプロトコル原案(以下、「原案」と記す)にあるオプション名はそちらに従うべきではないかという話である。
SkillLevelオプションについて
SkillLevel(手加減するためのオプション)は、原案には存在しない。
原案には、”USI_Strength”というのがあって、これは、指定した段位になる(負の数だと級位を示す)というものらしいが、エンジンの強さをそんな微調整するのはとても難しいので、これを実装するのは現実的ではない気はする。(『将棋神やねうら王』では、それに近いことはやっているが、思考エンジン側ではなくGUI側のエンジンプリセットとして処理している。)
なので、”SkillLevel”オプションはUSIプロトコルで扱う範疇ではなさそうだが、ShogiDroidでは、Stockfishの”SKill Level”とそれをUSI風の”USI_SKillLevel”に対応しているらしい。
http://siganus.php.xdomain.jp/phpBB3/viewtopic.php?t=347
ここをGUI側から勝手に調整されたくないという気はしている。
やねうら王の”SkillLevel”オプションは、Stockfishの”Skill Level”を忠実に移植したものなのだが、これは20だと手加減なし、19以下の設定値だとそれ相応に弱くなるというオプションである。
この20というマジックナンバーや、どれくらい弱くなるかというのは、実装によりけりで、この部分が標準化されているわけではないので、これくらい弱くなるだろう、みたいな感じでGUI側から勝手に変更されても困るというのはある。
なので、SkillLevelオプションはこのままリネームしないことにした。
※ ちなみに、Stockfishの”Skill Level”というオプション名を”SkillLevel”のようにスペースを詰めたのは、オプション名としてUSIプロトコルでは「optionnameにはスペースを入れてはいけません。」のように説明があり、スペースを含むオプション名をプロトコル上、許容していないからである。(GUI側がスペースの入ったオプション名を処理できない可能性がある)
※ ShogiDroidでは、やねうら王の”SkillLevel”オプションを”USI_SkillLevel”と変更してビルドしているらしい。このオプション、GUI側からいじれて欲しくない気がするので、とりあえず現状維持で…。
USI_OwnBookオプションについて
原案には、”USI_OwnBook”というオプションが予約されており、これがtrueのときだけ、思考エンジン側の定跡が有効化されるというもののようである。定跡の指し手ではなく、実際に思考したいというのをGUI上の操作でささっとやりたいことはあるだろうから、このオプションの意義はわかるし、ShogiDroidがこのオプションに対応しているということであれば、やねうら王側にもこのオプションを追加すべきである。
そんなわけで追加することにした。(やねうら王 V4.90以降で有効)
USI_Hashオプションについて
やねうら王は長らく置換表サイズは、”Hash”というオプションを使用してきた。当初はUSIプロトコルで規定されている”USI_Hash”を用いていたのだが、将棋所では先手と後手とで個別にこの設定値を変更できなかったので、片側だけこの値を大きくして、置換表サイズの変更により強さに影響がどれくらい出るのか計測しようとした時に困ったからである。
しかし、その後、将棋所のバージョンアップにより、先後のエンジンを個別に”USI_Hash”の値を変更できるようになったし、ShogiGUIでもエンジンごとに個別にこの設定値を変更できるので、もはや”Hash”というオプションは初心者にとって地雷でしかなく、”USI_Hash”に変更しようと思う。(やねうら王 V4.90以降)
■ 2020/3/9 20:00追記
上記の変更箇所をGitHubのソースコードに反映しました。
https://github.com/yaneurao/YaneuraOu/commit/a9db04692302b5cda91c288b310434d6fa29b19c
■ 2020/3/9 23:30追記
NodesLimit , DepthLimitオプションについて
これらでノード数、探索深さを制限するのではなく、USIプロトコルでは”go”コマンドのときに、nodes、depthを指定できるようになっているので、それに従ってくれという話もあるのですが、将棋所がそうはなっていなかったので、これらのオプションを無くすわけにはいきません。
しかし、やねうら王では、”go”コマンドのときにnodes、depth自体は指定できるようになっています。
MultiPVオプションの件
“MultiPV”もUSIプロトコル原案では”USI_MultiPV”として予約されています。こちらを使ったほうが良いのでしょうか?
ShogiGUI/ShogiDroidは、どちらでも受け付けているようなので、『将棋神やねうら王』のほうも両対応(“usi”コマンドをGUI側から送信して、思考エンジン側からリターンがあったほう)にするという処理にします。
ShogiGUI/ShogiDroidの”Skill Level”対応を”SkillLevel”にしてもらう件
以上のやりとりにより、やねうら王の”SkillLevel”オプションのリネームはしなくてすみそうです。
かつてUSI_HashとHashの違いに悩みコメントしたりもしましたが、そういった紛らわしいオプション項目で困惑することが無くなるのは新規導入者にも嬉しいアプデですね。
個人的には定跡周りのオプションもややこしく感じるので、いつかテラショック定跡アプデの折に大変身しないかと楽しみにしています。
定跡自体、GUI側が一元管理して、GUI側が提供すべき(思考エンジンに局面を渡さない)ではないかと、私は思ってるんですけどね…(´ω`)
定跡周りはGUI側でサポートするべきというのは前々よりやねさんも主張されてるところでしたね、
USIプロトコルは将棋所が広めた節がある[要出典]ので、これはUSI2.0で定跡をサポートさせたMyShogiを普及させる流れ…!
あるいは、USIプロトコル中継して、定跡の時だけエンジン側に渡さない、定跡proxyエンジンみたいなのがあればいいかもです…。
将棋所 — 定跡proxy – 思考エンジン
このようにすることで定跡は定跡proxyが担当しますです。設定などは、定跡proxy付属のGUI型のツールで行います。(戦型選択などもそこで行えるものとします)
そういえばNetworkDelayも環境や通信対局かどうかで変わってくるのでGUIが管理しろってなんとかちゃんねるに書いてありました
一理あります。公開しているすべてのGUIが管理してくれるのであれば、そうしたいです(T_T)
「この定跡ファイルは○○のオプションを××にして使ってください」みたいなのが多すぎるから分かりにくいんだと思うんですよね。
例えばテラショック定跡はBookDepthLimitを0に設定しないといけないとか、まふ定跡はConsiderBookMoveCountに対応していないとか。
別の定跡ファイルにするたびに色々設定しないといけない。
これ定跡ファイルに依存した設定なので、定跡関連オプションはengine_options.txtみたいなのを定跡ファイル内に書けるようにしたら便利だと思うんです。
例えば定跡ファイルの冒頭にBookDepthLimit=0と書いておくとBookDepthLimitが自動的に0になる。
こうすればユーザー側は何も考えずに定跡ファイルをダウンロードしてくるだけで使えるようになるのでややこしさは解消されるのでは。
それですと、エンジンオプションで使う定跡を変更したときに(BookFileの変更で)、エンジンオプションの値(BookDepthLimitとか)が変わることになるのですけど、エンジンオプションの値はGUI側が記憶することになっているので、それが出来ないんですよね…。
あんまりはあくしてませんが、MyShogiも変更される?→すると各エンジンも変更?
各エンジンは各開発者さんですか。
MyShogiから使う各エンジンは、GitHubのやねうら王のソースコードからビルドしてます(`・ω・´)b
wcsc30の進捗はいかがですか?
な、、何も…(T_T)
すみません、今思考エンジンと将棋所をつなぐプロキシエンジンを勉強も兼ね、C#作ろうと思っているのですが、どうやら引数は起動時にしか渡せないようです。
これは引数ごとにエンジンを起動させちゃって良いのでしょうか?
MyShogiではどうなっているのかも知りたいです。
その引数とは、コマンドライン引数のことですよね?何の情報を渡そうとしているのでしょうか?
MyShogiではエンジン起動するときに何も引数は渡してないです(´ω`)
すみません、間違えました。
順を追って説明しますね。
プロキシエンジンを作ろうと思っている
↓
やねうら王に指示(GUIからの命令)を出す方法が起動時の引数しか思いつかない
という事で悩んでいます。
引数以外にやねうら王に指示を出す方法を教えていただけたら幸いです。
自分で見つけました。
プロセス間通信でしたね。
GUI→プロキシ→エンジン
みたいな事をしたいのですが、どうすれば良いでしょうか?
> 引数以外にやねうら王に指示を出す方法を教えていただけたら幸いです。
何の指示を出したいのでしょうか?オプション設定絡みであれば、
setoption xxx
でオプションコマンド送れば良いような…?
ありがとうございました。
最後に一つ質問なのですが、やねうら王では、手数はどこに格納されていますか?
(探したけれど見つけられなかった)
手数というのは初期局面からの手数ですか?
Position::game_ply()で取得できますよ(`・ω・´)b
USI_OwnBook をオンにすると、指定した定跡ファイルよりも、思考エンジンの定跡が優先的に反映される、という理解でよろしいでしょうか?7
ShogiGUI側から見るとそうなるとも言えるのですが、思考エンジン側から見ると、「USI_OwnBookがオフのときは自身の定跡を使わない」というだけです。その結果、ShogiGUI側が勝手にShogiGUIが持っている定跡を使うのか、あるいは使わずに思考エンジンに思考せよと命令してくるのかは、ShogiGUI側の問題でして…。
思考エンジン自身の定跡とは、「やねうら王」の場合は、standard_book.db とか、yaneura_book1.db などのことを指すのですか?
それらの定跡を使う、使わないをUSI_OwnBookで指定する、という理解でよろしいでしょうか?
私は、「思考エンジン自身の定跡」が思考エンジンのexeファイル内にあるのかと思ったのですが、そうではないのですね?
思考エンジン自身の定跡は実際は外部ファイルになっております。通例、思考エンジンと同じフォルダ内のbookフォルダに入れることになっております。
ですです!
了解しました!