Blunderのハッシュでwindowを狭める処理
LowerとUpperの部分は通常ですが、
どっちも該当しない場合にWindowを狭めている。
if (depth <= trans.Depth) { if (beta <= trans.Lower) { context.Local.HCSuccess[0]++; SetLeafTransMove(context, trans.BestMove); return trans.Lower; // cut off } if (trans.Upper <= alpha) { context.Local.HCSuccess[1]++; SetLeafTransMove(context, trans.BestMove); return trans.Upper; // cut off } //αβの範囲を狭める alpha = Math.Max(trans.Lower, alpha); beta = Math.Min(trans.Upper, beta); Debug.Assert(alpha < beta);
これって、昔、Java版のGA将!さんのライブラリをを読んでたらやってて、
ブログに書いたんですよ。
で、実際にやってみたら、どうもおかしくて、
GA勝!さんはMTDだから上手く行ってるのかも?って書いてたかな。
たしかマイムーブ西村さんも「ハッシュにはまだまだ知らない世界がある」って驚かれてて、
http://chocobo.yasuda-u.ac.jp/~nisimura/mymove/index.cgi?no=388
alpha と beta の値をハッシュに保存した評価値で狭くする手法は、ちょっと試してみたのですが上手くいきませんでした。
(アベントというのは昔のGA将!さんの名前)
でもやってみると有効じゃなかったんですが、
Blunderで上手く行ってるなら凄いと思う。
asser(alpha < beta)
ですけど、これってalpha==betaになる場合が出てこないですか?
って思って、置換表のストア部分を見ると、Exactlyで[value,value]にしてないみたいで、
それなら一致しないですね。このへんもあって上手く行ってるのかなあ?
逆にBona4は、
case value_lower: if ( value_hash >= beta ) { HASH_VALUE = value_hash; ptree->ntrans_lower++; return value_lower; } break; case value_upper: if ( value_hash <= alpha ) { HASH_VALUE = value_hash; ptree->ntrans_upper++; return value_upper; } break; case value_exact: HASH_VALUE = value_hash; ptree->ntrans_exact++; return value_exact; }
windowを狭めるどころか、return value_exactしちゃってて、これが上手く行くならいいと思うんですが、
コンピュータ将棋ではハッシュのexactは捨てるってのが今までは定跡とおもったんですけど、
できればこれを活用したいな〜