オーダリング
Bonanzaとかの紹介のスライドとかで書いてあったオーダリングで
ハッシュの手ってのがいままでよくわからなかったけどfruitのソース見たら
あったw
http://chocobo.yasuda-u.ac.jp/~nisimura/mymove/index.cgi?no=361
によるとオーダリングの並び替えは定説化されているらしい.
けど
αβ探索における探索順序の自動学習
小幡 拓弥 伊藤 毅志
情報処理学会研究報告. GI, [ゲーム情報学] 2009(27), 49-54,
によるとオーダリングも学習した方がいいっぽい.
とりあえずハッシュの手を優先するようにしてみよう.あとkiller moveとか
historyなんちゃらもいれないと....
以下fruitのソースより
search_full.cppのところ
// transposition table
trans_move = MoveNone;
if (UseTrans && depth >= TransDepth) {
if (trans_retrieve(Trans,board->key,&trans_move,&trans_min_depth,&trans_max_depth,&trans_min_value,&trans_max_value)) {
// trans_move is now updated
if (node_type != NodePV) {
if (UseMateValues) {
if (trans_min_value > +ValueEvalInf && trans_min_depth < depth) {
trans_min_depth = depth;
}
if (trans_max_value < -ValueEvalInf && trans_max_depth < depth) {
trans_max_depth = depth;
}
}
min_value = -ValueInf;
if (DEPTH_MATCH(trans_min_depth,depth)) {
min_value = value_from_trans(trans_min_value,height);
if (min_value >= beta) return min_value;
}
max_value = +ValueInf;
if (DEPTH_MATCH(trans_max_depth,depth)) {
max_value = value_from_trans(trans_max_value,height);
if (max_value <= alpha) return max_value;
}
if (min_value == max_value) return min_value; // exact match
}
}
}
ここまでがハッシュの手を探すところ
ここからハッシュで手が手に入らないときの多重反復深化
if (UseIID && depth >= IIDDepth && node_type == NodePV && trans_move == MoveNone) {
new_depth = depth - IIDReduction;
ASSERT(new_depth>0);
value = full_search(board,alpha,beta,new_depth,height,new_pv,node_type);
if (value <= alpha) value = full_search(board,-ValueInf,beta,new_depth,height,new_pv,node_type);
trans_move = new_pv[0];
}
ここまで