Python Deep copy in minimax function



我正在使用带有alpha-beta修剪的最小最大值算法在Python中创建国际象棋引擎。然而,目前它非常慢,我发现在 minimax 中进行每次迭代的深度复制与我所有其他函数的总和一样慢。

有没有办法绕过深拷贝,或者让它更快?以下是我截至今天的最小最大值函数。它只能提前 3-4 次左右思考,这并不能成为一个非常好的引擎......非常感谢任何关于加快算法速度的建议。

def minimax(board, depth, alpha, beta, maximizing_player):
board.is_human_turn = not maximizing_player 
children = board.get_all_possible_moves()
if depth == 0 or board.is_draw or board.is_check_mate:
return None, evaluate(board)
best_move = random.choice(children)
if maximizing_player:
max_eval = -math.inf
for child in children:
board_copy = copy.deepcopy(board)
board_copy.move(child[0][0], child[0][1], child[1][0], child[1][1])
current_eval = minimax(board_copy, depth - 1, alpha, beta, False)[1]
if current_eval > max_eval:
max_eval = current_eval
best_move = child
alpha = max(alpha, current_eval)
if beta <= alpha:
break
return best_move, max_eval
else:
min_eval = math.inf
for child in children:
board_copy = copy.deepcopy(board)
board_copy.move(child[0][0], child[0][1], child[1][0], child[1][1])
current_eval = minimax(board_copy, depth - 1, alpha, beta, True)[1]
if current_eval < min_eval:
min_eval = current_eval
best_move = child
beta = min(beta, current_eval)
if beta <= alpha:
break
return best_move, min_eval

关于如何优化程序的一些想法(排名不分先后(:

1( 在minimax功能中if depth == 0 or board.is_draw or board.is_check_mate第一件事进行检查。现在,您调用可能是多余的board.get_all_possible_moves()(例如,在depth == 0的情况下(。

2(我不明白get_all_possible_moves()方法是如何实现的,并假设它不进行任何类型的排序。对最小最大值算法的移动进行排序是一种很好的做法,以便从最佳到最差开始循环它们(在这种情况下,您可能会修剪更多节点并加快程序速度(。

3(for child in children循环中的child变量是一个二维矩阵。我也猜测board也是一个多维数组。多维数组可能比一维数组慢,因为它们的内存布局(例如,如果您按列迭代它们(。如果可能的话,使用一维数组(例如,您可以将一个二维数组表示为一迪姆数组的"串联"(。

4(使用生成器进行惰性求值。例如,您可以将get_all_possible_moves()变成生成器并对其进行迭代,而无需创建列表和消耗额外的内存。如果提前触发 alpha/beta 修剪条件,则无需展开该位置的整个子项列表。

5(避免通过进行和取消当前移动来深度复制电路板。在这种情况下,您不会创建开发板的副本,而是重复使用原始开发板,这可能会更快:

current_move_info = ... # collect and store info necessary to make/unmake the current move

board.move(current_move_info)

current_eval = minimax(board, ...)[1]

board.unmake_move(current_move_info) # restore the board position by undoing the last move

6(添加更多经典的优化国际象棋引擎功能,如迭代深化,主要变化搜索,换位表,位板等。

最新更新