Comportamiento extraño en una función al implementar el algoritmo de poda alfa-beta
He implementado un algoritmo minimax con poda alfa-beta. Para obtener el mejor movimiento, llamo el algoritmo alfa-beta con elrootAlphaBeta
función. Sin embargo, en elrootAlphaBeta
Función, vi un comportamiento muy extraño. Cuando llamo alrootAlphaBeta
funcionar con unply
de 4, hace aproximadamente 20 000 llamadas, pero cuando llamo alalphaBeta
Funciona directamente, hace solo unas 2000 llamadas. Parece que no puedo encontrar cuál es el problema, ya que el número de llamadas debería ser el mismo.
El movimiento que ambos algoritmos encuentren eventualmente debería ser el mismo, ¿verdad? Creo que sí, al menos la puntuación del movimiento es la misma, no tengo forma de saber el movimiento delalphaBeta
elige cuando lo llamo directamente sinrootAlphaBeta
.
def alphaBeta(self, board, rules, alpha, beta, ply, player):
"""Implements a minimax algorithm with alpha-beta pruning."""
if ply == 0:
return self.positionEvaluation(board, rules, player)
move_list = board.generateMoves(rules, player)
for move in move_list:
board.makeMove(move, player)
current_eval = -self.alphaBeta(board, rules, -beta, -alpha, ply - 1,
board.getOtherPlayer(player))
board.unmakeMove(move, player)
if current_eval >= beta:
return beta
if current_eval > alpha:
alpha = current_eval
return alpha
def rootAlphaBeta(self, board, rules, ply, player):
"""Makes a call to the alphaBeta function. Returns the optimal move for a
player at given ply."""
best_move = None
max_eval = float('-infinity')
move_list = board.generateMoves(rules, player)
for move in move_list:
board.makeMove(move, player)
current_eval = -self.alphaBeta(board, rules, float('-infinity'),
float('infinity'), ply - 1,
board.getOtherPlayer(player))
board.unmakeMove(move, player)
if current_eval > max_eval:
max_eval = current_eval
best_move = move
return best_move