当前位置: 首页 > 知识库问答 >
问题:

最小极大算法不适用于深度>1

汪甫
2023-03-14

我正在 python 上做一个棋盘游戏,我需要在其中实现算法最小值。当我尝试增加搜索深度时,我的程序停止工作。我也尝试实施 alpha beta 削减,但它似乎无法正常工作。当我尝试其他深度值时,它开始进行无效播放,并且还出现此错误:

r = len(Matrix)

TypeError: object of type 'NoneType' has no len()

以下是我的代码:

def AIPlayerMove(board: Board, depth, MaxPlayer: bool, PlayerIndex: int):
if depth == 0:
    # value = board.BoardValue()
    return board.BoardMatrix

if MaxPlayer == True:
    # print("Search Max\n")
    BoardNodes = FecthChildNodes(board, PlayerIndex)
    results = []
    BestMatrix = None
    for BN in range(len(BoardNodes)):    
        results.append(AIPlayerMove(BoardNodes[BN], depth-1, False, PlayerIndex*-1))
    for r in range(len(results)):
        if r == 0:
            m = results[r]
            BestMatrix = m
        else:
            m = results[r]
            v1 = CountElementsOfMatrix(m)
            v2 = CountElementsOfMatrix(BestMatrix)
            if v1 > v2:
                BestMatrix = m
    #print(BestMatrix)
    return BestMatrix
else:
    # print("Search Min\n")
    BoardNodes = FecthChildNodes(board, PlayerIndex)
    results = []
    WorstMatrix = None
    for BN in range(len(BoardNodes)):
        results.append(AIPlayerMove(BoardNodes[BN], depth-1, True, PlayerIndex*-1))
        #WorstMatrix = results[0]
    for r in range(len(results)):
        if r == 0:
            m = results[r]
            WorstMatrix = m
        else:
            m = results[r]
            v1 = CountElementsOfMatrix(m)
            v2 = CountElementsOfMatrix(WorstMatrix)
            if v1 < v2:
                    WorstMatrix = m
    print(WorstMatrix)
    return WorstMatrix

阿尔法测试版修剪:

def AIPlayerMoveAlphaBeta(board: Board, depth, MaxPlayer: bool, PlayerIndex: int, Alpha, Beta):
if depth == 0:
    # value = board.BoardValue()
    return board.BoardMatrix

if MaxPlayer == True:
    BoardNodes = FecthChildNodes(board, PlayerIndex)
    results = []
    BestMatrix = None
    for BN in range(len(BoardNodes)):
        results.append(AIPlayerMoveAlphaBeta(BoardNodes[BN], depth-1, False, PlayerIndex*-1, Alpha, Beta))
    for r in range(len(results)):
        if r == 0:
            m = results[r]
            BestMatrix = m
        else:
            v2 = CountElementsOfMatrix(BestMatrix)
            alpha = max(Alpha, v2)
            if Beta <= alpha:
                print("Break Max")
                break
            # check alpha beta for best scenario of player Beta <= Alpha
            m = results[r]
            v1 = CountElementsOfMatrix(m)
            if v1 > v2:
                BestMatrix = m
    return BestMatrix
else:
    BoardNodes = FecthChildNodes(board, PlayerIndex)
    results = []
    WorstMatrix = None
    for BN in range(len(BoardNodes)):
        results.append(AIPlayerMoveAlphaBeta(BoardNodes[BN], depth-1, True, PlayerIndex*-1, Alpha, Beta))
    #print(results)
    for r in range(len(results)):
        if r == 0:
            m = results[r]
            WorstMatrix = m
        else:
            v2 = CountElementsOfMatrix(WorstMatrix)
            beta = min(Beta, v2)
            if beta <= Alpha:
                print("Break Min")
                break
            # check alpha beta for Worst scenario of player Beta > Alpha
            m = results[r]
            v1 = CountElementsOfMatrix(m)
            if v1 < v2:
                WorstMatrix = m
    return WorstMatrix

辅助功能:

def FecthChildNodes(board: Board, PlayerIndex: int):
TestBoards = []
for row in range(board.row_count):
    for column in range(board.column_count):
        # Check if player is according to index
        if board.BoardMatrix[row][column] == PlayerIndex:
            # Check for Tangent Movements
            TangentPositions = board.GetAvailableTangentPositions((row, column))
            for p in range(len(TangentPositions)):
                tempBoard: Board = Board(board.row_count, board.column_count)
                tempBoard.ChangeMatrixValuesWithMatrix(board.BoardMatrix)
                tempBoard.MakeNewPieceAt(TangentPositions[p], PlayerIndex)
                tempBoard.CatchPiece(TangentPositions[p], PlayerIndex)
                TestBoards.append(tempBoard)
                # tempBoard.DrawBoardTerminal()
            # Check for Long Movements
            LongPositions = board.GetAvailableTagentPositionsMovement((row, column))
            for p in range(len(LongPositions)):
                tempBoard: Board = Board(board.row_count, board.column_count)
                tempBoard.ChangeMatrixValuesWithMatrix(board.BoardMatrix)
                tempBoard.MovePieceTo((row, column), LongPositions[p], PlayerIndex)
                tempBoard.CatchPiece(LongPositions[p], PlayerIndex)
                TestBoards.append(tempBoard)
                # tempBoard.DrawBoardTerminal()
return TestBoards

启发式功能:

def CountElementsOfMatrix(Matrix):
    r = len(Matrix)
    c = len(Matrix[0])
    counter = 0
    for row in range(r):
        for col in range(c):
            counter += Matrix[row][col]
    return counter

共有1个答案

墨雨华
2023-03-14

当您到达无法移动的状态时(也许游戏只是结束了?),然后FetchChildNodes返回一个空列表,这会导致AIPlayer移动返回无,这会导致错误。

 类似资料:
  • 我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应

  • 问题内容: 最小高度不适用于body / html吗? 完全不执行任何操作(firebug报告正文,html标签的高度完全不变) 问题答案: 首先,声明一个doctype以便您符合标准(如果还没有的话)。 现在,正文只能与包含html的正文一样高,因此您需要将HTML标签设置为100%的高度,并将正文设置为min-height 100%。这对我在Firefox上有效。

  • 极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。 极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)

  • 我已经实现了一个带有alpha beta修剪的NegaMax算法(这只是一个较短版本的极小值算法)。现在我想实现迭代深化,这样我就可以为每个深度找到最佳移动,然后根据之前层的分数重新排序树下的节点,以便我的alphabeta修剪工作更有效。 以下是我迄今为止所做的工作: 这里gs是随每一步移动而变化的游戏属性,包含了所有关于游戏在t点的信息,比如是否可以施法或者是否有可能的内移。我的egamax算

  • 计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法,并通过实例分析帮助大家更好的理解。 一、概念 Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两

  • 无向图G=(V,E)的独立集是V的子集I使得I中没有两个顶点相邻。也就是说,如果u和v在I中,那么(u,v)不在E中。极大独立集M是一个独立集,这样,如果我们给M添加任何附加的顶点,那么它将不再是独立的。每个图都有一个极大独立集。(你能看到这个吗?这个问题不是练习的一部分,但值得思考。)给出了一个计算图G的最大独立集的有效算法。该方法的运行时间是多少? 我不确定对深度优先搜索的修改是否能解决上述问