Dziwne zachowanie funkcji podczas implementacji algorytmu czyszczenia alfa-beta

Zaimplementowałem algorytm minimax z przycinaniem alfa-beta. Aby uzyskać najlepszy ruch, nazywam algorytm alfa-beta za pomocąrootAlphaBeta funkcjonować. Jednak wrootAlphaBeta funkcja, zauważyłem bardzo dziwne zachowanie. Kiedy zadzwonię dorootAlphaBeta funkcja za pomocąply z 4, wykonuje około 20 000 połączeń, ale kiedy dzwonięalphaBeta działa bezpośrednio, wykonuje tylko około 2000 połączeń. Nie mogę znaleźć problemu, ponieważ liczba połączeń powinna być taka sama.

Ruch, który ostatecznie znajdą oba algorytmy, powinien być taki sam, prawda? Myślę, że przynajmniej wynik ruchu jest taki sam, nie mam możliwości poznania ruchualphaBeta wybiera, kiedy nazywam to bezpośrednio bezrootAlphaBeta.

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

questionAnswers(1)

yourAnswerToTheQuestion