【强化学习教程——01_强化学习基石】第03章_动态规划与策略迭代

第 3 章:动态规划与策略迭代

本章目标:学习使用动态规划 (DP) 算法在已知环境模型的情况下求解最优策略,掌握策略迭代 (Policy Iteration) 与价值迭代 (Value Iteration) 的核心逻辑。


📖 目录 (Table of Contents)

  1. 动态规划的前提
  2. 策略评估 (Policy Evaluation)
  3. 策略改进 (Policy Improvement)
  4. 策略迭代 (Policy Iteration)
  5. 价值迭代 (Value Iteration)
  6. 广义策略迭代 (GPI)
  7. 总结与预告

1. 动态规划的前提

动态规划 (DP) 需要完整的环境模型:

  • 状态转移概率 P ( s ′ ∣ s , a ) P(s'|s,a) P(s′∣s,a) 已知
  • 奖励函数 R ( s , a , s ′ ) R(s,a,s') R(s,a,s′) 已知

这意味着我们不需要去"探索"环境,而是可以直接计算最优解(Planning)。


2. 策略评估 (Policy Evaluation)

目标 :给定策略 π \pi π,计算其状态价值函数 V π V^\pi Vπ。

V k + 1 ( s ) = ∑ a π ( a ∣ s ) R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k ( s ′ ) V_{k+1}(s) = \sum_a \pi(a|s) \left R(s,a) + \\gamma \\sum_{s'} P(s'\|s,a) V_k(s') \\right Vk+1(s)=a∑π(a∣s)R(s,a)+γs′∑P(s′∣s,a)Vk(s′)

代码实现 (Policy Evaluation)

python 复制代码
def policy_evaluation(env, policy, gamma=0.99, theta=1e-6):
    """策略评估:迭代计算 V^π"""
    states = env.get_states()
    V = {s: 0.0 for s in states}

    while True:
        delta = 0
        for s in states:
            v = V[s]
            # 根据策略计算期望
            new_v = 0
            for a in env.get_actions():
                prob = policy.get((s, a), 0)
                if prob > 0:
                    s_next, r, _ = env.step(s, a)
                    new_v += prob * (r + gamma * V.get(s_next, 0))
            V[s] = new_v
            delta = max(delta, abs(v - V[s]))

        if delta < theta:
            break

    return V

3. 策略改进 (Policy Improvement)

目标 :基于当前的 V π V^\pi Vπ,修改策略以获得更大的长期回报。

贪婪策略 (Greedy Policy) :
π ′ ( s ) = arg ⁡ max ⁡ a R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V π ( s ′ ) \pi'(s) = \arg\max_a \left R(s,a) + \\gamma \\sum_{s'} P(s'\|s,a) V\^\\pi(s') \\right π′(s)=argamaxR(s,a)+γs′∑P(s′∣s,a)Vπ(s′)

代码实现 (Policy Improvement)

python 复制代码
def policy_improvement(env, V, gamma=0.99):
    """策略改进:基于 V 提取贪婪策略"""
    policy = {}

    for s in env.get_states():
        action_values = {}
        for a in env.get_actions():
            s_next, r, _ = env.step(s, a)
            action_values[a] = r + gamma * V.get(s_next, 0)

        best_action = max(action_values, key=action_values.get)
        policy[s] = best_action

    return policy

4. 策略迭代 (Policy Iteration)

图解说明:

  • 蓝色循环:策略评估 (Evaluation) - 计算当前策略的价值 V。
  • 红色循环:策略改进 (Improvement) - 根据价值 V 改进策略 π。
  • 收敛 :两者交替进行,直到策略不再改变,此时达到最优策略 π ∗ \pi^* π∗。

代码实现 (Policy Iteration)

python 复制代码
import numpy as np

def policy_iteration(env, gamma=0.99):
    """策略迭代:交替评估和改进"""
    # 初始化随机策略
    states = env.get_states()
    actions = env.get_actions()
    policy = {s: np.random.choice(actions) for s in states}

    while True:
        # 1. 策略评估
        V = policy_evaluation(env, policy, gamma)

        # 2. 策略改进
        new_policy = policy_improvement(env, V, gamma)

        # 检查收敛
        if new_policy == policy:
            break
        policy = new_policy

    return policy, V

5. 价值迭代 (Value Iteration)

思想:不必等待策略评估完全收敛,我们可以每更新一次 V 就贪婪地改进策略,或者直接合并这两个步骤。

V k + 1 ( s ) = max ⁡ a R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k ( s ′ ) V_{k+1}(s) = \max_a \left R(s,a) + \\gamma \\sum_{s'} P(s'\|s,a) V_k(s') \\right Vk+1(s)=amaxR(s,a)+γs′∑P(s′∣s,a)Vk(s′)

代码实现 (Value Iteration)

python 复制代码
def value_iteration(env, gamma=0.99, theta=1e-6):
    """价值迭代:直接计算 V*"""
    states = env.get_states()
    V = {s: 0.0 for s in states}

    while True:
        delta = 0
        for s in states:
            v = V[s]
            # 直接取最大动作价值
            action_values = []
            for a in env.get_actions():
                s_next, r, _ = env.step(s, a)
                action_values.append(r + gamma * V.get(s_next, 0))
            V[s] = max(action_values) if action_values else 0
            delta = max(delta, abs(v - V[s]))

        if delta < theta:
            break

    # 最后提取一次最优策略
    policy = policy_improvement(env, V, gamma)
    return policy, V

6. 广义策略迭代 (GPI)

图解说明:

  • 核心思想:策略评估(让价值函数逼近当前策略的真实价值)和策略改进(让策略对于当前价值函数贪婪)是两个竞争又合作的过程。
  • GPI:并不要求每次步骤都完美收敛,只要这两个过程持续进行,最终就会收敛到最优解。

7. 总结与预告

本章核心:

  • 动态规划 是一种基于模型的规划方法 (Planning)。
  • 策略迭代 分离了评估和改进,比较稳健。
  • 价值迭代 融合了两者,通常收敛更快。

下一章预告 :

如果我们不知道环境模型(不知道 P 和 R 怎么办)?我们将进入 Model-Free 的世界,学习蒙特卡洛方法。

➡️ 下一章:第 4 章:蒙特卡洛方法

相关推荐
UIU1144 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场4 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi4 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David5 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院6 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng6 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~9 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py10 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing11 小时前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客11 小时前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法