当前位置: 首页 > news >正文

04-动态规划

动态规划(Dynamic Programming, DP)

1. 理论基础

动态规划是一类用于求解最优决策问题的算法。在强化学习中,动态规划用于已知环境模型(即已知MDP的状态转移概率和奖励函数)的情况下,通过迭代计算状态值函数或动作值函数,找到最优策略。

2. 价值函数与贝尔曼方程

  • 状态值函数V^π(s) 表示在状态s下,按照策略π行动后能获得的期望累积奖励。
  • 动作值函数Q^π(s, a) 表示在状态s下采取动作a,后续按照策略π行动的期望累积奖励。
  • 贝尔曼方程
    V^π(s) = Σ_a π(a|s) Σ_{s'} P(s'|s,a) [ R(s,a) + γ V^π(s') ]
    
    该方程描述了当前状态的价值等于所有可能动作和转移的加权期望。

3. 价值迭代(Value Iteration)

3.1 算法原理

  • 价值迭代通过反复更新状态值函数,逐步逼近最优值函数V*
  • 每次迭代根据贝尔曼最优方程更新:
    V_{k+1}(s) = max_a Σ_{s'} P(s'|s,a) [ R(s,a) + γ V_k(s') ]
    
  • 收敛后,最优策略为:
    π*(s) = argmax_a Σ_{s'} P(s'|s,a) [ R(s,a) + γ V*(s') ]
    

3.2 伪代码

初始化 V(s) = 0
重复:对每个状态 s:V_new(s) = max_a Σ_{s'} P(s'|s,a) [ R(s,a) + γ V(s') ]如果所有状态的 V_new(s) 与 V(s) 差异足够小,则停止否则 V(s) ← V_new(s)

3.3 流程图(可用Mermaid或维基百科图片)

  • 推荐图片:Value iteration
  • 引用:
    [外链图片转存中…(img-DTzm8Ovw-1751461173012)]

3.4 价值迭代Python代码示例

import numpy as np# 假设有4个状态和2个动作
num_states = 4
num_actions = 2
gamma = 0.9
theta = 1e-4# 随机初始化转移概率P和奖励R
P = np.random.rand(num_states, num_actions, num_states)
P = P / P.sum(axis=2, keepdims=True)
R = np.random.rand(num_states, num_actions)V = np.zeros(num_states)while True:delta = 0for s in range(num_states):v = V[s]V[s] = max(sum(P[s, a, s_next] * (R[s, a] + gamma * V[s_next]) for s_next in range(num_states))for a in range(num_actions))delta = max(delta, abs(v - V[s]))if delta < theta:break# 计算最优策略
policy = np.zeros(num_states, dtype=int)
for s in range(num_states):policy[s] = np.argmax([sum(P[s, a, s_next] * (R[s, a] + gamma * V[s_next]) for s_next in range(num_states))for a in range(num_actions)])print("最优状态值函数:", V)
print("最优策略:", policy)

4. 策略迭代(Policy Iteration)

4.1 算法原理

  • 策略迭代交替进行"策略评估"和"策略改进"两个步骤,直到策略收敛。
  • 策略评估:在当前策略下,计算每个状态的值函数。
  • 策略改进:对每个状态,选择能带来最大值的动作,更新策略。

4.2 伪代码

初始化任意策略 π(s)
重复:1. 策略评估:对所有 s,计算 V^π(s)2. 策略改进:对所有 s,π_new(s) = argmax_a Σ_{s'} P(s'|s,a) [ R(s,a) + γ V^π(s') ]如果 π_new = π,则停止,否则 π ← π_new

4.3 流程图(可用Mermaid或维基百科图片)

  • 推荐图片:Policy iteration
  • 引用:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.4 策略迭代Python代码示例

import numpy as npnum_states = 4
num_actions = 2
gamma = 0.9
theta = 1e-4P = np.random.rand(num_states, num_actions, num_states)
P = P / P.sum(axis=2, keepdims=True)
R = np.random.rand(num_states, num_actions)policy = np.zeros(num_states, dtype=int)
V = np.zeros(num_states)is_policy_stable = False
while not is_policy_stable:# 策略评估while True:delta = 0for s in range(num_states):v = V[s]a = policy[s]V[s] = sum(P[s, a, s_next] * (R[s, a] + gamma * V[s_next]) for s_next in range(num_states))delta = max(delta, abs(v - V[s]))if delta < theta:break# 策略改进is_policy_stable = Truefor s in range(num_states):old_action = policy[s]action_values = [sum(P[s, a, s_next] * (R[s, a] + gamma * V[s_next]) for s_next in range(num_states))for a in range(num_actions)]policy[s] = np.argmax(action_values)if old_action != policy[s]:is_policy_stable = Falseprint("最优状态值函数:", V)
print("最优策略:", policy)

5. 动态规划的优缺点与适用场景

5.1 优点

  • 理论完备,能保证收敛到最优策略
  • 适用于小规模、模型已知的MDP问题

5.2 缺点

  • 需要已知完整的环境模型(P和R)
  • 状态空间和动作空间大时,计算和存储开销极大(维数灾难)
  • 不适用于大规模或连续空间问题

5.3 适用场景

  • 小型离散型问题(如棋盘游戏、迷宫)
  • 用于分析和验证强化学习算法的理论基础

6. 工程实践建议与常见问题

  • 在实际工程中,动态规划常用于小型仿真环境或作为算法基线
  • 对于大规模问题,需采用近似方法(如函数逼近、采样等)
  • 可结合可视化工具,观察值函数和策略的收敛过程

7. 小结

  • 动态规划是强化学习理论的基石,适用于模型已知的小规模问题
  • 价值迭代和策略迭代是两大核心算法
  • 为后续无模型方法(如Q-Learning)奠定了理论基础

8. 思考题

  1. 动态规划为什么不适用于大规模或连续空间的强化学习问题?
  2. 价值迭代和策略迭代的主要区别是什么?
  3. 请用伪代码写出价值迭代的主要步骤。

7. 小结

  • 动态规划是强化学习理论的基石,适用于模型已知的小规模问题
  • 价值迭代和策略迭代是两大核心算法
  • 为后续无模型方法(如Q-Learning)奠定了理论基础

8. 思考题

  1. 动态规划为什么不适用于大规模或连续空间的强化学习问题?
  2. 价值迭代和策略迭代的主要区别是什么?
  3. 请用伪代码写出价值迭代的主要步骤。
  4. 在实际工程中,如何判断动态规划算法已经收敛?
http://www.dtcms.com/a/265206.html

相关文章:

  • OpenHarmony 5.0 解决点击导航栏切换后台按钮再切换到前台导航栏可能覆盖输入法问题,导致输入法下沉,最下面的显示不全
  • day046-tomcat与部署war包、jar包
  • 为什么星敏感器(Star Tracker)需要时间同步?—— 从原理到应用的全解析
  • Day04:玩转标准库中的数据处理与日志记录
  • pytest fixture基础大全详解
  • 爬虫反爬策略实战:UserAgent代理池简明指南
  • 电磁场有限元方法EX2.2-里兹法求解泊松方程控制的边值问题
  • 二刷 苍穹外卖day11
  • 讲解视频:分布滞后非线性模型DLNM​​专题:从基础到进阶学习路径
  • 记录一个QT中pro文件换行需要注意的问题
  • 第29篇:Linux审计系统深度解析:基于OpenEuler 24.03的实践指南
  • 【中文核心期刊推荐】《电子测量技术》
  • RabbitMQ使用topic Exchange实现微服务分组订阅
  • 基于SEP3203微处理器的嵌入式最小硬件系统设计
  • VBA初学习记录
  • OneCode表单架构设计:注解驱动与组件化的完美结合
  • 腾讯云认证考试报名 - TDSQL数据库交付运维专家(TCCE PostgreSQL版)
  • windows的vscode无法通过ssh连接ubuntu的解决办法
  • 网站面临爬虫攻击waf能防护住吗
  • docker拉取redis并使用
  • 《导引系统原理》-西北工业大学-周军
  • CppCon 2018 学习:Fast Conversion From UTF-8 with C++, DFAs, and SSE Intrinsics
  • 部署 KVM 虚拟化平台
  • 关于网络协议
  • 第四篇:面试官:SpringBoot 场景化实战 10 问(第四弹·附图解)
  • C语言笔记(鹏哥)上课板书+课件汇总 (编译和链接+linux讲解)
  • 【实战】CRMEB Pro 企业版安装教程(附 Nginx 反向代理配置 + 常见问题解决)
  • 深入理解C++11原子操作:从内存模型到无锁编程
  • Docker Dify安装 完整版本
  • Pytorch中torch.where()函数详解和实战示例