递归极小极大函数返回None而不是最优分数

我正在开发一个可以玩井字游戏的极小极大算法,但不知为何,max_value和min_value函数偶尔会返回None。

def player(board):    if Terminal(board) != False:        return None    else:        if turn(board) == "X":            value,move = max_value(board)            return move        else:            value,move = min_value(board)            return move        def max_value(board):    if Terminal(board) != False:        return Utility(board),None    else:        v = -1000        move = None        for action in Actions(board):            aux,act = min_value(Result(board,action))            print(aux)            if aux > v:                v = aux                move = action                if v == 1:                    return v,move        return v,movedef min_value(board):    if Terminal(board) != False:        return Utility(board),None    else:        v = 1000        move = None        for action in Actions(board):            aux,act = max_value(Result(board,action))            print(aux)            if aux < v:                v = aux                move = action                if v == -1:                    return v,move        return v,move

Terminal函数返回游戏状态,Action函数返回可能的移动,Result函数根据给定的动作创建棋盘。

我得到的错误是'>' not supported between instances of 'NoneType' and 'int',这个错误出现在if aux < v:if aux > v:处。当我打印aux时,它偶尔会显示为None。谢谢。


回答:

你分享的代码是正确的。

错误信息表明Utility在调用时返回了None。这不应该发生。Utility在游戏结束时应该始终返回一个整数,根据你的代码,它应该返回-1、0或1。

还有一种可能性是Utility在游戏未结束时返回None,但Terminal存在错误,即使游戏未结束,它也会返回非False的值。

以下是TerminalUtility函数的实现,它们不会产生你遇到的问题,并且按预期工作。

实际上,我根据一个由9个字符组成的字符串表示的棋盘,添加了所有缺失的函数,以及一个游戏循环,这样你就可以与极小极大算法对战了:

import redef Utility(board):    m = re.findall(r"([XO])(?:\1\1(?:...)*$|..\1..\1|...\1...\1|.\1.\1..$)", board)    return -1 if "O" in m else len(m)    def Terminal(board):    return "O X"[Utility(board)+1].strip() or not board.count(".") and "draw"def turn(board):    return "OX"[board.count(".") % 2]def Actions(board):    return (i for i in range(9) if board[i] == ".")def Result(board, action):    return board[:action] + turn(board) + board[action+1:]board = "." * 9while True:  # 人机交互游戏    print(f"{board[:3]}\n{board[3:6]}\n{board[6:]}")    winner = Terminal(board)    if winner:        print(f"获胜者: {winner}")        break    if turn(board) == "X":        action = int(input("你的移动(0..8)? "))        if board[action] != ".":            print("无效移动。请重试。")            continue    else:        action = player(board)        print("极小极大算法选择", action)    board = Result(board, action)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注