【强化学习】动态规划(Dynamic Programming, DP)算法

1、动态规划算法解题

LeetCode 931. 下降路径最小和
给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

1. 自底向上,迭代,dp数组

class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {int m = matrix.size();int n = matrix[0].size();vector<vector<int>> dp(m, vector<int>(n));for (int j=0; j<n; j++){dp[m-1][j] = matrix[m-1][j];}for (int i=m-2; i>=0; i--){for (int j=0; j<n; j++){dp[i][j] = matrix[i][j] + dp[i+1][j];if (j-1 >= 0) dp[i][j] = min(dp[i][j], matrix[i][j] + dp[i+1][j-1]);if (j+1 < n) dp[i][j] = min(dp[i][j],  matrix[i][j] + dp[i+1][j+1]);}}int res = INT_MAX;for (int j=0; j<n; j++){res = min(res, dp[0][j]);}return res;}
};

2. 自顶向下,递归,备忘录memo

class Solution {
public:vector<vector<int>> memo;int minFallingPathSum(vector<vector<int>>& matrix) {int res = 99999;int n = matrix.size();memo.resize(n, vector<int>(n, 99999));for (int j = 0; j < n; j++) res = min(res, dp(matrix, n-1, j));return res;}int dp(vector<vector<int>>& matrix, int i, int j){if (i < 0 || j < 0 || i > matrix.size()-1 || j > matrix[0].size()-1)return 66666;// base caseif (i == 0) return matrix[0][j];// 查找备忘录if (memo[i][j] != 99999) return memo[i][j];// 状态转移memo[i][j] = min(min(dp(matrix, i-1, j-1), dp(matrix, i-1, j)), dp(matrix, i-1, j+1)) + matrix[i][j];return memo[i][j];}
};

2、强化学习 - 动态规划算法

动态规划(Dynamic Programming, DP)是强化学习中基于模型(model-based)方法的核心,通过已知的环境模型(状态转移概率和回报函数)利用贝尔曼方程(Bellman Equation)反复计算值函数,从而推导出最优策略。

动态规划方法假设智能体拥有环境的完美模型,即知道在任何状态下采取任何动作所带来的即时奖励以及转移到下一个状态的概率。动态规划主要用于解决强化学习中的“规划”问题,即在已知环境动力学的情况下找到最优策略。

  • 在DP框架下:策略评估(Policy Evaluation)与策略改进(Policy Improvement)
  • 两大类算法:策略迭代(Policy Iteration)与值迭代(Value Iteration)

2.1. 背景知识

马尔可夫决策过程(MDP)

  • MDP定义:一个MDP由五元组 ( S , A , P , R , γ ) (\mathcal{S}, \mathcal{A}, P, R, \gamma) (S,A,P,R,γ) 构成,其中 S \mathcal{S} S 是状态集合, A \mathcal{A} A 是动作集合, P ( s ′ ∣ s , a ) P(s'|s,a) P(ss,a) 是状态转移概率, R ( s , a , s ′ ) R(s,a,s') R(s,a,s) 是即时回报, γ ∈ [ 0 , 1 ) \gamma\in[0,1) γ[0,1) 是折扣因子。

  • 值函数:状态价值函数 V π ( s ) V^\pi(s) Vπ(s) 表示在策略 π \pi π 下从状态 s s s 开始获得的期望累积折扣回报;动作价值函数 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a) 则表示在状态 s s s 执行动作 a a a 后执行策略 π \pi π 的期望价值。

2.2. 动态规划原理

动态规划利用已知的MDP模型,基于贝尔曼方程迭代计算值函数,并根据值函数更新策略,直至收敛到最优策略。

1. 策略评估(Policy Evaluation)

策略评估的目标是在给定策略 π \pi π,反复应用贝尔曼期望方程

