Python 实现alpha-beta修剪算法时函数中的奇怪行为
我用alpha-beta剪枝实现了一个minimax算法。为了获得最佳移动,我使用Python 实现alpha-beta修剪算法时函数中的奇怪行为,python,artificial-intelligence,chess,Python,Artificial Intelligence,Chess,我用alpha-beta剪枝实现了一个minimax算法。为了获得最佳移动,我使用rootAlphaBeta函数调用alpha-beta算法。然而,在rootAlphaBeta函数中,我发现了一些非常奇怪的行为。当我调用rootAlphaBeta函数的ply为4时,它会进行大约20000次调用,但当我直接调用alphaBeta函数时,它只会进行大约2000次调用。我似乎找不到问题所在,因为打电话的次数应该是一样的 两种算法最终发现的移动应该是相同的,对吗?我想是的,至少这次移动的分数是一样的,我
rootAlphaBeta
函数调用alpha-beta算法。然而,在rootAlphaBeta
函数中,我发现了一些非常奇怪的行为。当我调用rootAlphaBeta
函数的ply
为4时,它会进行大约20000次调用,但当我直接调用alphaBeta
函数时,它只会进行大约2000次调用。我似乎找不到问题所在,因为打电话的次数应该是一样的
两种算法最终发现的移动应该是相同的,对吗?我想是的,至少这次移动的分数是一样的,我无法知道alphaBeta
在没有rootAlphaBeta
的情况下直接调用时所选择的移动
def alphaBeta(self, board, rules, alpha, beta, ply, player):
"""Implements a minimax algorithm with alpha-beta pruning."""
if ply == 0:
return self.positionEvaluation(board, rules, player)
move_list = board.generateMoves(rules, player)
for move in move_list:
board.makeMove(move, player)
current_eval = -self.alphaBeta(board, rules, -beta, -alpha, ply - 1,
board.getOtherPlayer(player))
board.unmakeMove(move, player)
if current_eval >= beta:
return beta
if current_eval > alpha:
alpha = current_eval
return alpha
def rootAlphaBeta(self, board, rules, ply, player):
"""Makes a call to the alphaBeta function. Returns the optimal move for a
player at given ply."""
best_move = None
max_eval = float('-infinity')
move_list = board.generateMoves(rules, player)
for move in move_list:
board.makeMove(move, player)
current_eval = -self.alphaBeta(board, rules, float('-infinity'),
float('infinity'), ply - 1,
board.getOtherPlayer(player))
board.unmakeMove(move, player)
if current_eval > max_eval:
max_eval = current_eval
best_move = move
return best_move
您的
rootAlphaBeta
不会更新alpha
值。当它可以缩小除第一个子节点以外的所有子节点的范围时,它调用其全部范围为(-inf,inf)的子节点。这将防止修剪某些对最终分数没有影响的分支,并增加节点数