【强化学习教程——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 章:蒙特卡洛方法

相关推荐
用户938515635073 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC4 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥5 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者6 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者6 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月9 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星10 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星10 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC1 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode