私は先月 C# で単純なチェス エンジンを作成しており、いくつかの素晴らしい進歩を遂げました。単純なアルファ ベータ アルゴリズムを使用しています。
Horizon-Effect を修正するために、Quiescence Search を実装しようとしました (機能するまでに数回失敗しました)。エンジンの力強さはそれで少し静かになったようですが、ものすごい遅い!
以前は、約 160 秒 (ゲーム中の状態のどこか) で 6 層の深さまで探索できましたが、静止探索では、コンピューターが探索深度 3 で移動するのに約 80 秒かかりました!
ブルート フォース ノード カウンターは深さ 3 で約 20000 ノードですが、静止ノード カウンターは最大 2000 万です!
これは私の最初のチェス エンジンなので、これらの数値が正常なのか、それとも静止アルゴリズムでミスを犯したのか、よくわかりません。より経験豊富な方が、BF ノードと静止ノードの通常の比率を教えていただければ幸いです。
ところで、ちょっと見てみましょう: (このメソッドは、searchdepth が 0 のときはいつでも BF ツリーによって呼び出されます)
public static int QuiescentValue(chessBoard Board, int Alpha, int Beta)
{
QuiescentNodes++;
int MinMax = Board.WhoseMove; // 1 = maximierend, -1 = minimierend
int Counter = 0;
int maxCount;
int tempValue = 0;
int currentAlpha = Alpha;
int currentBeta = Beta;
int QuietWorth = chEvaluation.Evaluate(Board);
if(MinMax == 1) //Max
{
if (QuietWorth >= currentBeta)
return currentBeta;
if (QuietWorth > currentAlpha)
currentAlpha = QuietWorth;
}
else //Min
{
if (QuietWorth <= currentAlpha)
return currentAlpha;
if (QuietWorth < currentBeta)
currentBeta = QuietWorth;
}
List<chMove> HitMoves = GetAllHitMoves(Board);
maxCount = HitMoves.Count;
if(maxCount == 0)
return chEvaluation.Evaluate(Board);
chessBoard tempBoard;
while (Counter < maxCount)
{
tempBoard = new chessBoard(Board);
tempBoard.Move(HitMoves[Counter]);
tempValue = QuiescentValue(tempBoard, currentAlpha, currentBeta);
if (MinMax == 1) //maximierend
{
if (tempValue >= currentBeta)
{
return currentBeta;
}
if (tempValue > currentAlpha)
{
currentAlpha = tempValue;
}
}
else //minimierend
{
if (tempValue <= currentAlpha)
{
return currentAlpha;
}
if (tempValue < currentBeta)
{
currentBeta = tempValue;
}
}
Counter++;
}
if (MinMax == 1)
return currentAlpha;
else
return currentBeta;
}