GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

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に変更。これで今日一日様子を見ます。