动态规划学习
来源:互联网 发布:身知内功 编辑:程序博客网 时间:2024/05/01 22:10
基本概念
动态规划对于子问题重叠的情况特别有效,因为它将子问题的解保存在表格中,当需要某个子问题的解时,直接取值即可,从而避免重复运算。
动态规划是一种灵活的方法,不存在一种万能的动态规划算法解决给类最优化问题。所以除了要对基本概念和方法正确理解外,还要具体问题具体分析处理,用灵活的方法创建数学模型,用创造性的方法求解。
基本思想和策略
基本思想与分治类似,也是将待求解问题分成若干个子问题,按顺序求解子问题的解,为后一子问题的求解提供有用信息。在求任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题的解就是初始问题的解。
动态规划的子问题往往不是独立的,即子问题重叠。在求解的过程中,子问题的解被反复利用。为了避免重复计算,动态规划算法采用了填表来保存子问题解的方法。
适用情况
两个必备要素:
1. 最优子结构:问题的最优解由相关子问题的最优解组合而成,并且可以独立求解子问题。
2. 子问题重叠:递归问题在反复的求解相同的子问题。
三个性质:
1. 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
2. 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与其以前的状态有关。
3. 有重叠子问题:子问题之间是不独立的,一个子问题在下一决策中,可能会被多次使用到。该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势。
求解的基本步骤
1. 分解最优解的性质,并刻画其结构特征,这一步的开始时一定要从子问题入手。
2. 定义最优解变量,定义递归最优解公式。
3. 以自低向上计算出最优解,或自顶向下的记忆化方式,即备忘录法。
4. 根据计算最优值时得到的信息,构造问题的最优解。
例题分析
例一,钢条切割
问题描述:给定一段长度为n的钢条和一个价格表Pi(i=1,2,3…n),求切割方案,使得销售收益最大。例如:
长度i 1 2 3 4 5 6 7 8 9 10
价格Pi 1 5 8 9 10 17 17 20 24 30
分析
描述最优解结构:
设子问题:规模为n时的最优切割利润为r[n],n的值从0到10。显然R[0] = 0。
然后我们选取一种在求解子问题时能囊括所有切割方案的切割方法:我们总是在距离钢条左端j(j可以从0到i-1,到i是没有必要的)处切下,此时我们将钢条切割成了j和n-j两段钢条。
最优子结构描述如下:假设对于子问题Rn我们在其距离钢条左边j的地方切成两段,那么该子问题的最优值必然是两个子问题最优值之和。
递归定义最优解的值
根据上面的分析,显然子问题Rn的最优值为表达式 Rn=max(Rj+Rn-j),1<=j<=n且R0=0
因此,在计算r[n]时,所求值即为r[0]+r[n],r[1]+ r[n- 1],r[2]+ r[n- 2],…,r[n- 1] +r[1]之间的最大值。
按自底而上的方式计算最优解的值
在计算过程中,先计算r[0]到r[i-1]的值,在计算r[i]时,因为已经保存好其该子问题的值了,所以计算r[n]时直接取子问题的值即可,从而减少计算量。
代码编写中。。。
- 动态规划算法学习
- 动态规划学习篇
- 动态规划学习
- 动态规划学习一
- 动态规划学习二
- 动态规划学习
- 动态规划学习笔记
- 动态规划学习 林汝佳
- 动态规划学习笔记
- 动态规划学习
- 动态规划学习小结
- 动态规划学习系列
- 算法学习--动态规划
- 动态规划学习
- 动态规划 入门学习
- 动态规划学习笔记
- 动态规划的学习
- 动态规划算法学习
- React Native 之 Using a ScrollView
- BZOJ 1579 道路升级 Dijkstra
- 链表相关问题
- 解决maven项目中有小红叉的问题
- 初识MVP
- 动态规划学习
- wps for linux 不能使用搜狗(fcitx)输入法
- TortoiseGit 如何提交代码
- VS2010+QT5.1+opencv2.4.5图像界面第一个程序
- 内存管理 ARC + MRC
- linux上搭建ftp服务器,并配置虚拟用户。
- JMeter自定义Java测试脚本上篇
- Toast替代者Snackbar
- 扑克牌类