Pasando enteros para el algoritmo minimax en Python.
Implementé el siguiente algoritmo minimax para el juego Reversi en GamePigeon en python:
def minimaxabp(depth, max_player, game, move, alpha, beta):
if depth == 0 or game.gameOver:
return game.calcScore()
if (max_player):
moves = game.getValidMoves()
bestMove = [-1, -1]
bestScore = -99999
for m in moves:
ga = deepcopy(game)
ga.doTurn(m[0], m[1])
score = minimaxabp(depth - 1, not max_player, ga, move, alpha, beta)
if score > bestScore:
bestMove[0] = m[0]
bestMove[1] = m[1]
bestScore = score
alpha[0] = max(alpha[0], bestScore)
if beta[0] <= alpha[0]:
break
move[0] = bestMove[0]
move[1] = bestMove[1]
return bestScore
else:
moves = game.getValidMoves()
bestMove = [-1, -1]
bestScore = 99999
for m in moves:
ga = deepcopy(game)
ga.doTurn(m[0], m[1])
score = minimaxabp(depth - 1, not max_player, ga, move, alpha, beta)
if score < bestScore:
bestMove[0] = m[0]
bestMove[1] = m[1]
bestScore = score
beta[0] = min(beta[0], bestScore)
if beta[0] <= alpha[0]:
break
move[0] = bestMove[0]
move[1] = bestMove[1]
return bestScore
El algoritmo funciona correctamente si comento las dos partes que dicen:
if beta[0] <= alpha[0]:
break
lo cual lo convierte en un algoritmo minimax normal. Debido a que Python no permite pasar enteros como referencias en lugar de valores, utilicé un entero de longitud uno en su lugar. La implementación de poda alfa-beta se ve exactamente igual que todos los ejemplos que puedo encontrar, por lo que supongo que debe haber un problema con los parámetros que se pasan entre sí. Por si sirve de algo, alpha y beta se declaran de la siguiente manera:
alpha = []
alpha.append(-999999)
beta = []
beta.append(999999)
davy.ai
P: ¿Cuál es el problema con la implementación de la poda alfa-beta en el algoritmo minimax para el juego Reversi de GamePigeon en Python?
El algoritmo minimax dado para el juego Reversi de GamePigeon en Python funciona bien cuando se comentan las dos partes que dicen
if beta[0] <= alpha[0]: break
, convirtiéndolo así en un algoritmo minimax normal. Parece que el problema radica en la forma en que se pasan los parámetros en la función. Dado que Python no permite pasar enteros como referencias en lugar de valores, el autor ha utilizado un entero de longitud uno en su lugar. La implementación de la poda alfa-beta dada en el código parece correcta y similar a todos los demás ejemplos disponibles, por lo que es probable que el problema esté en el paso de parámetros. Los valoresalpha
ybeta
se declaran usando el siguiente código:Cabe destacar que el uso de un objeto mutable como una lista como valor de parámetro predeterminado puede llevar a un comportamiento inesperado, y generalmente se recomienda evitar hacerlo. Es mejor pasar explícitamente los valores
alpha
ybeta
durante la llamada a la función en lugar de depender de un valor predeterminado.