Zebra神降臨1

しかし、一方でZebraのノード数には到底及んでいないのだ。となると、Zebraがいったい何をしているのか気になるるる。ということで、Zebra sourceという、禁断の書をひもといてみる。いつから公開されていたんだろうか…。
Zebraのソースはわりと読みやすい*1。100KB超の、一連の”暴挙的ソース”は、NTestの比ではない。この手の”暴挙的ソース”をtemplateで生成させようと妄想したが、妄想だけで終わってしまった。まぁ、いいや。終盤解析ルーチンは、end.cにかかれているようだ。特徴的なのは、

  • (少なくとも終盤では)bitboardのみを使用
  • quad parity*2(ソース中ではregion_parity)を使用
  • 終盤4手展開

目立つのはこんなものか。quad prityを使っているのは、いわゆる偶数理論に対応するもので、かなり早い段階でmove orderingにparityを使っているようである。
さて、主要なmove orderingには古典評価関数を使用しているようだ。具体的には、偶数理論を使ったキラー応手のようなもの、それからweighted mobilityというもの。
気になったのが、weighted mobilityという関数。なんてことはなくて、ふつうのmobilityに加えて4隅に置けるならそれぞれ1ずつ可算するだけ。ソースにして、4行ほど追加するだけですむので、weighted mobilityをmove orderingに据えてFFOしてみたところ…。
ナンダコレハ!!
FFO#40が8.6秒。実に、2秒も高速化。NPSが早くなる理由はない。ノード数は13.6MNodesである。修正前の14.9MNodesよりも枝刈り率が向上したのが原因。と、昔のソースに戻して実行したら、なぜか9.3秒だった。あれ? なんか修正したっけ?
とはいうものの、FFO#41が100秒から52秒。FFO#42も100秒から81秒に高速化。たった4行でこれか…。Zebra神の実力を見せつけられてしまった。parityも実装したら…。

*1:Logistelloと比べよ!

*2:この呼び方はNTest流