收藏 分享(赏)

算法设计与分析 动态规划基本思想.doc

上传人:kpmy5893 文档编号:8137811 上传时间:2019-06-10 格式:DOC 页数:7 大小:135KB
下载 相关 举报
算法设计与分析 动态规划基本思想.doc_第1页
第1页 / 共7页
算法设计与分析 动态规划基本思想.doc_第2页
第2页 / 共7页
算法设计与分析 动态规划基本思想.doc_第3页
第3页 / 共7页
算法设计与分析 动态规划基本思想.doc_第4页
第4页 / 共7页
算法设计与分析 动态规划基本思想.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、动态规划算法的基本思想动态规划方法是处理分段过程最优化问题的一类及其有效的方法。在实际生活中,有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程是如何达到这种状态的方式无关。这类问题的解决是多阶段的决策过程。20 世纪 50 年代,贝尔曼(Richard Bellman)等人提出了解决这类问题的“最优化原则” ,从而创建了最优化问题的一种新的算法动态规划算法。最优化原则指出,多阶段过程的最优决策序列应当具有性质:无论过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的状态构成一个最优决策序列。这要求原问题的最优解包含了其子问题

2、的一个最优解(称为最优子结构性质) 。动态规划算法采用最优原则来建立递归关系式(关于求最优值的) ,在求解问题时有必要验证该递归关系式是否保持最优原则。若不保持,则不可用动态规划算法。在得到最优值的递归式之后,需要执行回溯以构造最优解。在使用动态规划算法自顶向下(Top-Down)求解时,每次产生的子问题并不总是新问题,有些子问题反复计算多次,动态规划算法正是利用了这种子问题重叠性质。对每一个问题只计算一次,而后将其解保存在一个表格中,当再次要解此子问题时,只是简单地调用(用常数时间)一下已有的结果。通常,不同的子问题个数随着输入问题的规模呈多项式增长,因此,动态规划算法通常只需要多项式时间,

3、从而获得较高的解题效率。最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素。例 1多段图问题设 G=(V,E)是一个赋权有向图,其顶点集 V 被划分成 k2 个不相交的子集Vi: 1ik,其中,V 1和 Vk分别只有一个顶点 s(称为源)和一个顶点 t(称为汇),下图中所有的边(u,v)的始点和终点都在相邻的两个子集 Vi和 Vi1 中:uVi,vV i1 。图 6-1-1 一个 5 段图V1 V2 V3 V4 V51ts3729224 611781134526554185427759716157453267891011121多阶段图问题:求由 s 到 t 的最小成本路径(也叫最短

4、路径) 。对于每一条由 s 到 t 的路径,可以把它看成在 k-2 个阶段作出的某个决策序列的相应结果:第 i 步决策就是确定 Vi+1中哪个顶点在这条路径上。今假设s, v2, v3, , vk-1, t 是一条由 s 到 t 的最短路径,再假定从源点 s(初始状态)开始,已经作出了到顶点 v2的决策(初始决策),则 v2就是初始决策产生的状态。若将 v2看成是原问题的子问题的初始状态,这个子问题就是找一条由 v2到 t 的最短路径。事实上,路径 v2, v3, , vk-1, t 一定是 v2到 t 的一条最短路径。不然,设 v2, q3, , qk-1, t 是一条由 v2到 t 的比

5、v2, v3, , vk-1, t 更短的路径,则 s, v2, q3, , qk-1, t 是一条由 s 到 t 的比 s, v2, v3, , vk-1, t 更短的路径。与前面的假设矛盾。这说明多段图问题具有最优子结构性质。例 2 0/1 背包问题有 n 件物品,第 i 件重量和价值分别是 wi和 pi, i=1, 2, , n。要将这n 件物品的某些件装入容量为 c 的背包中,要求每件物品或整个装入或不装入,不许分割出一部分装入。0/1 背包问题就是要给出装包方法,使得装入背包的物品的总价值最大。这个问题归结为数学规划问题: niixp1mas.t. (6.1.1)ncxwinii ,

