Stockfish DD – SEE (Static Exchange Evaluation) 静的駒交換値

前回、positionクラスについて解説しましたが、position.cppのほうにSEE(Static Exchange Evaluation)の実装があります。

SEEは、局面を評価するときに、駒の取り合いが終わっている静かな局面で評価するために考えられた手法で、ある地点での駒の取り合いを指し手生成などをせずに調べます。

金で相手の歩を取れるけど、その直後に相手にその金を取られる(そして取り返せない)のであれば、この金で歩を取るというのはトータルでは駒損をする指し手なので、この選択はありえません。

こういうのを考慮した一本道の探索と言えるでしょう。(その指し手で進めるとトータルで損をするなら、その指し手で進めずにいつでも取り合いを中断する権利を双方が持っている。)

将棋用のSEE、バグなしにきちんと書くのは結構大変で、色々な条件があるため、なかなかユニットテストなどでテストしにくい部分でもあります。

StockfishのSEEの実装はよく練られているものの、将棋では成りがあるので最後、成りを考慮したほうが良いでしょう。王手まわりもきちんと考慮したほうがたぶん良いです。「考慮する」ことで全体の探索速度はやや低下しますが、トータルでは棋力は向上すると私は思っています。

逆にSEEはもっと軽量な実装にすべきだとか、静止探索からSEEを呼び出されるわけですが、SEEを改善するより静止探索をもっと軽量な実装にすべきだとか、逆にSEEをもっと正確(=重い実装?)にして静止探索をもっと軽量にすべきだとか、このへんは将棋ソフト開発者の間でも意見のわかれるところですが、全体的なバランスとの兼ね合いもあって、結論は出そうにありません。

また、KPPのような3駒関係ではなく、手番を考慮したPPPPPのような5駒関係ぐらいの評価関数があれば、駒の取り合いの評価もそこに織り込まれていると考えられるので、SEE自体は不要になるのでしょうけども…。

コメントを残す

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