当前位置: 首页 > 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.lryc.cn/news/579088.html

相关文章:

  • 数学建模_微分方程
  • 内存架构的十字路口:深入解析统一内存访问(UMA)与非一致内存访问(NUMA)
  • 虚拟机知识点-Vagrant 在通过 VirtualBox 启动 CentOS 虚拟机时失败-VERR_NEM_VM_CREATE_FAILED
  • 从0开始学习R语言--Day36--空间杜宾模型
  • maven仓库
  • WSL2 + Docker Desktop 环境中查看本地镜像
  • 【Vue入门学习笔记】Vue核心语法
  • CentOS 卸载docker
  • 移动conda虚拟环境的安装目录
  • mongo常用命令
  • odoo17 警示: selection attribute will be ignored as the field is related
  • Node.js-http模块
  • Day04:玩转标准库中的数据处理与日志记录
  • Chart.js 安装使用教程
  • 基于SpringBoot和Leaflet的区域冲突可视化系统(2025企业级实战方案)
  • VC Spyglass:工具简介
  • React Native 开发环境搭建--window--android
  • 24年京东秋季笔试题
  • CSS外边距合并(塌陷)全解析:原理、场景与解决方案
  • flutter更改第三方库pub get的缓存目录;更改.gradle文件夹存放目录
  • 告别告警风暴:深入理解 Prometheus Alertmanager 的智能告警策略
  • 为什么星敏感器(Star Tracker)需要时间同步?—— 从原理到应用的全解析
  • 1-RuoYi框架配置与启动
  • 整流电路Multisim电路仿真实验汇总——硬件工程师笔记
  • qml实现 裁剪进度条
  • 使用案例 - 根据nuscenes-devkit工具读取nuscnes数据集
  • Active-Prompt:让AI更智能地学习推理的革命性技术
  • Ubuntu-18.04-bionic 的apt的/etc/apt/sources.list 更换国内镜像软件源 笔记250702
  • nacos 3 docker 快速部署
  • ES6从入门到精通:其他特性