これは二重の質問です。Alpha-Beta 検索を実行し、最後に Quiescence 検索を実行する単純なチェス エンジンをまとめました。静止検索がパフォーマンスに影響を与えています。問題は、パフォーマンスへの影響を許容できるかどうかです。そうでない場合、この問題を解決するにはどうすればよいですか?
パフォーマンスへの影響を以下の図に示します。
これらの統計は、ゲームの途中で考慮されたことに注意してください。FEN は次のとおりです。
r3k2r/pb2qpbp/1pn1pnp1/2PpP3/2B2B2/2N2N2/PPPQ1PPP/R3K2R w KQkq - 0 1
静止なし:
- 82,069 ミリ秒 (~82 秒) で 6 プライ
- 5,298 ミリ秒 (~5.3 秒) で 5 プライ
静止あり:
- 83,502 ミリ秒 (~83 秒) で 5 プライ
静止検索を使用して 6 プライの統計を行ったことはありませんが、必要に応じて計算してもかまいません。
注意すべき重要なことは、静止検索を追加することは、余分なプライを検索することと同じであるということです。これは正常ですか?
C# の Alpha-Beta および Quiescence ルーチンを以下に示します。これらは、チェス プログラミング wikiに基づいています。
public static int AlphaBeta(Board board, int alpha, int beta, int depthLeft, int side)
{
if (depthLeft == 0)
{
return Quiescence(board, side, alpha, beta);
}
List<Move> moves = board.GenerateMoves(side);
//nodesCount += moves.Count;
BoardState state;
int score;
int oppositeSide = -1 * side;
for (int i = 0; i < moves.Count; i++)
{
state = board.GetCurrentBoardState();
if (!board.MakeMove(moves[i]))
{
continue;
}
score = -AlphaBeta(board, -beta, -alpha, depthLeft - 1, oppositeSide);
board.RestoreState(state);
if (score >= beta)
{
return beta;
}
if (score > alpha)
{
alpha = score;
}
}
return alpha;
}
静止:
private static int Quiescence(Board board, int side, int alpha, int beta)
{
int standingPat = Evaluation.EvaluateFromPerspectiveOf(board, side);
if (standingPat >= beta)
{
return beta;
}
if (alpha < standingPat)
{
alpha = standingPat;
}
int oppositeSide = -1 * side;
List<Move> moves = board.GenerateMoves(side);
int score;
BoardState state;
for (int i = 0; i < moves.Count; i++)
{
if (!board.IsCaptureMove(moves[i]))
{
continue;
}
//nodesCount++;
state = board.GetCurrentBoardState();
if (!board.MakeMove(moves[i]))
{
continue;
}
score = -Quiescence(board, oppositeSide, -beta, -alpha);
board.RestoreState(state);
if (score >= beta)
{
return beta;
}
if (score > alpha)
{
alpha = score;
}
}
return alpha;
}