2011/02/04
■ 探索時間管理の設計
深く読めるようになると探索時間管理が必須だが、このテーマは情報が少ない。コンピューター将棋の進歩5のYSSの改良点が詳しいぐらいか。
簡単なのは、ある時間が経過したら、次のIterationを実行しないというもの。さすがにそれでは荒っぽい。
ほとんどは探索中に時間を計算して打ち切り判定をするタイプ(GNU Shogi,Craftyなど)と、別スレッドで時間をポーリングして、探索打ち切りフラグを立てるタイプ(glaurung)であろう。探索の末端で時間計算ルーチンを呼ぶのは重いような気がするのと、将来、並列探索にしたときの見通しのよさで、別スレッドポーリング方式とする。
選手権は切れ負けルールなので、時間配分の調整も必要だ。深く読む/読まないを判断しないといけない。
・(参考)glaurungの探索打ち切り条件 (search.cpp)
・Iteration 内の判定 Iteration >= 6 で合法手が1手しかない Iteration >= 6 でスコアがIteration連続で詰みに達したとき Iteration >= 8 で最善手がEasyMoveで探索ノード数が全ノードの85%で探索時間が1手時間の1/16か,探索ノード数が全ノードの98%で探索時間が1手時間の1/32 Iteration >= 5 でExtraSearchTimeの計算をして、 ExtraSearchTime=BestMoveChangesByIteration[Iteration]*(MaxSearchTime/2) +BestMoveChangesByIteration[Iteration-1]*(MaxSearchTime/3); 探索時間が ((MaxSearchTime+ExtraSearchTime)*80)/128 =(MaxSearchTime+ExtraSearchTime)の62.5%以上なら BestMoveChangesByIterationは最善手が変化した履歴 ・poll() ポーリングルーチン Iteration >= 2 で ( t > AbsoluteMaxSearchTime || (RootMoveNumber == 1 && t > MaxSearchTime + ExtraSearchTime) || (!FailHigh && !fail_high_ply_1() && !Problem && t > 6*(MaxSearchTime + ExtraSearchTime))))) AbortSearch = true; MaxSearchTimeは持ち時間の1/40=1手当たりの持ち時間 AbsoluteMaxSearchTimeは持ち時間の1/8 EasyMoveの判定 2手目以降にEasyMoveMargin以上の手が無ければ1手目を返す