Python Reversi / Othello AI工作不到1秒

时间:2016-10-21 00:00:56

标签: python reversi

在最近的一个分配中,我们有一个任务是创建 Reversi / Othello AI ,这可以在 1s 下进行一次移动。我已经开始使用简单的机器人,它采用所有可用的移动并根据值对其进行评分。在第二个机器人上,我还为排名增加了移动性价值。现在我已经制作了bot,其中minmax 3向前搜索并根据得分评估移动。我的问题是,它被得分/移动性领先一步机器人打败了。是否有可能或者我编写了AI错误的代码?是因为我只提前3步了吗?

我的机器人从这开始:

possible_moves = self.get_available_moves(board,self.my_color,self.opponent_color)
for [x, y] in possible_moves:
    new_board = self.make_board_copy(board)
    new_board[x][y] = self.my_color
    new_alpha = self.minmax(new_board,1,alpha,beta)
    if new_alpha > alpha:
        alpha = new_alpha
        best_move = [x,y]

而不是这个:

    def minmax(self, board, depth, alpha, beta):
    # END NODE
    if depth == self.max_depth:
        return self.evaluate(board)
    else:
        # MAX NODE = MY MOVE
        if depth % 2 == 0:
            possible_moves = self.get_available_moves(board,self.my_color,self.opponent_color)
            for [x, y] in possible_moves:
                new_board = self.make_board_copy(board)
                new_board[x][y] = self.my_color
                new_alpha = self.minmax(new_board,depth+1,alpha,beta)
                if new_alpha > alpha:
                    alpha = new_alpha
                if alpha > beta:
                    return alpha
            return alpha
        # MIN NODE
        else:
            possible_moves = self.get_available_moves(board,self.my_color,self.opponent_color)
            for [x,y] in possible_moves:
                new_board = self.make_board_copy(board)
                new_board[x][y] = self.my_color
                new_beta = self.minmax(new_board, depth + 1, alpha, beta)
                if new_beta < beta:
                    beta = new_beta
                if beta < alpha:
                    return beta
            return beta

我多次检查了代码,但仍然无法弄清楚我的代码是不是很糟糕,或者因为搜索不够深而导致AI被殴打。

1 个答案:

答案 0 :(得分:1)

如果它使用相同的评估,我认为较低深度搜索不太可能击败更高深度的搜索,并且可能是不可能的。

你能解释一下alpha和beta,以及minmax的功能,或者显示更多的代码吗? alpha和beta都是正面的吗?

我认为你的奇数节点函数可能有问题:

x=a^(1/(n-m))

如果alpha和beta都是正值,那么你希望第一行是

if new_beta < beta:
    beta = new_beta
if beta < alpha:
    return beta

这也取决于你在董事会中的得分如何。这显然非常重要 - 我不知道你的AI是否试图通过比赛来学习这一点,或者你是否根据各种位置因素和判断给出了评估。