J'essaie de mettre des tables de transposition dans mon éclaireur alpha bêta. Je vois une augmentation de vitesse incrémentielle, je pense vers le milieu ou la fin du jeu, cependant, même avec une taille de table de 1 à 2 Go, cela peut ou non être plus lent que de ne pas lire du tout de la table Transpose. Je remarque également des mouvements moins qu'efficaces si je devais jouer exactement le même jeu sans les tables.
J'ai testé mon hachage de clé Zobrist, et ils sortent correctement même après avoir effectué et annulé des mouvements. Je ne pense pas que ce soit le problème. J'ai essayé de suivre les conseils de ces articles lors de la conception de l'élagage alpha / bêta. http://web.archive.org/web/20070809015843/http://www.seanet.com/~brucemo/topics/hashing.htm http://mediocrechess.blogspot.com/2007/01/guide-transposition- tables.html
Quelqu'un peut-il m'aider à identifier une erreur? Peut-être que je ne comprends pas l'évaluation de la vérification alpha vs bêta du hachage. Ou est-ce que 1-2 Go est trop petit pour faire la différence? Je peux poster plus de code de table de transposition si besoin est.
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;
}
Réponses:
Le code semble correct à première vue. Je suggérerais de profiler la table de transposition, peut-être que votre implémentation réelle est juste de ralentir le stockage et la récupération des entrées. Ce qui expliquerait également pourquoi vous obtenez de meilleurs mouvements avec les transpositions, bien que vous n'obteniez pas d'avantage de vitesse.
la source
Ne pas insérer dans la table de transposition au nœud feuille.
Alors commentez la commande "Ajouter" dans ce bloc "if (board.terminal)"
la source