Week 3: 最优决策与 Bellman 最优方程
回顾:MDP 与 Bellman 期望方程
上周我们学习了:
- 马尔可夫决策过程 (MDP): \((S, A, P, R, \gamma)\) 作为序贯决策问题的形式化框架。
- 马尔可夫性质: 未来只取决于现在。
- 回报 (Return) \(G_t:\) 未来折扣奖励的总和。
- 策略 (Policy) \(\pi:\) 状态到动作的映射。
- 价值函数 (\(V_{\pi}, Q_{\pi}\)): 衡量在策略 \(\pi\) 下状态或状态-动作对的长期价值。
- Bellman 期望方程: 建立了当前状态价值与后继状态价值之间的递归关系,用于评估 (Evaluation) 一个给定的策略 \(\pi\)。
\[ \begin{aligned} V_{\pi}(s) &= \sum_{a \in A} \pi(a|s) \sum_{s' \in S} P(s'|s,a) [R(s,a,s') + \gamma V_{\pi}(s')] \\ Q_{\pi}(s,a) &= \sum_{s' \in S} P(s'|s,a) [R(s,a,s') + \gamma V_{\pi}(s')] \end{aligned} \]
今天,我们的目标是找到最优 (Optimal) 的决策策略。
最优价值函数 (Optimal Value Functions)
在所有可能的策略中,至少存在一个策略比其他所有策略都好或者一样好。这个(些)策略称为最优策略 (Optimal Policy),记作 \(\pi^*\)。
是的,在有限 MDP 中,至少存在一个最优策略。这是因为:
- 有限性保证:状态空间 \(S\) 和动作空间 \(A\) 都是有限的,策略空间也是有限的。
- 价值函数有界:由于折扣因子 \(\gamma < 1\),价值函数 \(V_{\pi}(s)\) 对于任何策略 \(\pi\) 都是有界的。
- 存在性定理:根据 MDP 理论,在有限 MDP 中,存在至少一个确定性策略 \(\pi^*\),使得对于所有状态 \(s \in S\),\(V_{\pi^*}(s) \geq V_{\pi}(s)\) 对所有其他策略 \(\pi\) 成立。
需要注意的是:
- 可能存在多个最优策略,但它们都共享相同的最优价值函数 \(V^*\) 和 \(Q^*\)。
- 在无限 MDP 中,最优策略的存在性需要额外的条件保证。
示例 1:库存管理
- 状态空间 S:当前库存水平(离散或连续)
- 动作空间 A:订购数量(离散或连续)
- 奖励 R:销售收入 - 订购成本 - 库存持有成本 - 缺货惩罚
- 最优策略 π*:在每种库存水平下选择最优的订购数量,以最大化长期利润
- V*(s):在库存水平 s 下,采用最优策略所能获得的最大预期利润
- Q*(s,a):在库存水平 s 下,采取订购数量 a 后继续采用最优策略所能获得的最大预期利润
- 存在最优策略的原因:
- 状态空间和动作空间都是有限的(即使连续,在实际应用中也会离散化处理)
- 奖励函数有界(销售收入和成本都是有限的)
- 折扣因子 γ < 1 保证了长期利润的收敛性
示例 2:广告投放
- 状态空间 S:用户特征(如年龄、性别、浏览历史)
- 动作空间 A:投放的广告类型
- 奖励 R:用户点击广告带来的收入
- 最优策略 π*:针对不同用户特征选择最优的广告类型,以最大化长期点击收入
- V*(s):对于具有特征 s 的用户,采用最优策略所能获得的最大预期收入
- Q*(s,a):对于具有特征 s 的用户,投放广告类型 a 后继续采用最优策略所能获得的最大预期收入
- 存在最优策略的原因:
- 用户特征和广告类型都是有限的
- 每次点击带来的收入是有限的
- 折扣因子 γ < 1 保证了长期收入的收敛性
- 用户行为模式相对稳定,满足马尔可夫性质
示例 3:机器人路径规划
- 状态空间 S:机器人的当前位置
- 动作空间 A:可移动的方向(上、下、左、右)
- 奖励 R:到达目标位置获得正奖励,撞墙获得负奖励
- 最优策略 π*:在每个位置选择最优的移动方向,以最快到达目标
- V*(s):在位置 s 下,采用最优策略所能获得的最大预期奖励
- Q*(s,a):在位置 s 下,采取动作 a 后继续采用最优策略所能获得的最大预期奖励
- 存在最优策略的原因:
- 地图大小有限,位置状态是有限的
- 动作空间是离散且有限的
- 奖励函数有界(正负奖励都是有限的)
- 环境动态是确定性的,满足马尔可夫性质
在某些情况下,MDP 可能不存在最优策略,常见原因包括:
- 无限状态/动作空间且无界奖励
- 当状态空间或动作空间是无限的,且奖励函数无界时,价值函数可能发散,导致不存在最优策略。
- 示例:连续状态和动作空间中的某些控制问题,如果奖励随状态/动作无限增长。
- 部分可观测性 (POMDP)
- 在部分可观测马尔可夫决策过程中,智能体无法直接观察完整状态,可能导致不存在确定性的最优策略。
- 示例:机器人导航中,传感器只能提供部分环境信息。
- 非平稳环境
- 当环境动态(转移概率或奖励函数)随时间变化时,可能不存在固定的最优策略。
- 示例:金融市场中的交易策略,市场条件不断变化。
- 多目标冲突
- 当存在多个相互冲突的目标时,可能不存在单一的最优策略。
- 示例:同时优化利润和客户满意度的商业决策。
- 不可终止的 MDP
- 在某些无限期 MDP 中,如果折扣因子 γ=1,价值函数可能发散。
- 示例:某些持续进行的控制任务,没有明确的终止状态。
- 不满足马尔可夫性质
- 当当前状态不能完全捕获历史信息时,MDP 假设不成立。
- 示例:某些需要记忆历史状态才能做出最优决策的场景。
围棋作为一种完全信息博弈,理论上存在最优策略,但实际中难以实现:
- 理论层面:
- 围棋是有限状态、有限动作的完全信息博弈
- 根据Zermelo定理,存在确定性的最优策略
- 先手或后手必有一方有必胜策略(或双方都有保证和局的策略)
- 实践层面:
- 状态空间极其庞大(约 10^170 种可能局面)
- 无法通过穷举法找到最优策略
- 即使使用强化学习(如 AlphaGo),也只能逼近最优策略
- 现实意义:
- 当前 AI 水平已远超人类,但尚未达到理论最优
- 证明最优策略的存在性 ≠ 能够实际找到它
- 在可预见的未来,围棋仍将是一个极具挑战性的问题
启示:
- 理论最优与实际可行之间存在巨大鸿沟
- 在复杂商业决策中,追求”足够好”的策略往往比寻找理论最优更实际
- 强化学习等 AI 方法可以帮助我们在复杂问题中逼近最优解
虽然大多数棋类游戏过于复杂而无法找到实际的最优策略,但一些简单的棋类游戏已经被完全解决:
- 井字棋 (Tic-Tac-Toe)
- 已被完全解决,最优策略下双方必和
- 先手如果完美执行策略,永远不会输
- 后手如果完美执行策略,至少可以保证和局
- 五子棋 (Gomoku)
- 在15x15棋盘上,先手有必胜策略
- 1993年由Victor Allis证明 [Allis, 1994]
- 但实际找到具体的最优策略仍然非常困难
- 国际象棋残局 (Chess Endgames)
- 某些简单的残局(如王对王+兵)已被完全解决
- 通过穷举法建立了残局数据库 [Thompson, 1986]
- 但完整国际象棋的最优策略尚未找到
- 跳棋 (Checkers)
- 2007年被完全解决
- 由Jonathan Schaeffer团队通过穷举法证明 [Schaeffer et al., 2007]
- 最优策略下双方必和
- 四子棋 (Connect Four)
- 1988年被完全解决
- 先手有必胜策略
- 通过穷举法证明 [Allis, 1988]
主要参考文献:
- Allis, L. V. (1994). Searching for solutions in games and artificial intelligence. PhD thesis, University of Limburg, Maastricht.
- Thompson, K. (1986). Retrograde analysis of certain endgames. ICCA Journal, 9(3), 131-139.
- Schaeffer, J., Burch, N., Björnsson, Y., Kishimoto, A., Müller, M., Lake, R., … & Sutphen, S. (2007). Checkers is solved. Science, 317(5844), 1518-1522.
- Allis, L. V. (1988). A knowledge-based approach of connect-four. Master’s thesis, Vrije Universiteit, Amsterdam.
启示:
- 简单棋类游戏可以通过穷举法找到最优策略
- 随着游戏复杂度增加,找到最优策略变得极其困难
- 即使理论上存在最优策略,实际找到它可能需要巨大的计算资源
- 在复杂游戏中,AI方法(如强化学习)可以帮助我们逼近最优策略
最优策略对应的价值函数称为最优价值函数 (Optimal Value Functions)。
- 最优状态值函数 (Optimal State-Value Function, \(V^*\)):
- 定义: \(V^*(s) = \max_{\pi} V_{\pi}(s)\) for all \(s \in S\)
- 含义: 对于状态 \(s\),在所有可能的策略中能够获得的最大预期回报。它代表了状态 \(s\) 的真正内在价值。
- 最优动作值函数 (Optimal Action-Value Function, \(Q^*\)):
- 定义: \(Q^*(s, a) = \max_{\pi} Q_{\pi}(s, a)\) for all \(s \in S, a \in A\)
- 含义: 对于状态 \(s\) 和动作 \(a\),在所有可能的策略下,先执行动作 \(a\) 然后继续遵循该策略所能获得的最大预期回报。它代表了在状态 \(s\) 下采取动作 \(a\) 的真正最优价值。
如果我们知道了 \(Q^*(s, a)\),那么找到最优策略 \(\pi^*\) 就非常简单:在任何状态 \(s\),只需选择那个使得 \(Q^*(s, a)\) 最大的动作 \(a\) 即可。 \(\pi^*(s) = \arg\max_a Q^*(s, a)\) 这是一个贪心策略 (Greedy Policy)。相对于最优动作值函数 \(Q^*\) 采取贪心策略,本身就是最优策略。
如何理解这个结论在随机性环境中的适用性:
- \(Q^*(s, a)\) 已经包含了状态转移的不确定性,它表示的是在状态 \(s\) 采取动作 \(a\) 后的期望累积回报
- 在随机性环境中,虽然每次执行相同动作可能导致不同的结果,但 \(Q^*(s, a)\) 已经对这些可能结果进行了加权平均
- 因此,选择最大 \(Q^*(s, a)\) 的动作是在长期期望意义下的最优选择,即使单次执行可能不是最优结果
- 这种策略在多次执行中会表现出最优性,因为它最大化的是期望回报,而不是单次回报
\(V^*\) 和 \(Q^*\) 之间有以下重要关系:
- \(V^*(s) = \max_a Q^*(s, a)\)
- 这是根据最优价值函数的定义直接得到的
- 表示一个状态的最优价值等于在该状态下采取最优动作的价值
- \(Q^*(s, a) = \sum_{s' \in S} P(s' | s, a) [R(s, a, s') + \gamma \max_{a'} Q^*(s', a')]\)
- 这是 Bellman 最优方程的直接结果
- 表示在状态 s 采取动作 a 的最优价值等于:
- 即时奖励 R(s, a, s’)
- 加上所有可能的后继状态采取最优动作的价值的折扣期望
Bellman 最优方程 (Bellman Optimality Equation)
Bellman 最优方程描述了最优价值函数 \(V^*\) 和 \(Q^*\) 必须满足的条件。它与 Bellman 期望方程不同,期望方程是针对某个特定策略 \(\pi\) 的,而最优方程是针对最优策略 \(\pi^*\) 的,并且隐含了最大化操作。
\(V^*\) 的 Bellman 最优方程:
\[ \begin{align} V^*(s) &= \max_a E [R_{t+1} + \gamma V^*(S_{t+1}) | S_t=s, A_t=a] \\ &= \max_a \sum_{s' \in S} P(s' | s, a) [R(s, a, s') + \gamma V^*(s')] \end{align} \]
直观解读:
一个状态 \(s\) 的最优价值 (\(V^*(s)\)) 等于:选择那个能够最大化 (即时奖励 + 未来最优预期价值) 的动作 \(a\) 所带来的期望回报。 这个 \(\max_a\) 体现了最优策略在每个状态下都会选择最好的动作。
\(Q^*\) 的 Bellman 最优方程:
\[ \begin{align} Q^*(s, a) &= E [R_{t+1} + \gamma \max_{a'} Q^*(S_{t+1}, a') | S_t=s, A_t=a] \\ &= \sum_{s' \in S} P(s' | s, a) [R(s, a, s') + \gamma \max_{a'} Q^*(s', a')] \\ &= \sum_{s' \in S} P(s' | s, a) [R(s, a, s') + \gamma V^*(s')] \end{align} \]
(利用 V* 和 Q* 的关系)
直观解读:
在状态 \(s\) 采取动作 \(a\) 的最优价值 (\(Q^*(s, a)\)) 等于:
- 获得即时奖励 \(R(s, a, s')\)。
- 转移到后继状态 \(s'\)。
- 在后继状态 \(s'\),采取最优的下一个动作 \(a'\) (即 \(\max_{a'} Q^*(s', a')\),这等价于 \(V^*(s')\))。
- 将即时奖励和后继状态的最优折扣价值加起来,并对所有可能的后继状态 \(s'\) 求期望。
- Bellman 期望方程: 用于评估一个给定的策略 \(\pi\),计算 \(V_{\pi}\) 或 \(Q_{\pi}\)。它是一个线性方程组(如果状态动作空间有限)。
- Bellman 最优方程: 用于描述最优价值函数 \(V^*\) 或 \(Q^*\) 满足的条件。由于
max
操作的存在,它是一个非线性方程组。求解这个方程组就能得到最优价值函数,进而得到最优策略。
最优方程的作用
Bellman 最优方程在强化学习中扮演着至关重要的角色,主要体现在以下几个方面:
理论基石: 为强化学习算法提供了坚实的理论基础,证明了最优价值函数和最优策略的存在性。
算法设计指导: 许多经典强化学习算法(如值迭代、策略迭代、Q-learning)都是基于 Bellman 最优方程设计的。
最优策略求解: 通过求解 Bellman 最优方程,可以直接得到最优价值函数 \(V^*\) 和 \(Q^*\),进而推导出最优策略 \(\pi^*\)。
收敛性保证: 在满足一定条件下,基于 Bellman 最优方程的算法能够保证收敛到最优解。
价值函数更新: 为价值函数的更新提供了明确的数学公式,指导智能体如何根据经验改进其价值估计。
策略改进: 通过比较当前策略与最优价值函数,可以系统地改进策略,使其逐步接近最优。
理论分析工具: 可用于分析强化学习算法的收敛速度、样本复杂度等理论性质。
实际应用指导: 为实际应用中的策略优化提供了明确的方向,帮助设计更有效的学习算法。
- 最优方程用于寻找最优策略,包含最大化操作,是非线性方程
- 期望方程用于评估特定策略,是线性方程
- 两者都基于 Bellman 方程,但目标不同
实际应用中的选择
在实际应用中,我们通常需要根据具体问题和计算资源在期望方程和最优方程之间做出选择:
- 期望方程的应用场景:
- 当我们需要评估某个特定策略的性能时
- 在策略迭代算法中,用于策略评估阶段
- 当状态空间较大时,作为近似求解的起点
- 在在线学习中,用于实时更新策略价值
- 最优方程的应用场景:
- 当我们的目标是找到最优策略时
- 在值迭代算法中,直接用于寻找最优价值函数
- 在Q-learning等off-policy算法中,用于更新最优动作值函数
- 当计算资源充足时,用于精确求解
- 实际考虑因素:
- 计算复杂度: 最优方程由于包含max操作,通常比期望方程更难求解
- 状态空间大小: 对于大规模问题,通常需要结合近似方法
- 收敛速度: 期望方程有时可以更快收敛,但可能陷入次优解
- 应用需求: 如果只需要一个可行的好策略,期望方程可能就足够了
- 对于小规模问题,可以直接求解最优方程
- 对于大规模问题,建议采用近似方法或结合使用两种方程
- 在策略迭代中交替使用两种方程往往能取得较好效果
- 考虑使用函数逼近等方法来降低计算复杂度
- 折中方案:
- 使用期望方程作为初始近似,逐步向最优方程过渡
- 在策略迭代中交替使用期望方程和最优方程
- 采用近似方法(如函数逼近)来降低最优方程的求解难度
- 虽然 Bellman 最优方程在理论上非常强大,但在实际应用中,由于状态空间可能非常大或连续,直接求解往往不可行
- 奖励函数的设计会显著影响最优策略的质量
- 在实际应用中,通常需要在最优性和计算效率之间进行权衡
理解“最优”的含义
- 最大化预期累积折扣回报: 最优策略旨在最大化从任何状态开始的长期期望回报 \(G_t\)。
- 不一定是单步最优: 最优策略有时可能需要采取一个即时奖励较低的动作,以便进入一个更有利的未来状态,从而获得更高的长期回报(“牺牲小我,完成大我”)。
- 可能存在多个最优策略: 对于同一个 MDP,可能存在多个不同的策略都能达到相同的最优价值函数 \(V^*\) 和 \(Q^*\)。
- 依赖于 MDP 定义: 最优性是相对于给定的状态空间 \(S\)、动作空间 \(A\)、转移概率 \(P\)、奖励函数 \(R\) 和折扣因子 \(\gamma\) 而言的。改变其中任何一个,最优策略和价值函数都可能改变。
奖励函数 \(R\) 直接定义了智能体的目标。如果奖励函数设计不当(例如,只奖励短期行为而忽略长期后果),即使找到了该奖励函数下的“最优”策略,也可能无法实现真正的商业目标。设计一个能够准确反映长期商业价值的奖励函数是 RL 应用中的核心挑战。
Lab 1 (热身): 熟悉 Gym/Gymnasium 环境
本周的实验课旨在让大家动手实践,熟悉强化学习实验的基本流程和工具。
目标
- 安装并配置 Gym/Gymnasium 环境: 确保大家都能成功运行基本的 Gym 脚本。
- 理解环境交互循环: 掌握
reset
,step
,render
等核心函数的使用。 - **观察 \(S, A, R:\) 运行一个简单的随机策略智能体,观察状态、动作、奖励的变化。
- 概念练习: 将一个简单的商业场景映射到 Gym 环境的要素。
步骤
环境安装检查:
- 确保你已经按照上周讲义的指导,在虚拟环境中安装了
gymnasium
和gymnasium[classic_control]
。 - 尝试运行上周提供的 CartPole 随机智能体示例代码,确保能看到可视化窗口并且代码正常运行。
- 确保你已经按照上周讲义的指导,在虚拟环境中安装了
运行随机智能体:
- 仔细阅读 CartPole 示例代码。
- 尝试修改代码:
- 改变
range(1000)
中的数字,看看一个回合能持续多少步。 - 去掉
time.sleep(1)
,观察运行速度。 - 尝试另一个简单的环境,如 “MountainCar-v0” 或 “Acrobot-v1” (如果已安装
box2d-py
,可以尝试 “LunarLander-v2”)。观察它们的状态空间、动作空间和奖励结构有何不同。
import gymnasium as gym # env = gym.make("MountainCar-v0", render_mode="human") # env = gym.make("Acrobot-v1", render_mode="human") # env = gym.make("LunarLander-v2", render_mode="human") # 需要 box2d # ... (其余代码类似 CartPole)
- 改变
- 思考: 随机策略在这些环境中的表现如何?为什么?
理解环境交互循环:
- 在
step
函数前后打印observation
,action
,reward
,terminated
,truncated
的值。 - 理解
terminated
和truncated
的区别:terminated
: 环境达到了自然的终点(成功或失败)。truncated
: 环境因为外部限制(如时间步数)而提前结束。
- 查看
env.observation_space
和env.action_space
,了解状态和动作的类型与范围。
- 在
练习:定义简单商业场景为 Gym 环境 (概念或简化代码)
选择一个简单的商业场景,例如:
- 单商品库存管理:
- 目标:决定每天订购多少商品以最大化利润。
- 状态 (\(S\)): 当前库存水平 (离散或连续?)。可以简化为几个等级,如 [低, 中, 高]。
- 动作 (\(A\)): 订购数量 (离散?)。可以简化为 [不订购, 订购少量, 订购大量]。
- 奖励 (\(R\)): (销售收入) - (订购成本) - (库存持有成本) - (缺货惩罚)。如何量化这些值?
- 转移概率 (\(P\)): 假设已知每天的需求概率分布。根据当前库存、订购量和实际需求,计算下一天的库存水平。
- 折扣因子 (\(\gamma\)): 如何选择?取决于关注短期利润还是长期稳定?
- 简单广告投放:
- 目标:决定在哪个渠道投放广告以最大化点击率或转化率。
- 状态 (\(S\)): 可以简化为当前日期是工作日还是周末?或者用户的某个简单分类?
- 动作 (\(A\)): 选择渠道 A 或渠道 B。
- 奖励 (\(R\)): 该渠道带来的点击次数或转化价值。
- 转移概率 (\(P\)): 状态转移可能很简单(如第二天),或者依赖于用户行为。
- 折扣因子 (\(\gamma\)): 如果只关心单次投放效果,\(\gamma\) 可以为 0。如果考虑长期影响,\(\gamma > 0\)。
任务:
- 选择一个场景。
- 概念设计: 清晰地定义 \(S, A, R, P\) (可以描述性地说明转移逻辑), \(\gamma\)。
- (可选) 简化代码框架: 尝试编写一个 Python 类,模仿 Gym 环境的接口 (
__init__
,reset
,step
)。不需要完全实现复杂的逻辑,重点是定义接口和数据结构。
import gymnasium as gym from gymnasium import spaces import numpy as np class SimpleInventoryEnv(gym.Env): = {'render_modes': [], 'render_fps': 4} # 元数据 metadata def __init__(self, max_inventory=20, max_order=5, demand_dist=[0.1, 0.6, 0.3]): super().__init__() # 调用父类构造函数 self.max_inventory = max_inventory self.max_order = max_order self.demand_dist = demand_dist # 假设需求是 0, 1, 2 的概率 self.possible_demands = np.arange(len(demand_dist)) # 定义状态空间:库存水平 (0 到 max_inventory) self.observation_space = spaces.Discrete(max_inventory + 1) # 定义动作空间:订购数量 (0 到 max_order) self.action_space = spaces.Discrete(max_order + 1) # 内部状态变量 self._current_inventory = 0 def _get_obs(self): return self._current_inventory def _get_info(self): # 可以返回一些辅助信息,例如实际需求量 # return {"demand": self._last_demand} return {} def reset(self, seed=None, options=None): super().reset(seed=seed) # 处理随机种子 # 重置库存为 0 (或其他初始值) self._current_inventory = 0 = self._get_obs() observation = self._get_info() info return observation, info def step(self, action): # 1. 获取订购量 (动作) = action order_quantity # 2. 计算订购后的库存 (假设立即到货) = self._current_inventory + order_quantity inventory_after_order # 限制最大库存 = min(inventory_after_order, self.max_inventory) inventory_after_order # 3. 模拟随机需求 = self.np_random.choice(self.possible_demands, p=self.demand_dist) demand self._last_demand = demand # 记录需求,可选 # 4. 计算满足的需求 (销售量) = min(inventory_after_order, demand) sales # 5. 计算下一时刻的库存 self._current_inventory = inventory_after_order - sales # 6. 计算奖励 (简化示例) # 假设:售价=10, 订购成本=3, 持有成本=1, 缺货惩罚=2 = sales * 10 revenue = order_quantity * 3 order_cost = self._current_inventory * 1 # 期末库存持有成本 holding_cost = max(0, demand - inventory_after_order) * 2 # 缺货成本 shortage_cost = revenue - order_cost - holding_cost - shortage_cost reward # 7. 确定是否结束 (在这个简单模型中,可以假设永不结束) = False terminated = False # 也可以设置最大步数 truncated = self._get_obs() observation = self._get_info() info return observation, reward, terminated, truncated, info def render(self): # 这个简单环境不需要可视化 pass def close(self): pass # --- 如何使用 --- # env = SimpleInventoryEnv() # observation, info = env.reset() # for _ in range(100): # action = env.action_space.sample() # 随机选择订购量 # observation, reward, terminated, truncated, info = env.step(action) # print(f"Inv: {observation}, Action: {action}, Reward: {reward}") # if terminated or truncated: # break # env.close()
- 单商品库存管理:
提交要求
- 确保你的 Python 环境可以运行 Gym/Gymnasium 示例。
- 完成商业场景的概念设计 (\(S, A, R, P, \gamma\))。
- (可选) 提交你尝试编写的简化 Gym 环境代码框架。
- 思考: 在你设计的商业场景中,马尔可夫性质是否容易满足?状态需要包含哪些信息才能更好地近似它?
下周预告: 开始学习无模型预测方法 - 蒙特卡洛 (Monte Carlo) 方法。