Estoy tratando de poner tablas de transposición en mi explorador alfa beta. Veo un aumento de velocidad incremental, creo que hacia el juego medio o tardío, sin embargo, incluso con un tamaño de mesa de 1-2 GB, puede o no ser más lento que simplemente no leer en absoluto la tabla Transponer. También estoy notando algunos movimientos menos que eficientes si tuviera que jugar exactamente el mismo juego sin las mesas.
Probé el hashing de mi clave Zobrist, y salen correctamente incluso después de hacer y deshacer movimientos. No creo que sean el problema. Traté de seguir los consejos de estos artículos al diseñar la poda alfa / beta. http://web.archive.org/web/20070809015843/http://www.seanet.com/~brucemo/topics/hashing.htm http://mediocrechess.blogspot.com/2007/01/guide-transposition- tables.html
¿Alguien puede ayudarme a identificar un error? Quizás no entiendo la evaluación de verificar alfa vs beta desde el hash. ¿O es 1-2GB demasiado pequeño para hacer la diferencia? Puedo publicar más del código de la tabla de transposición si es necesario.
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;
}
Respuestas:
El código parece estar bien a primera vista. Sugeriría perfilar la tabla de transposición, tal vez su implementación real sea lenta para almacenar y recuperar las entradas. Lo que también explicaría por qué obtienes mejores movimientos con transposiciones, aunque no obtienes un beneficio de velocidad.
fuente
No inserte en la tabla de transposición en el nodo hoja.
Así que comente el comando "Agregar" en este bloque "if (board.terminal)"
fuente