在最近的一项任务中,我们被赋予了创建反转/奥赛罗AI的任务,该AI可以在1s下进行有效移动。我从一个简单的机器人开始,它接受所有可用的动作,并根据棋盘上的值对其进行评分。在第二个机器人上,我还为排名增加了移动价值。现在,我制作了一个机器人,它以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
我检查了很多次代码,仍然不知道我的代码是坏的,还是人工智能因为搜索不够深入而被打败了。
如果使用相同的评估,我认为较低深度的搜索不太可能击败较高深度的搜索,而且可能是不可能的。
你能多解释一下alpha和beta,以及minmax函数吗,或者展示更多的代码?阿尔法和贝塔总是阳性吗?
我认为你的奇数节点功能可能有问题:
if new_beta < beta:
beta = new_beta
if beta < alpha:
return beta
如果alpha和beta都是正值,那么您希望第一行是
if new_beta > beta:
这也取决于你如何在棋盘上得分。这显然非常重要——我不知道你的人工智能是否试图从游戏中学习这一点,或者你是否根据各种位置因素和判断对其进行了评估。