高级 #ai#game#minimax

博弈与对抗搜索(Minimax)

Minimax 是双人博弈的搜索算法——在对手也最优的前提下最大化自己的收益。Alpha-Beta 剪枝大幅减少搜索量

♟️ 下棋——你怎么知道我下一步会走哪?

你和朋友下五子棋。你在想”我走这里”——但你又想”如果我走这里,他会走那里,然后我就可以……”

这就是 Minimax 的思想:假设对手也是理性的(他会选对他最有利的走法)——你在对手最优的前提下,选对自己最有利的走法

def minimax(state, depth, is_maximizing):
    if depth == 0 or game_over(state):
        return evaluate(state)  # 局面评估
    
    if is_maximizing:  # 自己的回合——取最大值
        best = -infinity
        for move in get_moves(state):
            value = minimax(make_move(state, move), depth-1, False)
            best = max(best, value)
        return best
    else:  # 对手的回合——取最小值
        best = infinity
        for move in get_moves(state):
            value = minimax(make_move(state, move), depth-1, True)
            best = min(best, value)
        return best

Alpha-Beta 剪枝——不用搜所有可能性

Minimax 的搜索树随深度指数增长——象棋的全部分支 ≈ 10¹²⁰。不可能搜完。

Alpha-Beta 剪枝:如果一个分支已经不可能比已知的最优解更好——直接剪掉

def alpha_beta(state, depth, alpha, beta, is_maximizing):
    """alpha = 当前已知的最优下界,beta = 最优上界"""
    if depth == 0 or game_over(state):
        return evaluate(state)
    
    if is_maximizing:
        value = -infinity
        for move in get_moves(state):
            value = max(value, alpha_beta(state, depth-1, alpha, beta, False))
            alpha = max(alpha, value)
            if alpha >= beta:  # 剪枝!对手不会允许这个分支
                break
        return value
    else:
        # 类似——取最小值,剪枝条件是 beta <= alpha

Alpha-Beta 剪枝可以把搜索量从 O(b^d) 降到约 O(b^(d/2))——同样的时间内可以搜索两倍的深度。


📝 小结

概念一句话
Minimax假设对手最优——我取最大,对手取最小
Alpha-Beta 剪枝不可能比已知解更好的分支直接剪掉
评估函数无法搜到底时——用启发式评估局面好坏

为什么先学这个? 搜索和博弈是经典 AI。但现代 AI 的核心是从数据中学习——线性回归与逻辑回归