6、21,0,1 0/1 背包问题具有最优子结构性质。事实上,若 是最优解,ny,21则 将是 0/1 背包问题的子问题:ny,2niixp2mas.t. (6.1.2)niwycinii ,2,10,12 最优解。因为,若 是子问题(6.1.2)的最优解,且使得y,(6.1.3)niip2niiy2则 将是原问题(6.1.1)的可行解,并且使得ny,21(6.1.4)niiy21niip1这与 是最优解相悖。ny,21例 3. 矩阵连乘问题给定 n 个数字矩阵 A1,A 2,A n,其中 Ai与 Ai+1是可乘的,i=1,2,n-1.求矩阵连乘 A1A2An的加括号方法,使得所用的数乘次数最少。

7、考察两个矩阵相成的情形:C=AB。如果矩阵 A,B 分别是 pr 和 rq 矩阵,则它们的乘积 C 将是 pq 矩阵,其(i, j)元素为 (6.1.5)rkjiijbac1i=1,p, j=1,q, 因而 AB 所用的数乘次数是 prq。如果有至少 3 个以上的矩阵连乘,则涉及到乘积次序问题,即加括号方法。例如 3 个矩阵连乘的加括号方法有两种:(A 1A2)A3)和(A 1(A2A3)。设 A1,A 2,A 3分别是p0p1,p 1p2,p 2p3矩阵,则以上两种乘法次序所用的数乘次数分别为:p0p1p2+p0p2p3和 p0p1p3+p1p2p3。如果 p0=10, p1=100, p2

8、=5, p3=50, 则两种乘法所用的数乘次数分别为:7500 和 750000。可见,由于加括号的方法不同,使得连乘所用的数乘次数有很大差别。对于 n 个矩阵的连乘积,令 P(n)记连乘积的完全加括号数,则有如下递归关系(6.1.6)11)()(nknkP由此不难算出 P=C(n-1),其中 C 表示 Catalan 数:(6.1.7)/4(21)( 23nn也就是说,P(n)是随 n 指数增长的,所以,我们不能希望列举所有可能次序的连乘积,从中找到具有最少数乘次数的连乘积算法。事实上,矩阵连乘积问题具有最优子结构性质,我们可以采用动态规划的方法,在多项式时间内找到最优的连乘积次序。用 Ai

9、:j表示连乘积 AiAi1 Aj。分析计算 A1:n的一个最优次序。设这个计算次序在矩阵 Ak和 Ak+1之间将矩阵链分开,1kn,则完全加括号方式为(A1A2Ak)( Ak1 An),依此次序,我们先分别计算 A1:k和 Ak+1:n,然后将计算的结果相乘得到 A1:n。可见,A1:n的一个最优序所包含的矩阵计算子链 A1:k和 Ak+1:n的次序也一定是最优的。也就是说,矩阵连乘问题具有最优子结构性质。如上三个例子都具有最优子结构性质,这个性质决定了解决此类问题的基本思路是:首先确定原问题的最优值和其子问题的最优值之间的递推关系(自上向下),然后自底向上递归地构造出最优解(自下向上) 。最

10、优子结构性质是最优化原理得以采用的先决条件。一般说来,分阶段选择策略确定最优解的问题往往会形成一个决策序列。Bellman 认为,利用最优化原理以及所获得的递推关系式去求解最优决策序列,可以使枚举数量急剧下降。这里有一个问题值得注意:最优子结构性质提示我们使用最优化原则产生的算法是递归算法,简单地使用递归算法可能会增加时间与空间开销。例如,用递归式直接计算矩阵连乘积 A1:n的算法 RecurMatrixChain 的时间复杂度将是 :)2(n程序 6-1-1 计算矩阵连乘的递归算法int RecurMatrixChain(int i, int j)if (i=j) return 0;int

11、u=RecurMatrixChain(i, i)+RecurMatrixChain(i+1,j)+pi-1*pi*pj;sij=i;for(int k=i+1; kj; k+)int t=RecurMatrixChain(i,k)+RecurMatrixChain(k+1,j)+pi-1*pk*pj;if (tu) u=t;sij=k;return u;如果用 T(n)表示该算法的计算 A1:n的时间,则有如下递归关系式:1 1)()()(nk nkTOT当 时 1n,111 )(2)()()(1) nknknk TT可用数学归纳法直接证明: ,这显然不是我们所期望的。21nnT注意到,在用递

12、归算法自上向下求解具有最优子结构的问题时,每次产生的子问题并不总是新问题,有些问题被反复计算多次。如果对每一个问题只解一次,而后将其解保存在一个表格中,当再次需要解此问题时,只是简单地用常数时间查看一下结果。则可以节省大量的时间。在矩阵的连乘积问题中,若用 mij表示由第 i 个矩阵到第 j 个矩阵的连乘积所用的最少数乘次数,则计算 m1n时共有 个子问题。这是因为,对于 ,不同的有序)(2nnji1对(i, j)对应于不同的子问题,不同子问题最多只有 个。下面)(22将会看到,用动态规划解此问题时,可在多项式时间内完成。程序 6-1-2 求矩阵连乘最优次序的动态规划算法void Matrix

13、Chain(int p, int n, int * *m, int * *s)for (int i=1; i=n; i+) mii=0;for (int r=2; r=n; r+)for (int i=1; i=n-r+1; i+)int j=i+r-1; r 是跨度mij= mi+1j+pi-1*pi*pj;sij=i;for (int k=i+1; kj; k+)int t= mik+ mk+1j+pi-1*pk*pj;if (t mij) mij=t;sij=k; 算法 MatrixChain 的主要计算量取决于程序中对 r, i 和 k 的三重循环,循环体内的计算量为 O(1),三重循

14、环的总次数是 O(n3),所以,算法的计算时间上界为 O(n3)。例子 求以下 6 个矩阵连乘积最少数乘计算次数及所采用乘法次序。 250:;1:;05:;1:;5:;0: 654321 AAA7125 1375203504754 1263min 513 p一般的计算 以及 的过程如下图所示:jijisjimjis注意,上述算法只是明确给出了矩阵最优连乘次序所用的数乘次数 m1n,并未明确给出最优连乘次序,即完全加括号方法。但是以 sij为元素的 2维数组却给出了足够的信息。事实上,sij=k 说明,计算连乘积 Ai:j的最佳方式应该在矩阵 Ak和 Ak+1之间断开,即最优加括号方式为(Ai:

15、k)(Ak+1:j)。下面的算法 Traceback 按算法 MatrixChain 计算出的断点信息 s指示的加括号方式输出计算 Ai:j的最优次序。程序 6-1-3 根据最优值算法构造最优解Void Traceback(int i, int j, int * * s)if (i=j) return;Traceback(i, sij, s);Traceback(sij+1, j, s);cout “Multiply A” i “,” sij;cout “and A” (sij +1) “,” j endl;总结上面解矩阵连乘积问题,我们可以归纳出使用动态规划算法的基本步骤:1 分析最优解的结

16、构1 2 3 4 5 60 15750 7875 9375 11875 151250 2625 4375 7125 105000 750 2500 53750 1000 35000 50000123456ij1 2 3 4 5 60 1 1 3 3 30 2 3 3 30 3 3 30 4 50 50123456ij在这一步中,应该确定要解决的问题应该是具有最小子结构性质,这是选择动态规划算法的基础。2. 建立递归关系第一步的结构分析已经为建立递归关系奠定了基础。这一步的主要任务是递归地定义最优值,并建立该问题与其子问题最优值之间的递归关系。例如在矩阵连乘积问题中,递归关系为 ji jimjk

17、i pk*1-pij 1mkn0在 0/1 背包问题中的递归关系是( 表示 0/1 背包问题 Knap(j+1,n,X)的)(Xgj最优值)(6.1.8)111)(),(ax)( jjjjj pwg在多段图问题中的递归关系是(6.1.9),(),(min),(),(1 liCOSTljcjiCOSTEljVl这里 j 表示取 Vi中的顶点 j。3. 计算最优值依据递归关系式可以自底向上的方式(或自顶向下的方式备忘录方法)进行计算,在计算过程中保存已经解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终获得多项式时间的算法。4. 构造最优解依据求最优值时记录的信息,构造出最优解(如矩阵连乘积) 。上述归纳的 4 个阶段是一个整体,必要时才分步完成,很多时是统一来完成的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报