es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , , , ,

Answer

  1. Avatar for 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 valores alpha y beta se declaran usando el siguiente código:

    alpha = []
    alpha.append(-999999)
    beta = []
    beta.append(999999)
    

    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 y beta durante la llamada a la función en lugar de depender de un valor predeterminado.

Comments are closed.