Tôi đang cố gắng đưa các bảng Chuyển vị vào trinh sát alpha beta của mình. Tôi thực sự thấy một sự gia tăng tốc độ gia tăng mà tôi nghĩ vào giữa hoặc cuối trò chơi, tuy nhiên, ngay cả với kích thước bảng 1-2 GB, nó có thể hoặc không thể chậm hơn so với việc không đọc từ bảng Transpose. Tôi cũng nhận thấy một số động tác kém hiệu quả hơn nếu tôi chơi cùng một trò chơi mà không có bàn.
Tôi đã thử băm khóa Zobrist của mình và chúng xuất hiện đúng cách ngay cả sau khi thực hiện và hoàn tác các động tác. Tôi không tin họ là vấn đề. Tôi đã cố gắng làm theo lời khuyên của những bài viết này trong việc thiết kế cắt tỉa alpha / beta. http://web.archive.org/web/20070809015843/http://www.seanet.com/~brucemo/topics/hashing.htmlm http://mediocechess.blogspot.com/2007/01/guide-transposeition- bảng.html
Bất cứ ai có thể giúp tôi xác định một sai lầm? Có lẽ tôi không hiểu việc đánh giá kiểm tra alpha vs beta từ hàm băm. Hoặc là 1-2GB quá nhỏ để tạo sự khác biệt? Tôi có thể đăng thêm mã bảng chuyển vị nếu cần.
public int alphaBetaScout(Board board, int depth, int alpha, int beta, bool color, bool
quiscence)
{
// !!!! With or without this specific section, and any other Transpose.Insert, doesn't make the game play or evaluate any faster.
HashType type = HashType.AlphaPrune;
HashEntry h = Transpose.GetInstance().Get(board.zobristKey);
if (h != null)
{
if (h.depth >= depth)
{
if (h.flag == HashType.ExactPrune)
{
return h.scored;
}
if (h.flag == HashType.AlphaPrune)
{
if(h.scoredState > alpha)
{
alpha = h.scored;
}
}
if (h.flag == HashType.BetaPrune)
{
if(h.scoredState < beta)
{
beta = h.scored;
}
}
if (alpha >= beta)
{
return alpha;
}
}
}
if (board.terminal)
{
int scoredState = board.Evaluate(color);
Table.GetInstance().Add(board.zobristKey, depth, Entry.EXACT, scoredState);
return scoredState;
}
//May do Quescience search here if necessary && depth = 0
Stack movesGenerated = GeneratePossibleMoves();
while(!movesGenerated.isEmpty())
{
int scoredState = MAXNEGASCOUT;
board.MakeMove(movesGenerated.pop());
int newAlpha = -(alpha +1)
scoredState = -alphaBetaScout(board, depth - 1, newAlpha, -alpha, !color, quiscence);
if (scoredState < beta && alpha < scoredState)
{
scoredState = -alphaBetaScout(board, depth - 1, -beta, -scoredState, !color, quiscence);
}
board.UndoMove();
if (scoredState >= beta)
{
Table.GetInstance().Add(key, depth, Entry.BETA, beta);
return scoredState;
}
if (scoredState > alpha)
{
type = HashType.ExactPrune;
alpha = scoredState;
}
}
Table.GetInstance().Add(key, depth, type, alpha);
return alpha;
}