【问题标题】:TypeError when working on a Minimax algorithm with tuples and floats使用元组和浮点数处理 Minimax 算法时出现 TypeError
【发布时间】:2020-11-02 20:07:46
【问题描述】:

我目前正在做一个项目,我需要实现一个 Minimax 算法来创建一个井字游戏。在某些时候,我正在比较元组和浮点数,虽然我知道这实际上无法完成,但我不知道这个问题来自哪里或如何解决它。如果有人能帮助我理解那将是惊人的。谢谢!

这是我的代码

import copy

X = "X"
O = "O"
EMPTY = None


def initial_state():
    """
    Returns starting state of the board.
    """
    return [[EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY]]


def player(board):
    Xboard_count = board[0].count(X) + board[1].count(X) + board[2].count(X)
    if Xboard_count % 2 == 1:
        return 0
    else:
        return X



def actions(board):
    """
    Returns set of all possible actions (i, j) available on the board.
    """
    move = []
    for i in range(3):
        for j in range(3):
            if board[i][j] == EMPTY:
                move.append((i, j))

    return move


def result(board, move):
    """
    Returns the board that results from making move (i, j) on the board.
    """
    if move not in actions(board):
        raise Exception("this action is not a valid action")

    dcopb = copy.deepcopy(board)
    dcopb[move[0]][move[1]] = player(board)

    return dcopb


def winner(board):
    """
    Returns the winner of the game, if there is one.
    """
    for x in range(3):
        if board[x][0] == board[x][1] == board[x][2] != EMPTY:
            return board[x][0]
    for y in range(3):
        if board[0][y] == board[1][y] == board[2][y] != EMPTY:
            return board[0][y]
    if board[0][0] == board[1][1] == board[2][2] != EMPTY:
        return board[0][0]
    if board[2][0] == board[1][1] == board[0][2] != EMPTY:
        return board[2][0]
    else:
        return None


def terminal(board):
    """
    Returns True if game is over, False otherwise.
    """
    if winner(board) == X:
        return True
    elif winner(board) == O:
        return True

    for x in range(3):
        for y in range(3):
            if board[x][y] is None:
                return False
    return True
    ('si winner est égal à X :\n'
     '            return True\n'
     '        si winner est égal à 0\n'
     '            return true \n'
     '            \n'
     '        si le nombre de cases vides == 0\n'
     '            return true\n'
     '        else:\n'
     '            return false')


def utility(board):
    """
    Returns 1 if X has won the game, -1 if O has won, 0 otherwise.
    """
    if winner(board) == X:
        return 1
    if winner(board) == 0:
        return -1
    else:
        return 0


def minimax(board):
    """
    Returns the optimal action for the current player on the board.
    """
    if terminal(board):
        return None

    if player(board) == X:
        v = v = float('-inf')
        for move in actions(board):
            temp = MinValue(result(board, move))
            if temp > v:
                v = temp
                best = move
    else:
        v = float('inf')
        for move in actions(board):
            temp = MaxValue(result(board, move))
            if temp < v:
                v = temp
                best = move
    return best
    

def MaxValue(board):
    if terminal(board):
        return utility(board), None

    v = float('-inf')
    for move in actions(board):
        v = max(v, MinValue(result(board, move)))
    return


def MinValue(board):
    if terminal(board):
        return utility(board), None

    v = float('inf')

    for move in actions(board):
        v = min(v, MaxValue(result(board, move)))
    return v

我得到了这个确切的错误信息

TypeError: '>' 在 'tuple' 和 'float' 的实例之间不支持

【问题讨论】:

  • 您应该会收到带有该错误消息的堆栈跟踪,该堆栈跟踪应该会告诉您问题出在哪里。

标签: python artificial-intelligence tic-tac-toe minimax


【解决方案1】:

您在MinValue 中的return utility(board), None 返回一个元组。所以当你在temp = MinValue(result(board, move))调用函数时,如果调用了return语句,temp就是一个元组

v 是一个浮点数。现在,当您尝试将其与if temp &lt; v:temp 进行比较时,您是在将浮点数与元组进行比较

【讨论】:

  • 谢谢,我已经弄清楚了,但是现在我用 NoneType 而不是元组得到了这个错误,就像这个文件“/home/mrnb/Search//tictactoe.py”,行145,在 MinValue v = min(v, value) TypeError: '
  • 您的函数必须返回 None 而不是数字。尝试打印返回值
【解决方案2】:

首先,MinValue 和 MaxValue 函数存在问题,它们有时会返回两个值而不是一个。

然后,出现了同样的 TypeError,这次在比较 NoneType 变量和浮点数时出现问题。原来只是一个小错误,因为我的 MaxValue 函数没有返回任何内容。

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2022-01-14
    • 2019-05-15
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多