オーダリング

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];
}
ここまで