V k + 1 ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ , r P ( s ′ , r ∣ s , a ) [ r + γ V k ( s ′ ) ] V_{k+1}(s) = \sum_{a}\pi(a|s)\sum_{s',r}P(s',r|s,a)\bigl[r + \gamma V_k(s')\bigr] Vk+1(s)=aπ(as)s,rP(s,rs,a)[r+γVk(s)]

直至 ∥ V k + 1 − V k ∥ ∞ < θ \|V_{k+1} - V_k\|_\infty < \theta Vk+1Vk<θ(阈值)

  • 符号说明
    • π ( a ∣ s ) \pi(a|s) π(as):策略 π \pi π在状态 s s s下选择动作 a a a的概率。
    • r ( s , a ) r(s,a) r(s,a):在状态 s s s采取动作 a a a的即时奖励。
    • γ \gamma γ:折扣因子( 0 ≤ γ ≤ 1 0 \leq \gamma \leq 1 0γ1),表示未来奖励的权重。
    • P ( s ′ , r ∣ s , a ) P(s',r|s,a) P(s,rs,a):状态转移概率,表示在状态 s s s采取动作 a a a后转移到状态 s ′ s' s、获得及时奖励 r r r的概率。
    • V k ( s ′ ) V_k(s') Vk(s):下一状态 s ′ s' s的值函数。

2. 策略迭代(Policy Iteration)

  1. 初始化:任意初始化策略 π 0 \pi_0 π0 和相应的 V ( s ) V(s) V(s)

  2. 策略评估:对当前策略 π k \pi_k πk 执行上述策略评估,获得 V π k V^{\pi_k} Vπk

  3. 策略改进:对所有状态 s s s,更新策略

    π k + 1 ( s ) = arg ⁡ max ⁡ a ∑ s ′ , r P ( s ′ , r ∣ s , a ) [ r + γ V π k ( s ′ ) ] . \pi_{k+1}(s) = \arg\max_a \sum_{s',r} P(s',r|s,a)\bigl[r + \gamma V^{\pi_k}(s')\bigr]. πk+1(s)=argamaxs,rP(s,rs,a)[r+γVπk(s)].

  4. 重复 步骤 2–3,直到策略不再改变。
    该算法保证在有限步数内收敛到最优策略 π ∗ \pi^* π.

3. 值迭代(Value Iteration)

值迭代将策略评估策略改进合并:

V k + 1 ( s ) = max ⁡ a ∑ s ′ , r P ( s ′ , r ∣ s , a ) [ r + γ V k ( s ′ ) ] , V_{k+1}(s) = \max_{a}\sum_{s',r}P(s',r|s,a)\bigl[r + \gamma V_k(s')\bigr], Vk+1(s)=amaxs,rP(s,rs,a)[r+γVk(s)],

直至 ∥ V k + 1 − V k ∥ ∞ < θ \|V_{k+1} - V_k\|_\infty < \theta Vk+1Vk<θ,然后由最终的 V ∗ V^* V 直接提取最优策略:
π ∗ ( s ) = arg ⁡ max ⁡ a ∑ s ′ , r P ( s ′ , r ∣ s , a ) [ r + γ V ∗ ( s ′ ) ] \pi^*(s)=\arg\max_a\sum_{s',r}P(s',r|s,a)[r+\gamma V^*(s')] π(s)=argamaxs,rP(s,rs,a)[r+γV(s)]

实现步骤

算法伪代码

输入:MDP模型 (S, A, P, R, γ), 收敛阈值 θ
输出:最优策略 π*, 最优值函数 V*1. 初始化 V(s) 任意;π(s) 任意
2. 重复:a. Δ ← 0b. 对于每个状态 s ∈ S:v ← V(s)V(s) ← max_a ∑_{s',r} P(s',r|s,a)[ r + γ V(s') ]Δ ← max(Δ, |v - V(s)|)c. 直到 Δ < θ
3. 对于每个 s ∈ S:π(s) ← argmax_a ∑_{s',r} P(s',r|s,a)[ r + γ V(s') ]
4. 返回 π, V

上述即为值迭代的核心伪代码,策略迭代只需将步骤 2b 中“max”替换为按当前π评估,并在评估后插入策略改进步骤。

Python 实现示例

def value_iteration(P, R, gamma=0.9, theta=1e-6):"""P: dict, P[s][a] = list of (prob, next_s, reward)R: dict, immediate rewards R[s][a][s']"""V = {s: 0.0 for s in P}while True:delta = 0for s in P:v_old = V[s]V[s] = max(sum(prob * (r + gamma * V[s_next])for prob, s_next, r in P[s][a])for a in P[s])delta = max(delta, abs(v_old - V[s]))if delta < theta:break# 策略提取policy = {}for s in P:policy[s] = max(P[s].keys(),key=lambda a: sum(prob * (r + gamma * V[s_next])for prob, s_next, r in P[s][a]))return policy, V

注意事项

  • 收敛性:DP方法在折扣因子 γ < 1 \gamma<1 γ<1 或有终止状态的有限MDP中保证收敛。
  • 计算复杂度:状态-动作空间过大(例如上百维状态)时,DP算法不可行,需要采用抽样或函数逼近方法(如TD、DQN等)。
  • 异步DP:可采用异步更新(Asynchronous DP)和广义策略迭代(Generalized Policy Iteration)以提升效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探索DSPy:开启模块化AI编程的新篇章

在当今快速发展的AI时代&#xff0c;语言模型&#xff08;LM&#xff09;的应用已经渗透到各个领域&#xff0c;从简单的文本生成到复杂的多模态任务&#xff0c;语言模型展现出了强大的能力。然而&#xff0c;随着应用场景的日益复杂&#xff0c;开发者们面临着一个共同的挑战…

List<T>中每次取固定长度的数据

工具类方法 package org.common.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** 批处理取值组件* param <T>*/ public class BatchIterator<T> implements Iterator<List<T>> {private final List<T&g…

深入理解 Java 代理模式:从基础到实战​

在软件开发的世界里&#xff0c;设计模式是程序员智慧的结晶&#xff0c;它们为解决常见问题提供了经过验证的最佳实践。代理模式作为一种常用的结构型设计模式&#xff0c;在 Java 开发中有着广泛的应用。本文将深入探讨 Java 代理模式&#xff0c;从基本概念、分类、实现原理…

android-ndk开发(11): 安装 repo 命令

1. 长话短说 mkdir ~/soft/bin curl -L https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo chmod x repo~/.pathrc 添加: export PATH$PATH:~/soft/bin2. 短话长说 repo 的官方介绍页面&#xff1a; https://gerrit.googlesource.com/git-repo/ repo 的官方下载地…

45.传导发射整改摸底测试方法

传导发射整改摸底测试方法 1. 正式摸底预测试2. 简易方法预测试3. 分析频谱4. 探查传播路径5. 施加措施 1. 正式摸底预测试 去正式实验室做一次预测试&#xff0c;取得频谱图&#xff0c;确定超标频点和超标量&#xff08;备用&#xff09;。 2. 简易方法预测试 用小电流探头…

【漫话机器学习系列】249.Word2Vec自然语言训练模型

【自然语言处理】用 Word2Vec 将词语映射到向量空间详解 一、背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;我们常常需要将文本信息转化为机器能够理解和处理的形式。传统的方法&#xff0c;如 one-hot编码&#xff0c;虽然简单&#xff0c;但存在严重…

支付宝 SEO 优化:提升小程序曝光与流量的完整指南

在拥有庞大用户基数的支付宝平台上&#xff0c;小程序已成为商家触达用户、提供服务的重要渠道。然而&#xff0c;随着平台上小程序数量的快速增长&#xff0c;如何在激烈的竞争中脱颖而出&#xff0c;获得更多的曝光和流量&#xff0c;成为每个开发者和运营者必须面对的关键挑…

20250509——TOPSIS计算各方案得分

目录 TOPSIS原理 算例分析 参考文献 逼近理想解排序法&#xff08;Technique for Order Preference by Similarity to an Ideal Solution, TOPSIS&#xff09;是一种多属性决策分析工具&#xff0c;其核心在于通过衡量备选方案与理想目标的接近程度实现科学排序。该方法首先…

【QT】项目打包与发布安装

文章目录 一、引言二、前期准备三、打包QT项目3.1 编译release版3.2 相关依赖打包3.3 打包发布3.4 安装 四、打包普通项目五、结束语 一、引言 当Qt程序编写完成通过IDE编译就可以得到对应的可执行程序&#xff0c;这个可执行程序在本地运行是完全没有问题的。因为在本地有Qt环…

提示词工程:通向AGI时代的人机交互艺术

‌引言&#xff1a;从基础到精通的提示词学习之旅‌ 欢迎来到 ‌"AGI时代核心技能"‌ 系列课程的第二模块——‌提示词工程‌。在这个模块中&#xff0c;我们将系统性地探索如何通过精心设计的提示词&#xff0c;释放大型语言模型的全部潜力&#xff0c;实现高效、精…

三款实用电脑工具

今天为大家精心推荐三款实用软件&#xff0c;分别是人声伴奏分离软件、文件夹迁移软件和文字转拼音软件。 第一款&#xff1a;NovaMSS NovaMSS是一款功能强大的人声伴奏分离软件&#xff0c;它提供社区版和专业版&#xff0c;社区版永久免费。 该软件能够一键提取人声、伴奏、…

CentOS 7 安装指定版本 Docker 及镜像加速/配置优化攻略

摘要 本文详述 CentOS 7 系统下安装指定版本 Docker &#xff0c;涵盖镜像加速配置&#xff08;实测最快&#xff09;、存储位置优化、日志轮转等核心配置。 文章目录 一、安装指定版本Docker1.1 卸载旧版本&#xff08;如有&#xff09;1.2 安装依赖包1.3 添加Docker仓库&…

达梦、PostgreSQL数据库讲json解析成临时表(json_table函数的使用)

官网json_table文档路由 路径表达式文档路由 背景&#xff1a;有一些动态表格&#xff0c;需要新建一张中间表&#xff0c;里边就两三个字段比如主表id,某某类型id,某某类型是否选中。对于这种表新建个表还得加各种创建人修改人版本号是否逻辑删除啥的字段太过麻烦。于是可以直…

【软件测试】测试用例的设计方法

目录 一、基于需求进行测试用例的设计 1.1 功能需求测试分析 二、黑盒测试用例设计方法 2.1 等价类划分法(解决穷举) 2.1.1 等价类设计步骤 2.1.2 等价类划分法案例 2.1.2.1 验证 QQ 账号的合法性 2.1.2.2 验证某城市电话号码的正确性 2.1.3 适用场景 2.2 边界值分析…

微服务系统设计

在设计微服务系统时&#xff0c;需要综合考虑架构、业务划分、通信方式、数据管理、安全性、运维等多个方面的问题。 一、微服务系统设计需考虑的问题 1. 服务划分 如何合理拆分服务&#xff0c;避免“微服务地狱”。拆分粒度不宜过小&#xff1a;太多服务增加管理和通信成本…

Django ORM: values() 和 annotate() 方法详解

1. values()方法 1.1 基本概念 values()方法用于返回一个包含字典的QuerySet&#xff0c;而不是模型实例。每个字典表示一个对象&#xff0c;键对应于模型字段名称。 1.2 基本用法 # 获取所有书籍的标题和出版日期 from myapp.models import Bookbooks Book.objects.value…

43.防雷击浪涌设计

防雷击浪涌设计 1. 雷击浪涌形成的机理2. 雷击浪涌的防护 1. 雷击浪涌形成的机理 雷击浪涌分为直击雷和感应雷&#xff1a; 直击雷——带电荷的云对建筑物、避雷针等放电&#xff0c;或者带异种电荷的雷云撞击放电&#xff0c;其能量超级大&#xff1b; 感应雷——雷云在高压…

双端口ram与真双端口ram的区别

端口独立性 真双端口RAM&#xff1a;拥有两个完全独立的读写端口&#xff08;Port A和Port B&#xff09;&#xff0c;每个端口都有自己的地址总线、数据总线、时钟、使能信号和写使能信号。这意味着两个端口可以同时进行读写操作&#xff0c;且互不干扰。 伪双端口RAM&…

Python毕业设计219—基于python+Django+vue的房屋租赁系统(源代码+数据库+万字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于pythonDjangovue的房屋租赁系统(源代码数据库万字论文)219 一、系统介绍 本项目前后端分离&#xff0c;分为租客、房东、管理员三种角色 1、租客&#xff1a; 注册、登录、公…

Webpack基本用法学习总结

Webpack 基本使用核心概念处理样式资源步骤&#xff1a; 处理图片资源修改图片输出文件目录 自动清空上次打包的内容EslintBabel处理HTML资源搭建开发服务器生产模式提取css文件为单独文件问题&#xff1a; Css压缩HTML压缩 小结1高级SourceMap开发模式生产模式 HMROneOfInclud…