やねうら王のV4.83からSkillLevelオプションが追加した。このオプションの意味をここで解説しておく。
なお、V4.83の実行ファイル詰め合わせはこちらからダウンロード出来るようにしておいた。
https://github.com/yaneurao/YaneuraOu/releases/tag/V4.83
SkillLevel自体はStockfishに搭載されている手加減用のオプションで、0から20までの値を指定でき、20は手加減なし。0が最弱。
0から19までの値を指定した場合、MultiPV 4(候補手、上位4手)で探索する。
1. 例えばSkillLevelが10だとdepth 11を超えると以下の2. の指し手の選択(pick_best)動作が入る。
※ 反復深化のdepthが SkillLevel + 1を超えた時点で毎回これを行う。これはどのタイミングで探索が終了しても良いようにするためである。depthがSkillLevel + 1に至るまでは、この動作をしないので、MultiPV 4で探索している時の挙動と同じである。
2. SkillLevelの値が小さいほど、大きな値になるように調整された乱数を用いて、ごにょごにょして算出した値(以下式のpush)をMultiPVで探索した指し手の評価値に加算して、それが最大となる指し手を選択。
※ weakness = 120 – 2 * SkillLevel として、push = (weakness * int(MultiPVの1番目の指し手のスコア – MultiPVのi番目の指し手のスコア) + delta * rand(weakness)) / 128。delta = Min { MultiPVの1番目の指し手のスコア – MultiPVのなかで一番評価値の悪い候補手のスコア , 歩の価値 }
簡単に言うと、SkillLevelが低いほど、MultiPVの2番目以降の指し手が選択される確率が高くなる。ただし、それでも、あまりに悪い指し手は採択されない。(pushの値を加算して最大のスコアの指し手を採択するため。つまり、pushの値が採択する許容範囲を表現している。)
・SkillLevelで棋力を調整する場合、序盤でそれなりに悪い指し手が現れる。(序盤の評価値100点の差はかなり大きな損なので) このため、人間っぽい弱さが表現できる。(かも)
・SkillLevel 19だとSkillLevel 20に比べてR300ぐらい弱くなる。これは、MultiPV 4で探索するのでそのロスがあるし、depth 20までしか探索しないので、たぶん長い時間だともっと弱くなる。
・SkillLevel 0だとR4000以上弱くなる。depth 1なのでほとんど探索ができないため。
・SkillLevelはdepth制限 + MultiPVみたいな感じなので、探索の時のスレッド数を増やすと同じSkillLevelでも強くなると思われる。(LazySMPはスレッド数が多いと、広く読むことになるので) そのため、SkillLevelで棋力を調整するなら、スレッド数 = 1のように固定すべきだと思う。
ぱっと理解した限りでは、「たまーにうっかり大ポカしちゃう」ような調整では、ないってことですかね?
わき道にそれますが、「こちらの最善手ではないけど相手の悪手を誘う」ようなアルゴリズムも、需要がある気がします。相手の2番目以降の指し手が大悪手ばかり、だけど自明の必然手でもない・・・と書くと、なんだか難しそうで、一筋縄ではいかない気もしますが。
この実装ですと大ポカはあまりないのではないでしょうか。(MultiPV 4のなかから選ぶので)
あ、たぶん誤解させてしまいましたが、ネガティブな意味ではなく、ポジティブな意味で書きました。
対人間の実戦を意識して練習相手にする場合、大ポカとまでは行かずとも、相手の人間がそれなりの悪手を指してくることもあると思うので。
たとえば「違和感のある手を指された」場合、「どうせそれなりの次善手なんだろう」と思って指し手を考えるのと、「ひょっとしてこれは悪手なのでは。咎めるには…」という可能性も考慮して考えるのは、だいぶ違う気もします。
プロ棋士が言うところの、「相手の棋士への信頼」が絶対的すぎると、よくないのかなーと。
まあ、浅いdepthで調べたときのMultiPV 4って、深いdepthだとMultiPV 10にも入ってこないような大悪手も含まれてますので、わりと人間っぽい気はします。
NNUE型しか使って無いんですけど、shogiGUIだとレベル0でも20手くらい思考してしまいます。
もしかして、depthlimitとかも設定すべきですか?
SkillLevel 0でも、探索自体は時間いっぱい使って普通に行われます。
MultiPV 4で探索していることと、それらの指し手が本記事の2.のルールでpickされる点が異なるだけですね。
そうだったんですね。挙動の見た目に惑わされて、記事の内容を見落としてました。
失礼しました
追伸 給料出たんで将棋神買います
> 追伸 給料出たんで将棋神買います
(`・ω・´)b ありがとうございます