Comportamento estranho em uma função durante a implementação do algoritmo de remoção de alfa-beta
Eu implementei um algoritmo minimax com poda alfa-beta. A fim de obter o melhor movimento, eu chamo o algoritmo alpha-beta com orootAlphaBeta
função. No entanto, norootAlphaBeta
função, eu vi algum comportamento muito estranho. Quando eu chamo orootAlphaBeta
função com umply
de 4, faz cerca de 20 000 chamadas, mas quando eu chamo oalphaBeta
função diretamente, faz apenas cerca de 2000 chamadas. Não consigo encontrar qual é o problema, pois o número de chamadas deve ser o mesmo.
O movimento que os dois algoritmos eventualmente encontrarem deve ser o mesmo, certo? Acho que sim, pelo menos a pontuação do movimento é a mesma, não tenho como saber o movimento doalphaBeta
escolhe quando eu chamo diretamente semrootAlphaBeta
.
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