# CS188 Project 2: Multi-Agent Pacman - 人工智能知识点总结

这份文档总结了在 Berkeley CS188 Project 2 (Multi-Agent Search) 中涉及的核心人工智能概念。通过完成 Q1 到 Q5，我们从简单的反射代理进化到了能够进行对抗性推理和处理不确定性的复杂代理。

## Q1: Reflex Agent (反射代理)

### 核心概念
*   **反射代理 (Reflex Agent)**: 这种代理不进行显式的规划或搜索。它仅根据**当前状态 (Current State)** 的直接感知信息来做出决策。
*   **状态-动作评估 (State-Action Evaluation)**: 我们评估的是“在当前状态下采取某个动作后会发生什么”。
*   **理性 (Rationality)**: 即使没有通过搜索看得很远，反射代理通过设计良好的**评估函数 (Evaluation Function)** 也能表现出看似理性的行为（例如吃食物、躲避幽灵）。

### 关键实现点
*   **特征提取 (Feature Extraction)**: 我们从游戏状态中提取关键特征，如“距离最近食物的距离”、“距离最近幽灵的距离”、“剩余胶囊数量”等。
*   **线性组合 (Linear Combination)**: 评估函数通常是这些特征的加权和。
    *   $Value(state, action) = w_1 \cdot f_1 + w_2 \cdot f_2 + \dots$
*   **局限性**: 反射代理容易陷入**局部最优 (Local Optima)**。例如，为了吃一个豆子而走进死胡同，因为它没有“向前看”几步的能力。

---

## Q2: Minimax (极小化极大算法)

### 核心概念
*   **对抗搜索 (Adversarial Search)**: 在多智能体环境中，其他代理（幽灵）的目标可能与我们（Pacman）相反。这是一个**零和博弈 (Zero-Sum Game)**。
*   **博弈树 (Game Tree)**: 游戏的所有可能状态构成的树状结构。
*   **Minimax 策略**:
    *   **MAX 层 (Pacman)**: 总是选择能让自己收益最大化的动作。
    *   **MIN 层 (Ghosts)**: 假设对手（幽灵）是完美的，总是选择能让 Pacman 收益最小化（即对幽灵最有利）的动作。

### 算法流程
1.  **深度优先搜索 (DFS)**: 递归地向下搜索博弈树，直到达到预定的**深度 (Depth)** 或**终止状态 (Terminal State)**（输/赢）。
2.  **状态评估**: 在叶子节点使用评估函数计算分值。
3.  **回溯 (Backtracking)**:
    *   在 MIN 节点，取子节点的最小值传递给父节点。
    *   在 MAX 节点，取子节点的最大值传递给父节点。

### 意义
Minimax 保证了在对手最优应对的情况下，我们能得到的最好的结果（下限）。它是保守的，假设情况总是最坏的。

---

## Q3: Alpha-Beta Pruning (Alpha-Beta 剪枝)

### 核心概念
*   **剪枝 (Pruning)**: 在不改变 Minimax 最终决策结果的前提下，忽略（剪掉）那些不需要探索的博弈树分支。
*   **优化效率**: 剪枝可以极大地减少搜索节点的数量，允许我们在相同的时间内搜索得更深。

### 关键参数
*   **$\alpha$ (Alpha)**: 目前为止，MAX 节点（Pacman）在任意路径上发现的**最好**（最大）的选择。即 MAX 的下界。
*   **$\beta$ (Beta)**: 目前为止，MIN 节点（Ghosts）在任意路径上发现的**最好**（最小）的选择。即 MIN 的上界（对于 MAX 来说是上界）。

### 剪枝逻辑
*   **Min 节点剪枝**: 如果某个 Min 节点发现一个值 $v \leq \alpha$，它会立即停止搜索其他子节点。因为 MAX 的父节点已经有一个比 $v$ 更好的选择 $\alpha$，所以 MAX 绝不会选择通向这个 Min 节点的路径。
*   **Max 节点剪枝**: 如果某个 Max 节点发现一个值 $v \geq \beta$，它会立即停止。因为 MIN 的父节点已经有一个比 $v$ 更让 MAX 难受的选择 $\beta$（更小的值），MIN 绝不会让游戏走到这个 Max 节点产生 $v$ 的情况。

---

## Q4: Expectimax (期望最大化算法)

### 核心概念
*   **不确定性 (Uncertainty)**: 在现实中，对手并不总是完美的（最优的），或者对手的行为具有随机性。
*   **概率模型**: 我们不再假设幽灵是“敌人”，而是将其视为环境中的随机因素。
*   **期望值 (Expected Value)**: 我们计算的是采取某个动作后的**平均收益**，而不是最差情况下的收益。

### 算法变化
*   **MAX 节点**: 依然选择最大值（Pacman 仍然想赢）。
*   **CHANCE (Expectation) 节点**: 替代了 Minimax 中的 MIN 节点。它的值是所有子节点值的**加权平均数**。
    *   $V(s) = \sum_{s'} P(s'|s, a) \cdot V(s')$
    *   在本实验中，假设幽灵随机行动，即概率是均匀分布的。

### 意义
*   Expectimax 能够利用对手的非最优行为（犯错）。
*   它愿意承担计算出的风险（Calculated Risk）。例如，Minimax 可能会因为害怕 1% 的死亡概率而放弃大奖，而 Expectimax 如果计算出期望收益够高，就会去冒险。

---

## Q5: Evaluation Function (评估函数设计)

### 核心概念
*   **启发式 (Heuristics)**: 当搜索树太深无法穷尽时，我们需要在有限深度处截断，并对非终局状态进行估值。
*   **状态评估 (State Evaluation)**: Q1 评估的是动作，Q5 评估的是静态的状态。

### 设计要素
一个好的评估函数应该包含：
1.  **当前分数**: 游戏的基础目标。
2.  **食物距离**: 鼓励 Pacman 吃豆子（通常用距离的倒数， $1/distance$）。
3.  **胶囊与受惊幽灵**: 鼓励 Pacman 在幽灵受惊时去吃掉它们（高回报）。
4.  **生存惩罚**: 如果距离非受惊幽灵太近，给予极大的负分。

### 线性评估函数结构
$$ Eval(s) = w_1 \cdot Feature_1(s) + w_2 \cdot Feature_2(s) + \dots + w_n \cdot Feature_n(s) $$
通过调整权重 $w$，我们定义了代理的“性格”（例如，是贪婪得分还是极其怕死）。
