递归极小极大函数返回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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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