动态规划
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划
首先,让我们来看这样的一个问题:
考虑显示在下面的数字金字塔。
如果我们要计算从最高点开始在底部任意处结束的路径经过数字的和的最
大值。
每一步可以走到左下方的点也可以到达右下方的点。
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30。
那么具体的,我们应该如何来求这样一个最大值呢?
最简单的,我们可以用枚举法,我们把所有的结果都算出来,然后找出其中最大的。这是一个实际的办法,但是如果数据增多,运算量也会急剧增加。到了一定程度后便会难以实现。
那么,接着我就想到可以用贪心法么?
如果用贪心法,在取完第一行的 7 后,应该取第二行的 8。
但是这样的话,没有总体的看问题,最后不一定能得到最优解。
如此,我们引进动态规划的思想。
什么是动态规划呢?
动态规划是一种在组合数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等。
动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而
不会在解决同样的问题时花费时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
而在我看来,有两点比较重要:
1、动态规划不是一种算法,而是一种思想。
2、动态规划问题没有定式。
引进了动态规划的概念后,让我们尝试解决一下上面的问题。
步骤:
最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。
我们可以看到,每个数左下角都有小数,有一个或者两个,这表示到此步骤为止,他们的和是多少。例如第三行的 1 下有连个小数,分别是通过两条路径所达到的。那么这时我们完全可以舍弃比较下的11,而直接用16代替其为止。即例如我们需要求五层数字金字塔,我们便从第二层开始算起,化成对其子结构的运算。与此同时,在对子结构求解的过程中,我们同时保留最优解,舍去其他
解,来达成最后的最优解。简单来说,我们记录了每一步的结果,并从中取得最优。这样一来,最后的结果必定是正确的,并且,我们的运算量几近少了一半。
由此看来,运用动态规划的思想,对求解这样一个数字金字塔来说,是一个比较好的,可行的思路。
同时我们介绍一项最优性原理:
对于一个具有n个输入的最优化问题,其求解过程往往可以划分为若干个阶段,每一阶段的决策仅依赖于前一阶段的状态,由决策所采取的动作使状态发生转移,成为下一阶段决策的依据。从而,一个决策序列在不断变化的状态中产生。这个决策序列产生的过程称为多阶段决策过程。
在每一阶段的决策中有一个赖以决策的策略或目标,这种策略或目标是由问题的性质和特点所确定,通常以函数的形式表示并具有递推关系,称为动态规划函数。
多阶段决策过程满足最优性原理(Optimal Principle):无论决策过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的当前状态,构成一个最优决策序列。
如果一个问题满足最优性原理通常称此问题具有最优子结构性质。
那么接下来,我们来看一下,动态规划的运用。
最长公共子序列问题:
对给定序列X=(x1, x2,…, xm)和序列Z=(z1, z2,…, zk),Z是X的子序列当且仅当存在一个严格递增下标序列(i1, i2,…, ik),使得对于所有j=1, 2, …, k,有
zj=xij(1≤ij≤m)。
给定两个序列X和Y,当另一个序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子序列问题就是在序列X和Y的公
共子序列中查找长度最长的公共子序列。
证明最长公共子序列问题满足最优性原理。
设序列X={x1, x2,…, xm}和Y={y1, y2,…, yn}的最长公共子序列为Z={z1, z2,…, zk},记Xk 为序列X 中前k 个连续字符组成的子序列,Yk 为序列Y 中前k 个连续字符组成的子序列,Zk 为序列Z 中前k 个连续字符组成的子序列,显然有下式成立:
(1)若xm=yn ,则zk=xm=yn ,且Zk-1是Xm-1和Yn-1的最长公共子序列;
(2)若xm ≠yn 且zk ≠xm ,则Z 是Xm-1和Y 的最长公共子序列;
(3)若xm ≠yn 且zk ≠yn ,则Z 是X 和Yn-1的最长公共子序列。
可见,两个序列的最长公共子序列包含了这两个序列的前缀序列的最长公共子序列。
要找出序列X={x1, x2,…, xm}和Y={y1, y2,…, yn}的最长公共子序列,可按下述递推方式计算:当xm=yn 时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm 即可得到X 和Y 的最长公共子序列;当xm ≠yn 时,必须求解两个子问题:找出Xm-1和Y 的最长公共子序列以及Xm 和Yn-1的最长公共子序列,这两个公共子序列中的较长者即为X 和Y 的最长公共子序列。用L[i][j]表示子序列Xi 和Yj 的最长公共子序列的长度,可得如下动态规划函数:
L[0][0]=L[i][0]=L[0][j]=0(1≤i ≤m,1≤j ≤n) (式6.14) (式6.15)
由此,把序列X={x1, x2,…, xm}和Y={y1, y2,…, yn}的最长公共子序列的搜索分为m 个阶段,第1阶段,按照式6.15计算X1和Yj 的最长公共子序列长度L[1][j](1≤j ≤n ),第2阶段,按照式6.15计算X2和Yj 的最长公共子序列长度L[2][j](1≤j ≤n ),依此类推,最后在第m 阶段,计算Xm 和Yj 的最长公共子序列长度L[m][j](1≤j ≤n ),则L[m][n]就是序列Xm 和Yn 的最长公共子序列的长度。
电子三班 102475 陶秋豪
2011.12.12
⎪⎩⎪⎨⎧>>≠-->>=+--=1,1,}1][j]L[i 1],L[i][j max{1,1,11]1][j L[i L[i][j]j i y x j i y x j i j i