实现alphabeta剪枝算法时函数中的奇怪行为

2024-09-24 22:32:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我用α-β剪枝实现了一个极大极小算法。为了获得最佳移动,我使用rootAlphaBeta函数调用alpha-beta算法。然而,在rootAlphaBeta函数中,我发现了一些非常奇怪的行为。当我用4的ply调用rootAlphaBeta函数时,它会进行大约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

Tags: selfalphaboardmovereturnifevalcurrent
1条回答
网友
1楼 · 发布于 2024-09-24 22:32:27

您的rootAlphaBeta不更新alpha值。它用(-inf,inf)的完整范围调用它的所有子节点,而它本可以缩小除第一个子节点之外的所有子节点的范围。这将阻止对最终得分没有影响的某些分支的修剪,并增加节点数。在

相关问题 更多 >