算法设计与分析之动态规划法
文章目录
- 前言
- 一、动态规划法概述
- 二、动态规划法设计思想
- 三、动态规划法的基本要素
- 四、动态规划算法的设计步骤
- 五、动态规划法与分治法
- 六、动态规划法与贪心法
- 七、动态规划法示例
- 总结
前言
大家好,我是一只勤勤恳恳的程序猿。本篇文章小猿将跟您分享算法设计与分析中的动态规划法,希望对大家有所帮助。
一、动态规划法概述
动态规划是运筹学的一个分支,它是解决多阶段决策过程最优化问题的一种方法。 动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),可以人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。
这里需要深入的理解一下几个概念:
1、多阶段决策问题
可以分为若干个相互联系的阶段,每个阶段都要做出一个决策,这个决策即决定了本阶段的效益,也决定了下一阶段的初始状态。当每一个阶段的决策确定后,就得到一个决策序列,称为策略。多阶段决策最优化问题就是求得一个策略,使各个阶段的效益总和达到最优。
2、多阶段决策过程
问题的解由该问题的n个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为约束条件。满足约束条件的解称为问题的可行解。衡量所有可行解的优劣,通常以函数的形式给出一定的标准,这些标准函数称为且标函数(或评价函数)。使目标函数取得极值(极大或极小)的可行解称为最优解。具有上述这些要素的问题称为最优化问题。
3、最优化问题
最优化问题的求解可以划分为若干个阶段,每一阶段的决策仅依赖于前一阶段的状态,由决策所采取的动作使状态发生转移,成为下一阶段决策的依据。
状态:表示每个阶段开始时,问题或系统所处的客观状况。状态既是该阶段的某个起点, 又是前一个阶段的某个终点。通常一个阶段有若干个状态。
状态无后效性:如果某个阶段状态给定后,则该阶段以后过程的发展不受该阶段以前各阶段状态的影响,也就是说状态具有马尔科夫性。适于动态规划法求解的问题具有状态的无后效性。
策略:各个阶段决策确定后,就组成了一个决策序列,该序列称之为一个策略。一个决策序列在不断变化的状态中产生,这个决策序列产生的过程称为多阶段决策过程。
最优性原理:无论决策过程的初始状态和初始决策如何,其余的决策都必须相对于初始决策所产生的当前状态,构成一个最优决策序列。
二、动态规划法设计思想
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题
但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。
如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。
三、动态规划法的基本要素
1、子问题重叠性质
(递归算法求解问题时)每次产生的子问题并不总是新问题,有些子问题被反复计算多次,这种性质称为子问题重叠性质。
动态规划算法对每一个子问题只解一次,而后将其解保存在一个表格(通常用维数组) 中, 当再次需要解此子问题时,只是简单地用常数时间查看下结果。
通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式级时间,从而获得较高的解题效率。
2、最优子结构性质一一用动态规划法求解的前提
当一个问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
一个问题的活动过程可以分为若干个阶段,每个阶段可包含一个或多个状态,从初始阶段的初始状态出发做出每个阶段的决策,形成一个决策序列。
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。
用反证法说明问题的最优子结构性质。
四、动态规划算法的设计步骤
用动态规划算法求解问题的步骤
1、找出最优解的性质,并刻划其结构特征。(划分子问题)
最优子结构性质:问题的最优解包含其子问题的最优解。(显著特征)
2、递归地定义最优值。(确定动态规划函数)
建元递归关系式
3、以自底向上的方式计算出最优值。
4、根据计算最优值时得到的信息,构造最优解。(此步只在要求得到最优解时才需要做)
注意点
1、动态规划法是一种求解最优化问题的重要算法策略。
2、动态规划法的子问题往往是重叠的。如果采用与分治法类似的直接递归方法求解将十分费时。为了避免重复计算,动态规划算法一般采用自底向上方式进行计算,并保存已经求解的子问题的最优解值。
3、利用最优子结构性质及所获得的递推关系式(较小子问题最优解与较大子问题最优解之间存在的数值关系)去求取最优解,可以使计算量较之穷举法急剧减少。
五、动态规划法与分治法
共同点
将待求解的问题分解成若干子问题,先求解子问题,然后再从这些子问题的解得到原问题的解。
不同点
1、适合于用动态规划法求解的问题,分解得到的各子问题往往不是相互独立的;而分治法中子问题相互独立。
2、动态规划法用表保存已求解过的子问题的解,再次碰到同样的子问题时不必重新求解,而只需查询答案,故可获得多项式级时间复杂度,效率较高;而分治法中对于每次出现的子问题均求解,导致同样的子问题被反复求解,故产生指数增长的时间复杂度,效率较低。
六、动态规划法与贪心法
共同点
都是求解最优化问题;都具有最优子结构性质。
不同点
1、求解方式不同
动态规划法:自底向上;
贪心法:自顶向下。以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。
2、对子问题的依赖不同
动态规划法:依赖于各子问题的解。只有在解出相关子问题后,才能作出选择;应使各子问题最优,才能保证整体最优;
贪心法:不依赖于子问题的解。仅在当前状态下作出最好选择,即局部最优选择。
七、动态规划法示例
1、0/1背包问题
2、数塔问题
3、矩阵连乘问题
4、最长公共子序列
5、最优二叉查找树
6、多段图的最短路径问题
总结
知识点总结
1、动态规划法的设计思想
把求解的问题分成许多阶段或多个子问题,然后按顺序求解各子问题,最后一个子问题就是初始问题的解。
2、动态规划算法的基本要素
最优性原理、子问题重叠性
3、设计动态规划算法的基本步骤
(1)、分析最优解的性质,并刻划其结构特征;
(2)、递归地定义最优值;
(3)、以自底向上的方式计算出最优值;
(4)、根据计算最优值时得到的信息,自顶向下构造最优解。
结语
对动态规划法的介绍就到这里啦,希望这篇文章能给予你一些帮助,感谢各位人才的:点赞、收藏和评论,我们下次见。
算法设计与分析之动态规划法相关推荐
- 算法设计与分析--01背包问题(动态规划法解决)
算法设计与分析--01背包问题(动态规划法解决) 参考文章: (1)算法设计与分析--01背包问题(动态规划法解决) (2)https://www.cnblogs.com/2228212230qq/p ...
- 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...
动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...
- 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...
<太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...
- 算法设计与分析——算法思想总结
算法设计与分析 1.分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解 ...
- 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案
<计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...
- 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt
<王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...
- 程振波 算法设计与分析_算法设计与分析
本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...
- 算法设计与分析练习题
第一章 下列关于算法的说法中正确的有( ). Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 Ⅳ.算法执行后一定产生确定的结 ...
- C/C++ 算法设计与分析实验报告
算法设计与分析实验报告 算法实验整体框架的构建 菜单代码块 选择函数代码块 主函数代码块 实验模块Ⅰ:算法分析基础--Fibonacci序列问题 实验解析 Fibonacci序列问题代码块 实验模块Ⅱ ...
最新文章
- STM32工作笔记0062---定时器中断实验
- maya通过python输出fbx_[转载]FBX动画导入导出经验心得(MayaToMax,MayaToMaya)
- java实现小程序订阅消息推送(附源码)
- 教之初在线计算机考题,教之初计算机考试系统出题说明.pdf
- C#中Panel控件和GroupBox控件(未完成)
- BMS锂电池管理系统如何增加蓝牙模块芯片
- *rock ,scissors ,paperpku 2339
- 习题9-1 时间换算(15 分)
- windows powershell激活anaconda虚拟环境
- vue 抽离公共方法
- 荣耀畅玩5a android5.0,华为荣耀畅玩5A有几个版本?华为荣耀5A各版本区别对比介绍...
- Mac下解决硬盘无法读取问题Mounty for NTFS - 免费让 Mac 原生支持移动硬盘/U盘 NTFS 读写的必备驱动应用
- 计算机二级c语言2019年3月,2019年3月计算机二级
- R语言学习丨散点图怎么画?绘图基本知识与常用函数
- 关于USART波特率、TIM的外设预分频值
- java俄罗斯方块视频_[VIP视频]【A0233】java面对对象编程-俄罗斯方块视频教程 高清视频 百度云 百度网...
- 德语键盘在标准ASCII键盘上使用的小窍门/ 德语键盘英语输入法输出波浪线~
- 第5章第13节:案例:制作一份企业年终抽奖动画 [PowerPoint精美幻灯片实战教程]
- linux和windows安装openOffice将excel、doc文件转成pdf或html
- 云豹直播app源码对fragment替换方案的思考