动态规划的求解步骤
2014-11-30 13:48
204 查看
动态规划算法适合于求解最优化问题,通常可按下列步骤来设计动态规划算法:
(1)分析最优解的性质,并刻画其最优子结构特征;
(2)确定状态表示S(x1,x2,...)和状态递推方程,递归地定义最优值;
(3)根据状态转移顺序,以自底向上的方式计算出最优值;
(4)根据计算最优值时得到的信息,构造最优解。
第(1)步是基础,也是关键。在分析最优子结构性质时,子解分解和子解对应的子问题描述是关键。有两种子解分解方法:基于划分的方法和基于减一的方法。
在第一种方法中,问题的最优解依据问题性质划分成两个或者多个子解,但是其划分位置无法事先确定;
在第二种方法中,问题的最优解依据问题性质减缩规模,比如减去最优解的第一个分量,或者最后一个分量,得到规模减少一个单位的子解。得到子解后,分析和描述该子解对应的子问题,如果能证明该子解对应子问题的最优解,则该问题满足最优子结构性质,转入第(2);否则,该问题不能用动态规划求解。
第(2)步是动态规划算法的核心,它是最优解的规划过程。状态表示本质上就是子问题的表示,形如
![](http://img.blog.csdn.net/20141130141254072?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjQzMjc3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,其中
![](http://img.blog.csdn.net/20141130141443288?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjQzMjc3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
是描述子问题的求解目标,一般的
![](http://img.blog.csdn.net/20141130141717656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjQzMjc3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
直接定义为待求解问题的目标值。需要注意的是,对于有些问题来说,
![](http://img.blog.csdn.net/20141130141717656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjQzMjc3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果直接定义为原问题目标值,可能最优子结构性质不成立。此时,
![](http://img.blog.csdn.net/20141130141717656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjQzMjc3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
往往定义为某个中间目标值,比如最大上升子序列问题。在算法实现时,状态
![](http://img.blog.csdn.net/20141130141254072?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjQzMjc3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
一般用一个k维的表格存储,动态规划过程就是表格操作过程。
第(3)步体现了动态规划算法的执行过程。通俗地讲,动态规划是一个由易至难的求解过程;先求解最简单的子问题的解,然后利用简单子问题的解构造复杂一些的子问题的解,直至求解原问题的解。
第(4)步是可选步骤,只有问题要求构造最优解时才需要。
(1)分析最优解的性质,并刻画其最优子结构特征;
(2)确定状态表示S(x1,x2,...)和状态递推方程,递归地定义最优值;
(3)根据状态转移顺序,以自底向上的方式计算出最优值;
(4)根据计算最优值时得到的信息,构造最优解。
第(1)步是基础,也是关键。在分析最优子结构性质时,子解分解和子解对应的子问题描述是关键。有两种子解分解方法:基于划分的方法和基于减一的方法。
在第一种方法中,问题的最优解依据问题性质划分成两个或者多个子解,但是其划分位置无法事先确定;
在第二种方法中,问题的最优解依据问题性质减缩规模,比如减去最优解的第一个分量,或者最后一个分量,得到规模减少一个单位的子解。得到子解后,分析和描述该子解对应的子问题,如果能证明该子解对应子问题的最优解,则该问题满足最优子结构性质,转入第(2);否则,该问题不能用动态规划求解。
第(2)步是动态规划算法的核心,它是最优解的规划过程。状态表示本质上就是子问题的表示,形如
,其中
是描述子问题的求解目标,一般的
直接定义为待求解问题的目标值。需要注意的是,对于有些问题来说,
如果直接定义为原问题目标值,可能最优子结构性质不成立。此时,
往往定义为某个中间目标值,比如最大上升子序列问题。在算法实现时,状态
一般用一个k维的表格存储,动态规划过程就是表格操作过程。
第(3)步体现了动态规划算法的执行过程。通俗地讲,动态规划是一个由易至难的求解过程;先求解最简单的子问题的解,然后利用简单子问题的解构造复杂一些的子问题的解,直至求解原问题的解。
第(4)步是可选步骤,只有问题要求构造最优解时才需要。
相关文章推荐
- Decode Ways,编码方式数量求解。动态规划问题。
- 最长公共子序列求解:递归与动态规划方法
- 动态规划方法求解最长公共子串
- 关于动态规划解题步骤和两个重要性质的理解---以最长递增子序列为例
- 动态规划入门之求解斐波那契数列
- 动态规划求解矩阵累计和最大的路径
- 常见的动态规划问题分析与求解
- 常见的动态规划问题分析与求解
- 背包问题动态规划求解
- 最长公共子序列求解:递归与动态规划方法
- 插入r个乘号问题的动态规划求解
- 常见的动态规划问题分析与求解
- 动态规划-最长子序列求解-JAVA实现
- 常见的动态规划问题分析与求解
- 动态规划的思想来求解字符串分割问题
- 动态规划之最长公共子序列的求解(C++实现)
- 最长公共子序列求解:递归与动态规划方法
- 算法-从动态规划到贪心算法,Bellman-Ford和Dijkstra算法求解最短路
- 动态规划:如何求解最大连通节点值
- 动态规划之多段图优化求解