1. My Quiescence Search does not make use of Transposition Tables.
2. I call the Evaluate Function at every node.
My question(s) is how do I implement Transposition Tables for Quiescence Search? Is it the same as regular search? Do I create a separate Table for Quiescence so it does not pollute the main table? I am guessing it has to be different because can you really have exact entries?
I have included my code below, please help:
Code: Select all
private static int Quiescence(Board examineBoard, int alpha, int beta, ref int nodesSearched)
{
nodesSearched++;
//Evaluate Score
Evaluation.EvaluateBoardScore(examineBoard);
//Invert Score to support Negamax
examineBoard.Score = SideToMoveScore(examineBoard.Score, examineBoard.WhoseMove);
if (examineBoard.Score >= beta)
return beta;
if (examineBoard.Score > alpha)
alpha = examineBoard.Score;
List<Position> positions;
if (examineBoard.WhiteCheck || examineBoard.BlackCheck)
{
positions = EvaluateMoves(examineBoard, 0);
}
else
{
positions = EvaluateMovesQ(examineBoard);
}
if (positions.Count == 0)
{
return examineBoard.Score;
}
positions.Sort(Sort);
foreach (Position move in positions)
{
//Make a copy
Board board = examineBoard.FastCopy();
//Move Piece
Board.MovePiece(board, move.SrcPosition, move.DstPosition, ChessPieceType.Queen);
//We Generate Valid Moves for Board
PieceValidMoves.GenerateValidMoves(board);
if (board.BlackCheck)
{
if (examineBoard.WhoseMove == ChessPieceColor.Black)
{
//Invalid Move
continue;
}
}
if (board.WhiteCheck)
{
if (examineBoard.WhoseMove == ChessPieceColor.White)
{
//Invalid Move
continue;
}
}
int value = -Quiescence(board, - beta, -alpha, ref nodesSearched);
if (value >= beta)
{
KillerMove[2, 0].SrcPosition = move.SrcPosition;
KillerMove[2, 0].DstPosition = move.DstPosition;
return beta;
}
if (value > alpha)
{
alpha = value;
}
}
return alpha;
}