动态规划 --- 算法思想介绍

article/2025/10/31 20:00:06

一.动态规划的基本概念

动态规划在五种算法设计方法中难度最大,它建立在最优原则的基础上.采用动态规划方法,可以高效地解决许多用贪婪算法或分治法无法解决的问题.动态规划(dynamic programming)属运筹学中的规划论分支,是求解决策过程最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划.

二.动态规划的适用条件

任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用.同样,动态规划也并不是万能的.适用动态规划的问题必须满足最优化原理和无后效性.

1.最优化原理(最优子结构性质)
一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略.一个最优化策略的子策略总是最优的.一个问题满足最优化原理又称其具有最优子结构性质.
image-20211028090611292

如图,若路线I和J是A到C的最优路径,则根据最优化原理,路线J必是从B到C的最优路线.
反证法证明:假设有另一路径J’是B到C的最优路径,则A到C的路线取I和J’比I和J更优,矛盾.从而证明J’必是B到C的最优路径.
最优化原理是动态规划的基础,任何问题,如果失去了最优化原理的支持,就不可能用动态规划方法计算.哪些问题满足最优化原理?
动态规划的最优化理在其指标函数的可分离性和单调性中得到体现.根据最优化原理导出的动态规划基本方程是解决一切动态规划问题的基本方法.

2.无后向性
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态.换句话说,每个状态都是过去历史的一个完整总结.这就是无后向性,又称为无后效性.如果用前面的记号来描述无后向性,就是:对于确定的xk,无论p1,k-1如何,最优子策略pkn*是唯一确定的,这种性质称为无后向性.

3.子问题的重叠性
动态规划将一些具有指数级复杂度的搜索算法改进成了具有多项式时间的算法.其中的关键在于解决冗余,这是动态规划算法的根本目的.动态规划实质上是一种以空间换时间的技术,在实现中往往存储各种状态,故空间复杂度大于其它的算法.例如Bitonic旅行路线问题:动态规划的时间复杂度为O(n2),搜索算法的时间复杂度为O(n!) ,但从空间复杂度来看,动态规划算法为O(n2),而搜索算法为O(n) .选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题.但是经分解得到的子问题往往不是互相独立的.不同子问题的数目常常只有多项式量级.在用分治法求解时,有些子问题被重复计算了许多次.
image-20211028091104189

如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法.
image-20211028091132676

设原问题的规模为n,当子问题树中的子问题总数是n的超多项式函数,而不同的子问题数只是n的多项式函数时,动态规划法显得特别有意义,此时动态规划法具有线性时间复杂性.所以,能够用动态规划解决的问题还有一个显著特征:子问题的重叠性.这个性质并不是动态规划适用的必要条件,但是如果该性质无法满足,动态规划算法同其他算法相比就不具备优势.

三.动态规划的基本思想:

前面介绍了动态规划理论,称为标准动态规划,因为它具有明显的阶段划分和状态转移特征.这是在研究多阶段决策问题时推导出来的,具有严格的数学形式,适合用于理论上的分析.在实际应用中,许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦.一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决.

动态规划的实质是分治思想解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略.
动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解.其中贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题.因此贪心法自顶向下,一步一步地作出贪心选择;

