SEEの高速化について

私は最近何をしているかと言うと…正直、あまりコンピューター将棋の開発はやっていないのですが、まあビールを飲みながらテレビで野球観戦をするような程度の軽いノリでソースコードをいじくりまわして、ああだこうだ言いながら鑑賞(?)するのが趣味です。


最近のマイブームは、Bitboardで利きを計算するコードについての研究でして、どうもうまくやれば、Bitboardでやる利きの計算は非常に軽くて済み、これを利用した評価関数や、SEE(Static Exchange Evaluation : 駒の取り合いの静的な評価)の高速化など、さまざまな恩恵があるようです。


例えば、生成したすべての指し手に対してオーダリングのためにSEEの値を計算するコストって結構馬鹿にならないのですが、
1) 敵の利きのないところへの移動・駒打ちはSEEの値 = 0 なので、利きのBitboardがあれば指し手生成のときに
・gen_drop_SEEisZero
・gen_drop_SEEisNotZero
のようにして指し手生成関数を分離たりして、高速化を図ることができます。
2) 類似局面のSEE値の計算を簡略化。
これについては解説が長くなるので別の機会にでも。


どうも、指し手のオーダリングのためのSEEの計算は、うまくやれば10倍ぐらい速くなりそうです。特にモンテカルロ型のコンピューター将棋では、SEEオーダリングのコストが馬鹿にならないので、この部分が高速化できればplay outの回数が劇的に増やせ、レーティングを押し上げることが出来るのではないかと思っています。