【强化学习教程——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)=argamax[R(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)=amax[R(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 章:蒙特卡洛方法

相关推荐
Sag_ever18 小时前
时间复杂度与空间复杂度超详细入门讲解
算法
念越18 小时前
算法每日一题 Day03|快慢双指针解决快乐树问题
算法·力扣
ZPC821018 小时前
MoveGroup 规划轨迹 → 直接交给 MoveIt2 Servo 执行
人工智能·算法·计算机视觉·机器人
️是7818 小时前
信息奥赛一本通—编程启蒙(3373:练64.2 图像旋转翻转变换)
数据结构·c++·算法
木子墨51619 小时前
LeetCode 热题 100 精讲 | 计算几何篇:点积叉积 · 线段相交 · 凸包 · 多边形面积
c++·算法·leetcode·职场和发展·动态规划
源码之家19 小时前
计算机毕业设计:Python棉花产业数据可视化与预测系统 Django框架 ARIMA算法 数据分析 可视化 爬虫 大数据 大模型(建议收藏)✅
人工智能·python·算法·信息可视化·数据挖掘·django·课程设计
py有趣19 小时前
力扣热门100题之最小路径和
算法·leetcode
qeen8719 小时前
【算法笔记】前缀和经典题目解析
c语言·c++·笔记·学习·算法
Je1lyfish19 小时前
Haskell 初探
开发语言·笔记·算法·rust·lisp·抽象代数
im_AMBER19 小时前
Leetcode 159 无重复字符的最长子串 | 长度最小的子数组
javascript·数据结构·学习·算法·leetcode