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

Respuestas a la pregunta(1)

Su respuesta a la pregunta