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