2026/10/31 2:34:05

强化学习数学原理:从马尔科夫决策过程到贝尔曼方程

强化学习数学原理:从马尔科夫决策过程到贝尔曼方程 简介《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著面向具备线性代数、概率论与基础优化知识的研究生及算法工程师系统解决强化学习理论根基薄弱、公式推导模糊、算法理解流于表面等核心痛点。全书以数学严谨性为纲从网格世界等直观示例切入逐步展开马尔可夫决策过程、贝尔曼方程及其矩阵形式、值迭代与策略迭代收敛性、蒙特卡洛与时间差分方法的随机逼近本质、值函数近似与策略梯度的泛函分析视角并在附录中严格论证序列收敛性形成闭环理论体系。资源为单文件PDF18.9MB内容完整覆盖10章正文与附录排版清晰、公式规范、示例丰富适合作为高校RL课程补充教材或算法研发人员深度研读的数学参考手册。目前已有847人学习下载是少有的兼顾数学深度与教学可读性的强化学习原理型著作。1. 强化学习是什么——别被“智能体”“马尔科夫”吓住它其实就像学骑自行车你有没有试过教一个完全没骑过车的人上路一开始他摇摇晃晃踩错踏板、压不住龙头、突然刹车摔一跤……但每次摔倒后他都会下意识调整这次手扶得更稳一点蹬得更匀一点转弯前先减速——他没看公式也没背定理只是靠一次次试错把“怎么做才不容易摔”这件事慢慢刻进了身体里。强化学习Reinforcement Learning说白了就是让机器也这样“学骑车”。它不靠人手写规则比如“看到红灯就停”也不靠海量标注数据喂模型比如“这10万张图里有猫”而是让一个叫“智能体”的程序在一个模拟环境里反复行动、观察反馈、调整策略——核心就三件事做动作 → 看奖励 → 改做法。这本书《强化学习的数学原理》不是讲怎么调参跑通一个游戏AI而是回到最源头问为什么“看奖励改做法”这个朴素逻辑真能收敛到好策略贝尔曼方程到底在算什么值迭代和策略迭代差别真只是“先更新值还是先更新策略”这么简单吗Q-learning 为什么敢一边乱试一边学最优解——它用数学语言把骑车时那些“身体记住的感觉”翻译成你能看懂的推导、例子和图示。适合谁✅ 完全没碰过强化学习但学过高中数学、大学线性代数和概率论比如知道什么是期望、矩阵乘法、条件概率✅ 被网上教程里的“状态-动作-奖励”绕晕想搞清它们之间到底怎么咬合✅ 看过《动手学强化学习》《Deep Reinforcement Learning Hands-On》这类书但卡在“为什么贝尔曼方程成立”“为什么策略迭代一定收敛”上想补那块“看不见的底座”。它不教你写 PyTorch不带你打 Atari 游戏但它会告诉你当你敲下q_target reward gamma * q_next.max()这行代码时背后站着的是哪一条数学定理、哪一个收敛证明、哪一次对“长期回报”的重新定义。这不是一本速成手册而是一把解剖刀——专切开强化学习里那些被当成“玄学”糊弄过去的黑匣子。2. 先搞懂一个概念强化学习的骨架不是代码是“马尔科夫决策过程MDP”很多人一上来就想跑 DQN结果连环境建模都出错该设成离散状态还是连续状态奖励函数怎么设计才算合理动作空间要不要加约束——这些问题根源不在代码而在你心里有没有搭起一个清晰的 MDP 框架。MDP 不是高大上的术语它是描述“智能体如何与环境互动”的最小必要模型就像乐高说明书里那张“零件清单连接方式图”。它只包含五个东西状态集 S比如网格世界里每个格子的位置动作集 A上下左右移动状态转移概率 P(s′|s,a)在位置 s 向右走有 90% 概率到达右边格子10% 滑到下面格子奖励函数 R(s,a,s′)从 s 向右走到 s′获得 1 分撞墙则 -5 分折扣因子 γ ∈ [0,1)未来奖励打个折比如 γ0.9 表示“明天的 1 块钱只值今天的 0.9 块”。这五样东西凑齐你就有了一个可分析、可求解、可证明的强化学习问题。缺任何一样后续所有算法值迭代、Q-learning、策略梯度都像在流沙上盖楼。2.1 为什么非得是“马尔科夫”——甩掉历史包袱才能算得动你可能会问现实里智能体当然记得自己之前干过啥啊比如机器人扫地它得知道“刚才已经扫过客厅左半边”否则会重复劳动。那为啥 MDP 强制要求“下一状态只取决于当前状态和动作”把历史全扔掉这不是偷懒是计算可行性的生死线。假设扫地机器人有 100 个传感器读数每个读数有 10 种可能值那历史序列长度为 10 时可能的历史组合就是 10¹⁰⁰ ——比宇宙原子数还多。你根本存不下更别说算期望了。而马尔科夫性Markov Property说“只要我把当前状态 s 设计得足够聪明它就能打包所有需要的历史信息。” 举个具体例子在网格世界里如果状态只记“坐标 (x,y)”那它就不满足马尔科夫性——因为从 (2,2) 向右走可能到 (3,2)但如果上一步刚撞过墙系统可能有惯性实际去向不确定。✅ 正确做法把状态扩展成(x,y, last_action, is_wall_hit)。这个新状态包含了影响下一步的关键历史于是转移概率 P(s′|s,a) 就能稳定下来算法才有得算。提示初学者最容易犯的错就是把状态设得太“轻”——只记显眼信息如坐标、血量却忘了那些隐性但关键的上下文如冷却时间、能量剩余、上一步动作。状态设计不是技术活是建模直觉多问一句“仅凭这个状态我能准确预测下一步吗”就能避开大坑。2.2 奖励函数不是“给分”而是“定义目标”的接口新手常把奖励函数当成“打分器”做对了1做错了-1。但书中第 1.5 节明确指出奖励是任务目标的唯一编码方式。你给的每一个数字都在悄悄告诉智能体“我真正想要的是什么”。比如训练一个机械臂抓杯子❌ 错误设计每次靠近杯子0.1碰到杯子0.5抓起来1.0。→ 结果智能体学会悬浮在杯子上方疯狂抖动刷“靠近”分永远不真正抓取。✅ 正确设计只在成功抓起并稳定保持 2 秒后给 10.0其余时刻全为 0掉落或超时给 -5.0。→ 奖励信号极度稀疏但目标无比清晰不是“靠近”是“稳定抓取”。书中网格世界例子1.1 节就用这种极简设计终点格子奖励 10其他格子全为 0撞墙 -10。没有中间分没有鼓励探索的 bonus纯粹用终局结果倒逼策略进化。这种“吝啬”的奖励设计恰恰是数学分析能落地的前提——它让回报return的定义干净利落Gₜ Rₜ₊₁ γRₜ₊₂ γ²Rₜ₊₃ …2.3 “Episode”不是“一局游戏”而是“一次完整因果链”的边界你玩《超级马里奥》时死亡就是 episode 结束训练四足机器人行走时摔倒就是 episode 结束。但为什么需要 episode能不能一直跑下去书中 1.6 节点明episode 是为了定义有限长度的轨迹trajectory从而让回报 Gₜ 的数学期望有意义。如果没有 episode即无限持续任务而 γ1那 Gₜ 可能发散比如每步都1总和无穷大如果 γ1虽能收敛但“长期”变得模糊——100 步后的奖励权重只剩 γ¹⁰⁰几乎为 0那到底该关注未来几步Episode 给出了天然截断点从初始状态 s₀ 开始到某个终止状态 sₜ如游戏结束、机器人摔倒为止这一串 (s₀,a₀,r₁,s₁,a₁,r₂,…,sₜ) 就是一个 episode。所有蒙特卡洛方法Chapter 5都依赖这个结构——它们直接拿整个 episode 的实际累计奖励去估计状态值。注意不是所有任务都有自然 episode。比如股票交易、网络路由得人为设定“一天”“一小时”为一个 episode或改用持续性任务continuing task框架这时必须用 γ1 保证收敛。选哪种取决于你的问题本质而不是“哪个算法更酷”。2.4 常见问题排查MDP 建模翻车现场实录新手在搭建第一个 MDP 时90% 的 bug 都集中在状态、动作、奖励这三件套。以下是赵老师书里没明说、但我在带某高校本科生做课程设计时血泪总结的 4 个高频雷区现象 1训练半天智能体原地不动或者疯狂撞墙→ 原因奖励函数严重失衡。比如终止状态奖励 1而每步移动惩罚 -0.01那智能体发现“不动”比“冒险移动”得分更高0 -0.01×步数。→ 解决先关掉所有负奖励只保留终局正奖励等策略能走出第一步后再逐步加入合理惩罚如每步 -0.001撞墙 -1。现象 2值迭代结果震荡V(s) 在几个数之间跳来跳去不收敛→ 原因状态转移概率 P(s′|s,a) 没归一化。比如某状态下向右走你写了 P(右)0.6, P(下)0.5加起来 1.1系统就懵了。→ 解决对每个 (s,a) 对手动检查sum(P(s′|s,a) for s′ in S)是否严格等于 1.0允许 1e-10 浮点误差。书中 1.3 节的表格例子里每一行概率和都是 1这就是铁律。现象 3策略迭代中策略 π 更新后新策略的值函数 V^π 却比旧策略还差→ 原因策略评估Policy Evaluation没跑够轮数。书中 4.2.1 节强调策略评估需迭代至收敛或误差 ε若只跑 1~2 轮就急着改进策略V^π 是假的改进必然失效。→ 解决监控每轮策略评估的 ∞-范数误差max_s |V_new(s) - V_old(s)|确保它降到 1e-4 以下再进入策略改进。现象 4用 Q-learning 训练Q 值爆炸增长动辄上万loss 曲线直冲云霄→ 原因奖励尺度与网络输出不匹配。比如奖励是 [-10, 10]但神经网络最后一层用 ReLUQ 值只能 ≥0且无界梯度爆炸。→ 解决① 奖励归一化如除以最大可能奖励绝对值② Q 网络输出层用 tanh 或线性层 输出裁剪③ 关键在 Chapter 8 的函数逼近部分务必加上目标网络target network和梯度裁剪gradient clipping这是赵老师在 8.4.1 节埋下的救命稻草。3. 贝尔曼方程不是公式是“价值的递归定义”——手把手推导第一个网格世界如果你只记住贝尔曼方程长什么样V(s) Σₐ π(a|s) Σₛ′ P(s′|s,a)[R(s,a,s′) γV(s′)]却不知道它从哪来、为什么必须长这样那后面所有算法对你都是空中楼阁。赵老师在 Chapter 2 开篇就用一个 3×3 网格世界p.13把贝尔曼方程掰开揉碎讲透这不是神谕而是“价值”这个概念不得不满足的等式。3.1 从直觉出发为什么“状态值”必须考虑未来先忘掉公式。想象你站在网格世界的 (1,1) 格左上角目标是右下角 (3,3) 的宝藏奖励 10。你有两个选择向右走到 (1,2)然后往下先往下到 (2,1)再往右。哪条更好光看第一步奖励没用——因为 (1,2) 和 (2,1) 本身都没奖励R0但它们通往宝藏的“潜力”不同。这个“潜力”就是状态值 V(s)它代表“从 s 出发按当前策略走下去未来所有奖励的折扣和的期望值”。关键来了V(s) 的定义里“未来所有奖励”包括了“下一步的奖励 R(s,a,s′)”和“s′ 之后的所有奖励”。而 s′ 之后的所有奖励的期望值不就是 V(s′) 吗→ 所以 V(s) 自然等于对所有可能动作 a按策略 π 选、所有可能下一状态 s′按 P 转移算加权平均[R(s,a,s′) γ × V(s′)]。这就是贝尔曼方程的灵魂价值是即时奖励与后续价值的递归组合。它不是发明是定义闭环的必然结果。3.2 动手算用纸笔解出 3×3 网格的 V(s)γ0.9我们简化问题只考虑确定性环境P1策略 π 固定为“总是往右直到最右列再往下”即贪心策略。网格如下坐标从 1 开始(1,1) (1,2) (1,3) (2,1) (2,2) (2,3) (3,1) (3,2) (3,3) ← 终止R10所有非终止格子 R0撞墙如从 (1,3) 往右R-10 并终止。按策略路径唯一(1,1)→(1,2)→(1,3)→(2,3)→(3,3)。我们从终点倒推这是解贝尔曼方程的核心技巧V(3,3) 0 终止状态无后续V(2,3)从 (2,3) 向下到 (3,3)R0所以 V(2,3) 0 0.9 × V(3,3) 0V(1,3)向下到 (2,3)R0V(1,3) 0 0.9 × V(2,3) 0V(1,2)向右到 (1,3)R0V(1,2) 0 0.9 × V(1,3) 0V(1,1)向右到 (1,2)R0V(1,1) 0 0.9 × V(1,2) 0咦全是 0不对因为我们漏了终止奖励。正确做法终止状态的 V(s) 不是 0而是它带来的即时奖励。标准定义中V(s) 是“从 s 开始执行动作后获得的 R 加上后续 V”所以当 s 是终止状态它不执行动作V(s) 就是它作为终点的价值——即 10。修正V(3,3) 10 宝藏本身V(2,3) R((2,3),↓,(3,3)) γ×V(3,3) 0 0.9×10 9.0V(1,3) R((1,3),↓,(2,3)) γ×V(2,3) 0 0.9×9.0 8.1V(1,2) R((1,2),→,(1,3)) γ×V(1,3) 0 0.9×8.1 7.29V(1,1) R((1,1),→,(1,2)) γ×V(1,2) 0 0.9×7.29 6.561看V 值从终点向起点衰减完美体现“越靠近宝藏价值越高且未来越远折扣越大”。这就是贝尔曼方程在说话。3.3 矩阵形式把 100 个状态的方程压成一个 AXb当状态数变多比如 100×100 网格手算 V(s) 不现实。Chapter 2.6 把贝尔曼方程升级为矩阵语言这是数值求解的钥匙。对固定策略 π定义向量v∈ ℝ^|S|v[i] V(sᵢ)所有状态值堆成一列矩阵P^π∈ ℝ^|S|×|S|P^π[i,j] Σₐ π(a|sᵢ) P(sⱼ|sᵢ,a)即从 sᵢ 按 π 走到 sⱼ 的总概率向量r^π∈ ℝ^|S|r^π[i] Σₐ π(a|sᵢ) Σₛ′ P(s′|sᵢ,a) R(sᵢ,a,s′)即从 sᵢ 按 π 走的期望即时奖励。则贝尔曼方程变为v r^π γ P^π v移项得(I - γ P^π) v r^π这就成了标准线性方程组 AX b其中 A I - γ P^πX vb r^π。只要 A 可逆γ1 时必可逆书中 2.7.1 节证明就能闭式求解v (I - γ P^π)⁻¹ r^π。提示这个公式看着漂亮但 |S| 大时求逆 O(|S|³) 太贵。所以实践中用迭代法2.7.2 节v_{k1} r^π γ P^π v_k。它就像滚雪球从任意初值 v₀比如全 0开始每轮用旧 v 算新 v几轮后就收敛。书中 Table 2.1 展示了 3×3 网格迭代 5 轮后V 值就逼近手算结果这就是“不动点迭代”的魔力。3.4 从状态值到动作值Q(s,a) 是“做这个动作值不值”的快照V(s) 告诉你“在 s 点按当前策略走下去有多好”但它不告诉你“此刻该不该向右走”。要回答这个需要Q(s,a)在状态 s 执行动作 a 后再按策略 π 走下去的期望回报。Q 与 V 的关系极简Q(s,a) Σₛ′ P(s′|s,a) [R(s,a,s′) γ V(s′)]注意这里没对 a 求和a 是给定的Q 是“动作层面”的价值快照。继续用上面的 3×3 网格策略仍是“右→右→下→下”Q((1,1), 右) R((1,1),右,(1,2)) γ V(1,2) 0 0.9×7.29 6.561Q((1,1), 下) R((1,1),下,(2,1)) γ V(2,1)→ 但 V(2,1) 是多少按策略(2,1) 应该先右到 (2,2)再右到 (2,3)再下到 (3,3)所以 V(2,1) 0.9×V(2,2) 0.9×(0.9×V(2,3)) 0.9²×9.0 7.29→ Q((1,1), 下) 0 0.9×7.29 6.561咦一样因为在这个确定性、单路径策略下两条路最终都通向同一条黄金路径价值相同。但一旦环境有随机性比如向右有 10% 滑到下方Q 值就会分化——Q((1,1),右) 可能 6.5Q((1,1),下) 可能 5.8这时策略改进Chapter 3就会把 π((1,1)) 从“下”改成“右”。注意Q(s,a) 的贝尔曼方程2.8.2 节是 Q(s,a) Σₛ′ P(s′|s,a) [R(s,a,s′) γ Σₐ′ π(a′|s′) Q(s′,a′)]。它比 V 的方程多一层求和因为 s′ 后的动作 a′ 是按 π 选的。这也是为什么 Q-learningChapter 7.4能脱胎于此——它把 Σₐ′ π(a′|s′) Q(s′,a′) 换成 maxₐ′ Q(s′,a′)瞬间从“评估”跃升为“找最优”。3.5 常见问题排查贝尔曼方程计算翻车指南哪怕你把公式抄对了实现时仍可能得到荒谬结果。以下是基于赵老师书中例题和某跨平台系统实战的 4 条硬核经验现象 1迭代计算 V(s) 时值越来越大甚至溢出 inf→ 原因γ 设成了 1.0。当 γ1 且存在循环如 (1,1)→(1,2)→(1,1)V 会无限累加 R发散。→ 解决γ 必须 1。初学者建议从 0.9 开始若任务需长远规划可试 0.99但务必监控迭代误差是否收敛。现象 2矩阵求逆 (I - γP)^-1 报错 “矩阵奇异”→ 原因P 矩阵构造错误。常见于① 某状态 sᵢ 没定义任何转移P^π[i,:] 全 0导致 I - γP 第 i 行全 1② 状态间不连通如两个独立子图P 分块对角I - γP 有零特征值。→ 解决用np.linalg.matrix_rank(I - gamma*P)检查秩或直接用迭代法它对病态矩阵更鲁棒。现象 3Q(s,a) 值算出来比所有 V(s′) 都小明显不合理→ 原因奖励 R(s,a,s′) 的符号搞反了。书中定义 R 是智能体获得的奖励但代码里可能误写成环境“付出”的成本如 R-1 表示智能体损失 1。→ 解决统一约定 R 0 为收益R0 为惩罚打印几个 (s,a,s′) 的 R 值对照网格世界手算验证。现象 4用 Q 值更新策略后新策略的性能反而下降→ 原因策略改进时用了 Q(s,a) 的估计值而非真实值。书中 3.4 节强调改进需满足π′(s) argmaxₐ Q^π(s,a)。但如果 Q^π 本身噪声大如蒙特卡洛估计方差高argmax 会选错。→ 解决① 用更稳定的估计如 TD 学习比 MC 方差小② 策略改进加平滑如 ε-greedyChapter 5.4③ 关键确保 Q^π 已充分收敛误差 0.01再改进。4. 从“评估”到“优化”值迭代与策略迭代哪个才是你的第一把瑞士军刀学到这里你已能算出任意策略 π 的价值 V^π策略评估也能根据 Q^π 改进策略策略改进。但问题来了怎么找到最优策略 π*Chapter 4 给出两条主路值迭代Value Iteration和策略迭代Policy Iteration。它们不是竞争关系而是同一枚硬币的两面——一个聚焦“值”一个聚焦“策”但终极目标都是让贝尔曼最优方程BOE成立V*(s) maxₐ Σₛ′ P(s′|s,a)[R(s,a,s′) γV*(s′)]。很多教程把它们讲成“算法A vs 算法B”但赵老师在 4.1 和 4.2 开篇就点破值迭代是策略迭代的极限特例。当策略迭代中策略评估只做 1 轮甚至 0 轮就立刻改进策略那就是值迭代。理解这点你就不会纠结“该选哪个”而会看“我的问题需要多准的 V^π 估计”。4.1 值迭代用“价值”本身当导航仪一步一挪向最优值迭代不显式存策略它只维护一个 V(s) 向量并不断用 BOE 更新V_{k1}(s) maxₐ Σₛ′ P(s′|s,a)[R(s,a,s′) γ V_k(s′)]它像一个盲人手里只有当前对各点“价值”的粗糙估计每走一步就用这个估计重新校准所有点的新价值。为什么它能收敛到 V*书中 3.3.4 节用“压缩映射”contraction mapping解释BOE 的右侧算子 T满足 ||T(V₁) - T(V₂)|| ≤ γ ||V₁ - V₂||。因为 γ1每次应用 T两个函数的距离至少压缩 γ 倍。从任意 V₀ 开始V₁T(V₀), V₂T(V₁),…就像橡皮筋被越拉越短最终缩到唯一不动点 V*。动手跑3×3 网格的值迭代γ0.9初始化 V₀(s) 0 对所有 s。第 1 轮V₁(3,3) maxₐ [...] 10终止状态无动作直接取奖励V₁(2,3) max{ 下: 0 0.9×10 9.0 } 9.0V₁(1,3) max{ 下: 0 0.9×9.0 8.1 } 8.1V₁(1,2) max{ 右: 0 0.9×8.1 7.29 } 7.29V₁(1,1) max{ 右: 0 0.9×7.29 6.561, 下: 0 0.9×V₀(2,1)0 } 6.561→ 注意V₀(2,1)0所以“下”的选项暂时不如“右”。第 2 轮V₂(2,1) max{ 右: 0 0.9×V₁(2,2), 下: 0 0.9×V₁(3,1) }但 V₁(2,2)、V₁(3,1) 还是 0所以 V₂(2,1) 仍为 0。直到第 3 轮V₁(2,2) 被更新从 (1,2) 右或 (2,1) 下V 值才像涟漪般扩散开。书中 Table 4.1 显示10 轮后 V 值已非常接近手算结果。提示值迭代的“策略”是隐式的——每轮更新 V 时记录下取得 max 的动作 a*最后所有 s 的 a* 就构成 π*。这就是为什么它内存省只存 V但收敛慢需多轮传播。4.2 策略迭代先画张粗糙地图再一步步擦亮它策略迭代分两步走策略评估PE对当前 πₖ精确算出 V^{πₖ}用迭代法解 v r^π γP^π v策略改进PI用 V^{πₖ} 构造新策略 πₖ₊₁(s) argmaxₐ Q^{πₖ}(s,a)。它像一个谨慎的探险家先花时间把当前路线πₖ的每一段价值摸清楚PE再基于这张“高清地图”决定下一站怎么走PI。为什么它通常比值迭代快因为 PE 一步到位给出 V^{πₖ} 的高精度估计PI 基于此做出的改进更可靠。书中 Figure 4.1 对比显示在 10×10 网格策略迭代 5 轮就收敛值迭代要 30 轮。但代价是什么PE 需要解线性方程组或迭代至收敛计算量大。尤其当 |S| 大时PE 成为瓶颈。动手跑策略迭代的“两步舞”从随机策略 π₀ 开始比如所有 s 都选“右”。PE解 v r^{π₀} 0.9 P^{π₀} v得 V^{π₀}。PI对每个 s算 Q^{π₀}(s,a) Σₛ′ P(s′|s,a)[R(s,a,s′) 0.9 V^{π₀}(s′)]选 max Q 的 a 为 π₁(s)。→ 新策略 π₁ 会修正 π₀ 的明显错误如 (3,2) 向右撞墙现在改向下。再 PE用 π₁ 算 V^{π₁}通常比 V^{π₀} 更优。→ 如此循环策略质量阶梯式上升。注意策略迭代的“策略”是显式的每轮都输出一个可用的 πₖ。这意味着即使你中途停止比如只跑 2 轮得到的 π₂ 也比 π₀ 好得多——这对需要“渐进式交付”的工业项目很友好。4.3 截断策略迭代在速度与精度间找到你的甜点纯策略迭代太重纯值迭代太慢怎么办Chapter 4.3 提出“截断策略迭代”Truncated Policy IterationPE 只做 k 轮迭代不求完全收敛就用这个近似 V^{πₖ} 去改进策略。k1 就是“值迭代”因为 V_{k1}(s) maxₐ Σₛ′ P[... γ V_k(s′)]正是 1 轮 PE PIk∞ 就是标准策略迭代。怎么选 kk1最快内存最少适合在线学习、嵌入式设备k5~10平衡之选多数场景推荐k∞当策略评估本身很快如 |S| 小或 P 稀疏且你追求理论最优性。书中 4.3.1 节的对比实验Table 4.2显示在 50 状态 MDP 上k3 的截断策略迭代收敛轮数比值迭代少 40%比完整策略迭代计算量少 60%。4.4 常见问题排查值/策略迭代的 5 个隐形陷阱这些坑不跑代码绝不会信但一踩就废半天现象 1值迭代 V(s) 收敛了但提取的策略 π在仿真中表现奇差*→ 原因V(s) 收敛标准太松。比如设max|V_{k1}-V_k| 0.1但最优动作的 Q 值差可能只有 0.05此时 argmax 会选错。→ 解决收敛阈值设为 0.001 或更小或直接监控策略变化当 πₖ 与 πₖ₋₁ 完全一致时再停。现象 2策略迭代中PE 步骤死循环V 值不降反升→ 原因P^{π} 矩阵构造错误导致 (I - γP^{π}) 特征值模 ≥1迭代 v_{k1} r^π γP^π v_k 发散。→ 解决用np.linalg.eigvals(I - gamma*P_pi)本文还有配套的精品资源点击获取