LMRパラメータの乱数化を変更
今現在、LMRで短縮する深さを計算するルーチンは下記の様になっていて、"lmrなんちゃら"というパラメータ5個を乱数で初期化しています。
double AlphaBetaSearcher2::calcLmrOffset( const size_t depth, // 探索深さ const size_t rank, // 先頭から何番目の手か const Move move // 指し手の情報 ) { // 深さが一定未満なら短縮しない if( depth < this->lmrDepthLimit ) return 0.0; // 先頭の方の手は短縮しない if( rank <= this->lmrRankLimit1st ) return 0.0; // 成る手・取る手・王手は短縮しない if( move.isPromotion() ) return 0.0; if( ! isEmpty( move.getCaptureInfo() ) ) return 0.0; if( this->position->isChecked() ) return 0.0; // 最初は控えめに短縮、その後は更に大きく短縮 return ( rank <= this->lmrRankLimit2nd ) ? this->lmrOffset1st : this->lmrOffset2nd; }// calcLmrOffset(...)
初期化コードはこんな感じ。double nextDouble( double x1, double x2 )関数はx1以上x2以下の乱数を生成する関数です。
// LMRのパラメータを乱数で初期化 this->lmrDepthLimit = static_cast<int>( this->rand.nextDouble( 0.0, 4.0 ) ); this->lmrRankLimit1st = static_cast<int>( this->rand.nextDouble( 0.0, 6.0 ) ); this->lmrRankLimit2nd = static_cast<int>( this->rand.nextDouble( this->lmrRankLimit1st, 20.0 ) ); this->lmrOffset1st = this->rand.nextDouble( 0.5, 1.5 ); this->lmrOffset2nd = this->rand.nextDouble( this->lmrOffset1st, 3.0 );
んで、ここの初期化が適当すぎるので効果があまり無いかと思い、ちょっとずつ修正していこうと思います。
とりあえず、lmrRankLimit2ndを8.0〜15.0に変更。これで今日一日様子を見ます。