而分治法中的各个子问题是独立的 (即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解.但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题.

动态规划法用于最优化问题,这类问题会有多种可能的解,而动态规划找出其中最优值的解.若存在若干个取最优值的解的话,它只取其中的一个.该方法通过求解局部子问题的解达到全局最优解.与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(各子问题可包含公共的子子问题) ,该方法对每一个子问题只解一次,并保存结果,避免每次碰到时都要重复计算.

动态规划法所针对的问题的特征:对应的子问题树中的子问题呈现大量的重复.关键:对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,以后再遇到时不必重新求解.
实际应用当中经常不显式地按照上面步骤设计动态规划,而是按以下几个步骤进行:

  • 分析最优解的性质,并刻划其结构特征.

  • 递归地定义最优值.

  • 以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值.

  • 根据计算最优值时得到的信息,构造一最优解.

步骤(1)–(3)是基本步骤.在只需要求出最优值的情形,步骤(4)可以省略.若需要求出问题的一个最优解,则必须执行步骤(4).此时,需要利用在步骤(3)中计算最优值时记录的许多信息.

参考我的老师毕方明《算法设计与分析》课件.

欢迎大家访问个人博客网站—乔治的编程小屋,和我一起为大厂offer努力!


http://chatgpt.dhexx.cn/article/jAbUnNAj.shtml

相关文章

动态规划算法详解

动态规划算法通常用于求解具有最优性质的问题 基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划(DP)。…

动态规划原理

1. 基本概念 动态规划通过拆分问题,将问题拆分成许多的子问题,定义问题状态和状态之间的关系(即状态转移方程或递推公式),使得问题能够以递推(或者说分治)的方式去解决。按顺序求解子问题&…

动态代理详解

想要更加透彻的理解动态代理,首先要熟悉下静态代理 一、静态代理 总结来说:目标类和代理类实现了相同的接口,在代理类中依赖了目标类,代理类的方法中调用了目标类的方法,并做了一些增强性的工作。 1、实现静态代理&…

CAD动态块制作

CAD动态块制作 拉伸动态块柜体A拉伸动态块制作第一步:制作柜体A第二步:进入块编辑器编辑第三步:关闭块编辑器 柜体B拉伸动态块制作第一步:制作柜体B第二步:进入块编辑器第三步:关闭块编辑器 可见性动态块第…

数据有效性 动态选择

EXCEL有两列数据栏,A列和B列,都是通过下来框来选择,要求A列选择完成后,B列动态调整可选择的内容。例如:第一例选择“AA”,第二列可供选择的范围是“a-d”;第一例选择“BB”,第二列可…

OTP 动态口令验证

OTP 动态口令验证。 简介 动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方…

loj#122.「强制在线」动态图连通性

loj#122. 「强制在线」动态图连通性 UPD:(7个月以后)这代码被叉了,我不想改了( negii真dl 然后发现这格式一更新…啊我的公式和链接怎么假掉了( csdn[] 算了不管了…反正这样子的话之后也不会用了( 题意 N 个点,M 次操作,支持加边/删边/询问两点间连通性。 强制在线。…

ORL、Yale等人脸数据库百度云链接

近段时间做人脸识别的实验,收集了几个人脸库,如图 这里放出百度云的链接,需要的自取 链接:https://pan.baidu.com/s/11_7bFdo_hhc83WQXmWtxvw 提取码:5ohd 强推这个文章,里面有16个人脸库的百度云链接 ht…

ORTP

1.为什么要使用RTP 一提到流媒体传输、一谈到什么视频监控、视频会议、语音电话(VOIP),都离不开RTP协议的应用,但当大家都根据经验或者别人的应用而选择RTP协议的时候,你可曾想过,为什么我们要使用RTP来进行…

oracle中or的使用,Oracle Or

oracle函数 的 Oracle Or 在本教程中,我们来学习如何使用Oracle OR运算符来组合两个或更多的布尔表达式。 Oracle OR运算符介绍 OR运算符是一个逻辑运算符,它组合了布尔表达式,如果其中一个表达式为真(true),则返回true。 以下说明OR运算符的语法: expression_1 AND expre…

基于PCA方法的ORL人脸识别及Python代码实现

基于PCA方法的ORL人脸识别及Python代码实现 PCA算法方案设计代码实现结果分析参考文献 PCA的理论知识已经有很多博客做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找到构建的协方差的特征值与特征向量,在新的投影方向&#…

ORL Character Recgnition

文章目录 ORL Character Recgnition0 Abstract1 Introduction2 Related Work2.1 Character recognition2.2 Text detection 3 Connection Text Proposal Network3.1 Anchor3.2 Bi-Directional LSTM3.3 RPN layer3.4 Text line constructor3.5 Loss function3.6 Total system3.7…

ORL Faces Database介绍

ORL人脸数据集共包含40个不同人的400张图像,是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。 此数据集下包含40个目录,每个目录下有10张图像,每个目录表示一个不同的人。所有的图像是以PGM格式存储,灰度图&…

基于ORL人脸数据库和PCA特征降维算法的人脸识别matlab仿真

目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: 2.MATLAB核心程序 ...................................................................... for i1:40sub_dir strcat(s, num2str(i))…

【图像处理matlab】PCA+KNN人脸识别 ORL人脸数据集

文章目录 0.写在前面1. 数据集导入与划分2. train-PCA构建脸空间2.1 原始数据导入2.2 去中心化2.3 求解协方差矩阵、特征值、特征向量2.4 特征脸选取--脸空间 3. test-物以类聚 KNN分类3.1 KNN简介3.2 KNN实现步骤3.2.1 距离度量---欧式距离、豪斯多夫距离.......3.2.2 k值选择…

Orcal 数据库

目录 一、数据库 1. 数据库概念 2. SQL 语言 3. Oracle结构 4. 表(Table) 5. 三范式 6. SELECT 语句 二、Orcal 基本操作 1. 查询列(字段) 2. 查询行(记录) 2.1 比较条件 2.2 且或非 2.3 null…

【人脸识别】基于PCA实现ORL人脸识别附matlab代码和报告

1 简介 人脸识别技术先进,应用广泛。借助PCA算法,利用MATLAB GUI可以简单操作,通过对待识别图像的预处理即可提高识别率。本文首先对相关概念进行了阐述,对工作原理进行了介绍,具体对基于PCA算法人脸识别的MATLAB实现进行了解析。 2 部分代码 function [neednum,average_face…

orical

truncate 和delete table 表名(前面效率比后面高,而且前面执行后无法停止,前面会将orical查找数据时使用的节点删除,后面不会) select * from 表名 会消耗大量资源不建议使用了; creat table 表名 as selec…

基于BP神经网络和ORL库的人脸识别matlab仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB代码 四、仿真结论分析 五、参考文献 一、理论基础 这里,人脸的识别主要依据如下的流程进行: 具体的算法流程是这么一个过程: 第一:首先初始化一个区…

图像处理ORL--训练集及测试集建立--Matlab实现

在深度学习的研究与学习过程中,往往对神经网络的网络结构以及代码有比较好的理解,但基于matlab的数据集建立等操作经常困扰初学者。 今天带来matlab数据集建立的文件结构与代码。 文件格式 首先将图片保存在当前运行文件的文件夹中,将其命名…