Merkwürdiges Verhalten in einer Funktion bei der Implementierung des Alpha-Beta-Bereinigungsalgorithmus

Ich habe einen Minimax-Algorithmus mit Alpha-Beta-Bereinigung implementiert. Um den besten Zug zu bekommen, nenne ich den Alpha-Beta-Algorithmus mit demrootAlphaBeta Funktion. In derrootAlphaBeta Funktion, entdeckte ich ein sehr seltsames Verhalten. Wenn ich die anruferootAlphaBeta Funktion mit einemply von 4 macht es ungefähr 20 000 anrufe, aber wenn ich die anrufealphaBeta funktioniert direkt, es werden nur ca. 2000 anrufe getätigt. Ich kann anscheinend nicht herausfinden, wo das Problem liegt, da die Anzahl der Anrufe gleich sein sollte.

Der Zug, den beide Algorithmen irgendwann finden, sollte der gleiche sein, oder? Ich denke schon, zumindest ist die Punktzahl des Zuges die gleiche, ich habe keine Möglichkeit, den Zug zu kennenalphaBeta wählt wenn ich es direkt ohne anruferootAlphaBeta.

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage