关于alpha beta功能的问题不适用于游戏caro

问题描述 投票:-1回答:1

我正在使用alpha beta算法用python编写游戏Caro而且我不明白为什么它在我的字母功能中不起作用请帮我!!

这是我的代码

def alphabeta(board, depth, alpha, beta, player):
    x = 0
    y = 0
    if(depth == 0 or game_over(board)):
        return x, y
    if(player == COMP):
        v = -infinity
        for row in range(len(board)):
            for col in range(len(board[row])):
                if(valid_move(board, row, col)):
                    v = max(v, alphabeta(board, depth - 1, alpha, beta, HUMAN)[0])
                    if(v <= alpha):
                        x = row
                        y = col
                    alpha = max(alpha, v)
                    if(beta <= alpha):
                        break

        return x, y
    else:
        v = +infinity
        for row in range(len(board)):
            for col in range(len(board[row])):
                if(valid_move(board, row, col)):
                    v = min(v, alphabeta(board, depth - 1, alpha, beta, COMP)[0])
                    if(v > beta):
                        x = row
                        y = col
                    beta = min(beta, v)
                    if(beta <= alpha):
                        break

        return x, y

    return x, y

我的完整代码:https://github.com/ledutu/caro/blob/master/new.py

更新1:这是我的固定功能:

def alphabeta(board, depth, alpha, beta, player):

    results = return_score(board, player)
    value, x, y = results1[0], results1[1], results1[2]

    if(depth == 0 or game_over(board)):
        return value, x, y

    if(player):
        v = -infinity
        for row in range(len(board)):
            for col in range(len(board[row])):
                if(valid_move(board, row, col)):
                    v = max(v, alphabeta(board, depth - 1, alpha, beta, HUMAN)[0])

                    if(v >= alpha):
                        x = row
                        y = col

                    alpha = max(alpha, v)
                    if(beta <= alpha):
                        break

        return alpha, x, y
    else:
        v = +infinity
        for row in range(len(board)):
            for col in range(len(board[row])):
                if(valid_move(board, row, col)):
                    v = min(v, alphabeta(board, depth - 1, alpha, beta, COMP)[0])
                    if(v < beta):
                        x = row
                        y = col

                    beta = min(beta, v)

                    if(beta <= alpha):
                        break

        return beta, x, y

图片:picture for executing program

我尝试运行,但AI无法正常工作。当我编号为35时,AI编号为89。当我编号为36时,它没有阻塞但编号为88。我检查并只允许在不超过1的长度内比赛。

谢谢您的阅读!

python-3.x algorithm
1个回答
0
投票

主要问题是您的alphabeta函数具有返回move(x和y坐标)的return语句,而您对alphabeta的递归调用将返回的对的第一个坐标视为评估。这是不对的。实际上,您的函数从不评估职位。

要采取的两个动作:

  • 到达递归末尾时,应评估位置
  • 使函数返回bothvaluemove

所以基本情况:

if (depth == 0 or game_over(board)):
    return evaluate(board), None, None  # value, x, y

相应地更改其他return条语句:

    return value, x, y

现在递归调用将正确地获取值(通过取返回值的[0]

仍然在那儿出错。将if(v <= alpha)更改为if(v >= alpha),因为要跟踪best移动,而不是最坏的移动。同样,将if(v > beta)更改为if(v < beta)

由于在ifelse块中都执行了return,所以最终的return(在if...else块之后)将永远不会执行。我将在returnif块的末尾删除这两个else语句。只需进入最后的return语句即可,这两种情况都相同。

最后,更改alphabeta的主要调用,使其忽略该值而检索最佳移动-添加[1:]

move = alphabeta(board, 2, -infinity, +infinity, COMP)[1:]

备注:

您的评估非常基本(1、0或-1)。通过应用启发式方法,您将获得更好的结果,从而使董事会价值更具差异性。

© www.soinside.com 2019 - 2024. All rights reserved.