在我们的现实生活中,存在着这样的活动过程:一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。它可以分为几个相互联系的阶段,在每个阶段,我们都需要为其作出决策,从而使总体上得到最优的结果。每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种基于多阶段决策求解最优化问题的过程就称为动态规划。
动态规划与分治法的联系与区别:
动态规划与分治法有个相似之处,就是它们都是通过组合子问题的解来解决原问题。但是,不同的是,当子问题有重叠情况时,分治法会重复做许多不必要的工作,它会反复求解那些公共子问题。而动态规划算法避免了这种不必要的计算工作。动态规划算法只会对每个子问题求解一次,将已解决的子问题的答案保存在一个表格中,而在需要时再找出已求得的答案,这样避免大量的重复计算,节省时间。这二者最大的区别即:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)
设计动态规划算法的4个基本步骤:
1. 刻画一个最优解的特征。明确满足什么条件的解才是最优解。
2. 递归地定义最优解的值。处在哪种情况下可能靠近最优解。
3. 计算最优解的值,自底向上的方法。需要保留哪些局部解,舍弃哪些局部解使之可能得到最优解。
4. 利用计算出的信息构造最优解。
具体步骤:
1.划分阶段:动态规划是基于多阶段决策的,因此应该先把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。
2.确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。
3.确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。
4.寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。
其中最重要的就是三要素:① 问题的阶段;② 问题的状态;③ 递推关系;确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。