手生成の逐次化
素のれさぴょんは、生成可能な手を全部生成し・それを並べ替えた上で順に探索するようになっている。並べ替えの際は、現在の局面と一手先の局面の評価値の差の計算と、その手が良さそうな手かどうかの補正計算が行われる。これがめちゃくちゃ重たい。素のままだとかなりの計算量がここで消費される。いや、Moveも遅いんだけどさ (Evaluate, EvaluateTe の呼び出し回数が多いのはそのせい)
しかも、ほとんどの手は読まずに捨てられるので、もったいないことおびただしい。
そこで sakurapyon では、逐次生成をするようにした。逐次生成したのはいいけど、バグが入り込んでめちゃくちゃ弱くなっていた。変な手を指しても枝刈りで消えてしまうことが多いのでなかなか発覚しない。
(そこまで考えて、あえて簡単な方法で生成してるんだろうなあ、れさぴょん)
生成の順序はYSS 7.0の技術解説の順序を参考にしてみた。今は下記の順に生成している。生成後、簡単な並べ替えをしている(大駒から動かすとか、玉に近いところから動かすとか)。
- 王手回避
- 局面キャッシュから2手(れさぴょんと同じ)
- 直前に打たれた・動かされた駒を取る
- 只駒取る
- 駒を取る
- 手筋(角桂頭に歩、桂馬の両取り、割り打ちなど)
- 相手キラー手を邪魔
- 王手
- とられそうな駒を逃げる
- 玉早逃げ
- 成る
- 敵陣に大駒を打つ
- とられそうな駒に利きを追加
- 全て (れさぴょんと同じ)
大きな効果があるのは、直前の駒取りと只駒取り。れさぴょんの MakeMoveFirst にこの2つを仕込むだけでもかなり早くなると思う。