Python Reversi/Otherlo AI在1秒以下工作

Python Reversi/Otherlo AI在1秒以下工作,python,reversi,Python,Reversi,在最近的一项任务中,我们被赋予了一项任务,即创建Reversi/Othello AI,该AI可以在1s下进行有效移动。我从一个简单的机器人开始,它接受所有可用的移动,并根据板上的值对它们进行评分。在第二个机器人上,我还为排名增加了移动性价值。现在,我已经做了一个机器人,它可以在前面搜索minmax 3移动,并根据分数评估移动。我的问题是,它被得分/机动性领先一步的机器人打败了。有没有可能,或者我把人工智能编码错了?是因为我只在前面三步搜索吗 我的机器人从以下内容开始: possible_move

在最近的一项任务中,我们被赋予了一项任务,即创建Reversi/Othello AI,该AI可以在1s下进行有效移动。我从一个简单的机器人开始,它接受所有可用的移动,并根据板上的值对它们进行评分。在第二个机器人上,我还为排名增加了移动性价值。现在,我已经做了一个机器人,它可以在前面搜索minmax 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
def最小值(自身、电路板、深度、α、β):
#端节点
如果深度=self.max_深度:
返回自我评估(董事会)
其他:
#最大节点=我的移动
如果深度%2==0:
可能的移动=自我。获得可用的移动(棋盘,自我。我的颜色,自我。对手颜色)
对于可能的_移动中的[x,y]:
新电路板=自身。制作电路板\u副本(电路板)
new_board[x][y]=self.my_颜色
新_alpha=self.minmax(新_板,深度+1,alpha,beta)
如果新的α>α:
阿尔法=新的阿尔法
如果α>β:
返回阿尔法
返回阿尔法
#最小节点
其他:
可能的移动=自我。获得可用的移动(棋盘,自我。我的颜色,自我。对手颜色)
对于可能的_移动中的[x,y]:
新电路板=自身。制作电路板\u副本(电路板)
new_board[x][y]=self.my_颜色
新_β=self.minmax(新_板,深度+1,α,β)
如果新的β<β:
β=新的β
如果β<α:
返回贝塔
返回贝塔

我多次检查代码,仍然无法确定我的代码是否糟糕,或者AI是否因为搜索深度不够而被打败。

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

你能解释一下alpha和beta,以及minmax函数吗,或者展示更多的代码?α和β都是阳性的吗

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

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

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

棋盘得分是根据我在互联网上找到的一些表格硬编码的:`score_board=[[99,-8,8,6,8,-8,99],-8,-24,-4,-3,-4,-24,-8],[8, -4, 7, 4, 4, 7, -4, 8], [6, -3, 4, 0, 0, 4, -3, 6], [6, -3, 4, 0, 0, 4, -3, 6], [8, -4, 7, 4, 4, 7, -4, 8], [-8, -24, -4, -3, -3, -4, -24, -8], [99, -8, 8, 6, 6, 8, -8, 99]]`我发现了我的错误。当我做新的节点-做一些动作时,我只是把它放进去,但没有翻转应该翻转的石头,现在它工作得很好,很顺利。无论如何,谢谢你
if new_beta > beta: