2015/3/30 V0.1 R8アピール文書 1. 構成 探索ルーチン: アルゴリズム: MTD(f)×反復深化、探索の進捗次第で条件を変えてリトライ Fail-Hard/Soft: Fail-Soft オーダリング: 浅い探索結果で並べ替え その他: Killer-move有り。 オーダリング中にCut-offできそうな手を見つけたらScoutして確認、肯定ならCut-off。 先端で静止探索実施。 置換表: Depth-preferred Lock-free 最善手記録有り 予測読み(相手手番中の探索): 有り 時間制御: 反復深化のIteration1回の時間の統計を深さ毎にとり、 平均値が目標時刻を越えるとき中断する。 序盤の処理: 対戦プログラムは、勝った側の手番について (局面, 指した手) をファイルに出力する。 ある程度データが溜まったら、次のデータに変換する。 (観測された回数, 局面, 指した手) これはこれで蓄積するとして、 さらに、観測された回数が閾値N未満のパターンを捨てたファイルXを作成する。 対戦プログラムは起動時にファイルXを読み込み、局面xで最も多く指された手を指す 局面xがファイルXに無ければ序盤の終わりとして通常思考を開始する。 2. 工夫した点 MTD(f)は実は並列探索向きなのではないか、と思いMTD(f)にしました。(←ちょう思いつき MTD(f)の成否は置換表の安定度に依存するので置換表の実現に気を使いました。 置換表はDepth-Preferredしか知らないのでDepth-Preferredとしました。 Depth-Preferredな置換表はデータが溜まるにつれて答えが変わっていくため しばしばミニマックス値の予想存在範囲[lower, upper]が最新の探索結果を外すことがあります。 そのとき探索開始時の[α, β)との関係に基づく場合分けで、極力予想存在範囲を狭く保つようにしました。 千日手等、履歴に依存して評価値が変わるケースの置換表での扱いについては、 履歴別にハッシュ値が分かれるように工夫してしのぎました。 (このしくみを働かせる必要から、ノード毎に初手からの局面の出現回数を常に計算しています。) 以上の対策を行った上で、Depth-preferrdな置換表のテストを、 置換表に登録された「先端までの深さ」のみを参照するテスト用探索ルーチンとの結果の比較で行いました。 MTD(f)は教科書どおりに作ると正解にたどり着くのが非常に遅くなることがしばしばあるので 多少なりとも高速化するために探索ルーチンをFail-softとしました。 また、探索ルーチンで挙動の統計をとり、探索が行き詰っているようならNull-windowの位置をずらして リトライさせるようにしました。 静止探索にも置換表を適用(かわりにFutilityマージン無し)を検討中。 静止探索は(決められた先端でなく)展開中のノードの評価値でCut-offするか随時決めるという点が 普通の置換表とちがって味わい深い気がします。 なんかヒット率低そうな予感… 以上