這是一個雙重問題。我已經把一個簡單的國際象棋引擎放在一起,它執行Alpha-Beta搜索,最後是靜止搜索。靜止搜索正在影響性能。問題是,這是一個可接受的性能影響?如果不是,那麼應該如何解決這個問題呢?搜索性能問題
性能影響如下圖所示。
請注意,這些統計數據是在遊戲中考慮的。所述FEN是:
r3k2r/pb2qpbp/1pn1pnp1/2PpP3/2B2B2/2N2N2/PPPQ1PPP/R3K2R瓦特KQkq - 0 1
沒有虛靜:
- 6層片在82,069 ms(〜82秒)
- 5層在5,298毫秒(〜5.3秒)
隨着虛靜:
- 5層在83502毫秒(〜83秒)
我沒有做過使用靜止搜索6層的統計信息,但不會介意計算如果需要的話。
要注意的關鍵是添加靜止搜索等同於搜索一個額外的層。這是正常的嗎?
下面列出了C#中的Alpha-Beta和Quiescence例程。它們基於chess programming 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;
}
非常感謝。我確實使用Quiescence的相同移動生成器。關於搜索時間,沒有移動排序,但我希望我正確使用beta截止。如果我將上述代碼附加到上述問題中,請介紹一下我的Alpha-Beta搜索例程? – bytefire
性能改進可以通過移動訂購帶來Alpha-Beta搜索例程的多少? – bytefire
當然,代碼越多越好。至於移動排序 - 隨着線路被提前修剪,它可以顯着提高性能。通過移動排序我的意思不僅是移動生成器中的移動排序,而且主要是'殺手移動'和'移動歷史'啓發式,他們幫助很大。附加代碼 – Inspired