bonanzaの反復回数の謎

凄いですね。
NHKの番組を見ていると、4分46秒で12億ノードの探索。
19回反復進化が進んでて、取り合い延長6回で都合三手延長で、最善応手列は19+3の22手先読み。
npsは400万ノード・秒、1coreあたり約50万ノード。
判ったのが、bonaの探索ノード数は、静止探索は含んでませんね。
12億を286秒で割るとだいたい400万npsになります。静止探索も10億ぐらいしてるので入れると倍近くなる。


ということで、自分はnpsは静止探索を入れて計算していたので、実際は序盤ですら20万ノードしか出てませんでした……
(中盤から終盤にかけては10万ノード・秒に落ちる( ´Д`)


あと探索効率を見てみると、12億で19回というのは、
およそ3の19乗です(3^19=1162261467)
ということは、bonanzaは3^nのオーダーで探索してることになります。
保木さんがGPWのスライドで、
将棋の平均指し手は80と仮定した上で、探索効率を


minmax:将棋空間=80^n
minmax+beta cut+nullMove+hashCut:(1/4 * SQRT(80) )^n = (2.23)^n


という式で表現しています。
futilityCutはあまりたいしたことがなくて、


minmax+beta cut+nullMove+hashCut+Fcut:1/4 * (1/4 * SQRT(80) )^n = 1/4 * (2.23)^n
n乗オーダーを変えるまでの力はないようです(全体を4分の一にする程度)
nullmoveは探索木が浅いところからカットできますが、
Fcutはあくまで終端の近くだけ狩るだけなので、それもそうかと思います。


で、結論として将棋は限りになる2^nオーダーに近いということですよ(・∀・)
しかし、現実はオーダリングの不備などもあり、
序盤3^n、終盤5^n程度と、スライドにはある。


で、実際のbonaは3^nで探索していた(あの場面は互いにあまり持ち駒も無く駒当たりも無かったので)
12億で反復進化19回ってことは、
100万で13回回る計算になります。これは効率が良い。1coreでも50万npsですから、1coreでも2秒で13手読める。


自分の開発中の将棋ソフトは、序盤は20万npsで30秒で600万ノード読めますが、
そのときで反復進化は12回しか回らない。
3^nオーダーなら、14回回るはずなのに……2回も少ない。
これはnpsは関係が無くて、探索ノード数に対する反復回数によります。
計算してみると、4^nオーダーだと12手読むのに1677万ノード。さすがにここまでひどくない。
ということで、4^nまで行かないまでも3^nにはほど遠い効率になってるようです。


しかし、nullmoveCutも70%台ですし、hashMoveCutも90%以上あります。
たとえnpsが低くても反復回数/探索ノード数には関係ありません。


ということは、スライドにもある静止探索やオーダリングの不備による効率低下か、
バグが残っているということだろうと思います( ´Д`)