动态规划法优秀课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《动态规划法优秀课件.ppt》由会员分享,可在线阅读,更多相关《动态规划法优秀课件.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、动态规划法第1页,本讲稿共53页算法设计与分析2问题的分解n将待求解问题分解为若干子问题,通过子问题的解得到原问题的解,这是问题求解的有效途径。但是如何实施分解?n分治策略的基本思想是将规模为n的问题分解为k个规模较小的子问题,各子问题相互独立但与原问题求解策略相同。并不是所有问题都可以这样处理。n问题分解的另一个途径是将求解过程分解为若干阶段(级),依次求解每个阶段即得到原问题的解。通过分解得到的各子阶段不要求相互独立,但希望它们具有相同类型,而且前一阶段的输出可以作为下一阶段的输入。这种策略特别适合求解具有某种最优性质的问题。n贪心法属于这类求解策略:对问题P(n),其求解过程中各贪心选择
2、步骤构成决策序列D=。Di的最优性仅依赖于D1,D2,.Di-1。贪心法不保证决策序列D最后求出解的最优性。第2页,本讲稿共53页算法设计与分析3动态规划n动态规划也是一个分阶段判定决策过程,其问题求解策略的基础是决策过程的最优原理:为达到某问题的最优目标T,需要依次作出决策序列D=。如果D是最优的,则对任意i(1ik),决策子序列Di+1,Dk也是最优的,即当前决策的最优性取决于其后续决策序列的是否最优。由此追溯至目标,再由最终目标决策向上回溯,导出决策序列 D=,因此动态规划方法可以保证问题求解是全局最优的。n也可以这样理解:如果求最优解的问题可以划分成若干段(级),那么最后求得的最优解是
3、由各个部分解所组成,而这些部分解一定是对应阶段的最优解。第3页,本讲稿共53页算法设计与分析4最短路径n给定简单有向连通赋权图G=,w(i,j)是G中边的权。顶点集V可以划分为k+1个两两不交的子集Vi,i=0,1,2,.k。其中V0=s,Vk=t。对G中任一边,存在Vi、Vi+1,使得u属于Vi,v属于Vi+1,其中0ik。称G为k段图,s点为起点,t为终点。n在G中求s出发到t的最短路径。这里最短是指s到t的路径上各边权的和最小。第4页,本讲稿共53页算法设计与分析5一个多段图例子记D(u,v)是G中起点为u,终点为v的最短路径,C(u,v)是该路径上各边权的和。设D(s,t)=,vir属
4、于Vr(r=1,2.k-1),则D(vi1,t)=是从vi1出发到t的最短路径,D(vi2,t)=是从vi2出发到t的最短路径等等。设u属于Vi,有:C(u,t)=minw(u,v)+C(v,t)(4.1)vVi+1阶段4:C(7,t)=w(7,t)=8,C(8,t)=w(8,t)=4阶段3:C(4,t)=minw(4,7)+C(7,t),w(4,8)+C(8,t)=12C(5,t)=minw(5,7)+C(7,t),w(5,8)+C(8,t)=10C(6,t)=minw(6,7)+C(7,t),w(6,8)+C(8,t)=8阶段2:C(1,t)=minw(1,4)+C(4,t),w(1,5)
5、+C(5,t)=19C(2,t)=minw(2,4)+C(4,t),w(2,5)+C(5,t),w(2,6)+C(6,t)=17C(3,t)=minw(3,5)+C(5,t),w(3,6)+C(6,t)=13阶段1:C(s,t)=minw(s,1)+C(1,t),w(s,2)+C(2,t),w(s,3)+C(3,t)=16沿求解中带下划线的项回溯,得最短路径解:D(s,t)=第5页,本讲稿共53页算法设计与分析6问题解决关键n求解过程中起到关键作用的是公式(4.1),它给出了求该问题最优解的基本性质:原始问题最优解与子问题的最优解存在递归关系,称这种关系为问题的最优子结构。最优子结构。最优子结
6、构为构造求解问题的最优决策序列提供了重要线索,它提示可以自底向上的方式逐次由子问题最优解构造原始问题的最优解。n公式(4.1)还有一个重要特征:由给出的自顶向下的递归分解中,每次产生的子问题求解的关键(例如,求C(v,t))与原问题是类似的,只是在相对较小的子问题空间中考虑问题的解,因此子问题与原始问题存在相似性相似性。而且这些子问题的解在不同的上一级问题中都需要用到,这种特征可以称为子子问题重叠问题重叠。第6页,本讲稿共53页算法设计与分析7n采用邻接矩阵表示图G,其中wij为G中边的权,如果不是G的边,则wij=。G的节点集V=0,1,2,n,其中V0=0是起始点集,Vk=n是终点集,V0
7、,V1,Vk中各子集非空、两两不交。设V1=1,2,.r1,V2=r1+1,r1+2,r2,Vk-1=rk-2+1,rk-2+2,.(n-1)。n【算法4-1】MultiStage_GraphS1:初始化:j=n-1;对i=0,1,n,ci=0;/ci为节点i到终点n的最短路径长S2:求节点r,使得wjr+cr=minwji+ci|是G的边;/按照V0,V1,Vk对节点的标记,ji。S3:cj=wjr+cr,Dj=r;/Dj=r表示边是从j出发到n的最短路径上第1条边S4:j=j-1;S5:如果j0则转S2;S6:输出从源点0出发的最短路径长c0;p0=0,pk=n;S7:对j=1,2,k,p
8、j=Dpj-1;/最短路径Path=第7页,本讲稿共53页算法设计与分析8MultiStage_Graph算法复杂度nG用邻接矩阵表示,对于S2到S5的主循环执行n次。为求满足wjr+cr=minwji+ci|是G的边的r,最多要求n-1次比较。因此时间复杂性为O(n2)。除输入G,输出P外,要求附加存储空间c、D。n如果G采用邻接表表示,求满足最小性的节点r仅对属于G的边访问一次,此算法的时间复杂性应该为O(n+e)(e为G的边数)。n一般地,为避免递归过程中的重复计算,每个子问题首次处理时将结果保存以备查。在上面的过程中,每一次求得的cj都必须记录下来。第8页,本讲稿共53页算法设计与分析
9、9从源点往后推n算法4-1完全是从汇点往前推,实际上我们也可以用同样的思想,从源点出发往后推。阶段1:C(s,1)=w(s,1)=4,C(s,2)=w(s,2)=2,C(s,3)=w(s,3)=3阶段2:C(s,4)=minw(1,4)+C(s,1),w(2,4)+C(s,2)=min14,8=8C(s,5)=minw(1,5)+C(s,1),w(2,5)+C(s,2),w(3,5)+C(s,3)=min13,9,6=6C(s,6)=minw(2,6)+C(s,2),w(3,6)+C(s,3)=min12,11=11阶段3:C(s,7)=minw(4,7)+C(s,4),w(5,7)+C(s,
10、5),w(6,7)+C(s,6)=min12,15,16=12C(s,8)=minw(4,8)+C(s,4),w(5,8)+C(s,5),w(6,8)+C(s,6)=min16,12,15=12阶段4:C(s,t)=minw(7,t)+C(s,7),w(8,t)+C(s,8)=min20,16=16第9页,本讲稿共53页算法设计与分析10MultiStage_Graph2()/*用用Ck来记录到达每一个结点的最短距离来记录到达每一个结点的最短距离,m是划分的段数是划分的段数,Vk表示到达了表示到达了哪一段哪一段*/C01=0;for(k=1;k=m;k+)for(i=1;i=Vk中结点的数目中
11、结点的数目;i+)/*本循环求第本循环求第K段中所有顶点到段中所有顶点到S的最短的最短路径路径*/current=MAX;/*对于对于K段中的一个点段中的一个点i,求出,求出K-1段中所有的点到它的距离,记录下从原点出发段中所有的点到它的距离,记录下从原点出发最短的那一个最短的那一个*/for(j=1;j=Vk-1中结点的数目中结点的数目;j+)r=d(Vki,Vk-1j)+Ck-1j;if(rcurrent)rec=j;current=r;Cki=current;将结点将结点Vki指向结点结点指向结点结点Vk-1rec;从从T到到S沿沿VK逆向输出;逆向输出;第10页,本讲稿共53页算法设计
12、与分析11图中任意两点间的最短距离n如果上面的图不是分段图,仍然可以用此方法来求图中任意两点间的最短路径,这就是大名鼎鼎的Floyd算法。程序段如下:nfor(k=1;k=vtxnum;k+)for(i=1;i=vtxnum;i+)for(j=1;j=vtxnum;j+)if(lengthik+lengthkjlengthij)lengthij=lengthik+lengthkj;pathi,j=pathi,k+pathk,j;第11页,本讲稿共53页算法设计与分析12矩阵连乘问题n给定n个矩阵:A1,A2,An,其中Ai与Ai+1是可乘的。确定一种连乘的顺序,使得矩阵连乘的计算量为最小。n设
13、A和B分别是pq和qr的两个矩阵,则乘积C=AB为pr的矩阵,计算量为pqr次数乘。n但是对于多于2个以上的矩阵连乘,连乘的顺序却非常重要,因为不同的顺序的总计算量将会有很大的差别。第12页,本讲稿共53页算法设计与分析13不同计算顺序的差别n设矩阵A1,A2和A3分别为10100,1005和550的矩阵,现要计算A1A2A3。n若按(A1A2)A3)来计算,则需要的数乘次数为101005+10550=7500n若按(A1(A2A3)来计算,则需要的数乘次数为100550+1010050=75000n后一种计算顺序的计算量竟是前者的10倍!n所以,求多个矩阵的连乘积时,计算的结合顺序是十分重要
14、的。第13页,本讲稿共53页算法设计与分析14不同计算顺序的数量n设n个矩阵的连乘积有P(n)个不同的计算顺序。n先在第k个和第k+1个矩阵之间将原矩阵序列分成两个矩阵子序列,k=1,n;再分别对两个子序列完全加括号,最后对结果加括号,便得到原序列的一种完全加括号方式。n由此可得出关于P(n)的递归式:P(n)=1n=1n1P(k)P(nk)n1k=1n解此递归方程可得P(n)=C(n1),其中C(n)=1n+12nn=(4n/n3/2)n所以P(n)随n的增长呈指数增长。因而穷举搜索法不是有效的算法。第14页,本讲稿共53页算法设计与分析15分解最优解的结构n将矩阵连乘积AiAi+1Aj记为
15、Ai:j。n若A1:n的一个最优解是在矩阵Ak和Ak+1处断开的,即A1:n=(A1:kAk+1:n),则A1:k和Ak+1:n也分别是最优解。n事实上,若A1:k的一个计算次序所需计算量更少的话,则用此计算次序替换原来的次序,则得到A1:n一个更少的计算量,这是一个矛盾。同理Ak+1:n也是最优解。n最优子结构性质:最优解的子结构也最优的。最优子结构性质:最优解的子结构也最优的。第15页,本讲稿共53页算法设计与分析16建立递归关系n令mij,1i,jn,为计算Ai,j的最少数乘次数,则原问题为m1n。n当i=j时,Ai,j为单一矩阵,mij=0;n当ij时,利用最优子结构性质有:mij=m
16、inmik+mk+1j+pi1pkpjikj其中矩阵Ai(1in)的维数为pi1pi。n根据此递归式就可以直接用递归程序来实现。第16页,本讲稿共53页算法设计与分析17直接递归的时间复杂性n根据前面的递归式不难得出的时间复杂性为n1(T(k)+T(nk)+1)k=1T(n)n1=(n1)+(T(k)+T(nk)k=1n1n1=(n-1)+T(k)+T(nk)k=1k=1n可用数学归纳法证明T(n)2n1=(2n)。n直接递归算法的时间复杂性随n的指数增长。n1=n+2T(k)k=1第17页,本讲稿共53页算法设计与分析18直接递归中有大量重复计算n直接递归中有大量重复计算,如A1:4计算中:
17、1:41:12:41:23:41:34:42:23:42:34:41:12:23:34:41:12:31:23:33:34:42:23:32:23:31:12:2图中红框标出的都是重复计算。第18页,本讲稿共53页算法设计与分析19消除重复的计算n要消除重复计算,可在计算过程中保存已解决的子问题的答案。这样,每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免重复计算。n计算方式可依据递归式自底向上地进行。n注意到在此问题中,不同的有序对(i,j)就对应不同的子问题,因此不同的子问题个数最多只有Cn2+n=(n2)个。n这样便可以得到多项式时间的算法。第19页,本讲稿共53页算法设计与
18、分析20自底向上的计算n例如对于A1A2A3A4,依据递归式以自底向上的方式计算出各个子问题,其过程如下:m11m22m33m44m12m23m34m13m24m14其中mii=0mii+1=pi1pipi+1mij=minikjmik+mk+1j+pi1pkpj例如:m13=minm11+m23+p0p1p3m12+m33+p0p2p3第20页,本讲稿共53页算法设计与分析21消除重复的矩阵连乘算法nIntMatrixChain(intp,intn,int*m,int*s)nfor(inti=1;i=n;i+)mii=0;n/将对角线元素赋值为零,即单个矩阵计算量为0nfor(intr=2;
19、r=n;r+)/r为连续相乘矩阵的个数nfor(inti=1;i=nr+1;i+)nintj=i+r1;n(5)mij=mi+1j+pi1*pi*pj;n/计算Ai,j=Ai:iAi+1:jnsij=i;/记下断点in(7)for(intk=i+1;kj;k+)nintt=mik+mk+1j+pi1*pk*pj;n/对ikj,逐个计算Ai,j=Ai:kAk+1:jnif(tmij)mij=t;sij=k;n/记下较小的mij及相应的断点knnreturn(m1n);第(5)步与第(7)步能否合在一起?能。此处分开是为了给mij赋初值。第21页,本讲稿共53页算法设计与分析22MatrixCha
20、in的运行举例 设要计算矩阵连乘积A1A2A3A4A5A6,其维数分别为3535,3515,155,510,1020,2025,即p0=35,p1=35,p2=15,p3=5,p4=10,p5=20,p6=25。MatrixChain用矩阵mij,sij存放子问题Ai:j的最小计算量以及相应的断点。1234561 2 3 4 5 6mij1234561 2 3 4 5 6sijMatrixChain将如下面红色箭头所示的过程逐个计算子问题Ai:j:执行for(inti=1;i=n;i+)mii=0后将对角线元素全部置零,即子问题Aii=0。000000当r=2,执行第(5)句完成了相邻矩阵Ai
21、i+1=pi1*pi*pj的计算,并在sij中添入了相应的断点。其中的第(7)句因为j=i+1(k=i+1)而被跳过去了,实际并没有执行。1575026257501000500012345当r=3,i=1时,执行第(5)句计算A1:12:3,m13=m23+p0*p1*p3=2625+30*35*5=787578751执行第(7)句计算A1:23:3,t=m12+m33+p0*p2*p3=15750+0+35*15*5=183757875,所以m13不变,断点仍为1。当r=3,i=2时,执行第(5)句计算A2:23:4,m24=m34+p1*p2*p4=750+35*15*10=6000600
22、02执行第(7)句计算A2:34:4,t=m23+m44+p1*p3*p4=2625+0+35*5*10=43756000,所以m24改为4375,断点改为3。43753当r=3,i=3时,执行第(5)句计算A3:34:5,m35=m45+p2*p3*p5=1000+15*5*20=250025003执行第(7)句计算A3:45:5,t=m34+m55+p2*p4*p5=750+0+15*10*20=37502500,所以m35仍为2500,断点仍为3。当r=3,i=4时,执行第(5)句计算A4:45:6,m46=m56+p3*p4*p6=5000+5*10*25=625062504执行第(7
23、)句计算A4:56:6,t=m45+m66+p3*p5*p6=1000+0+5*20*25=35006250,所以m46改为3500,断点改为5。35005类似的,当r=4、5、6时,可以计算出相应的mij及其相应的断点sij,如下图中所示:937537125353753118753105003151253由m16=15125可知这6个矩阵连乘积的最小运算次数为15125。由s16=3可知A1:6的最优计算次序为A1:3A4:6;由s13=1可知A1:3的最优计算次序为A1:1A2:3;由s46=5可知A4:6的最优计算次序为A4:5A6:6;因此最优计算次序为:(A1(A2A3)(A4A5)
24、A6)。第22页,本讲稿共53页算法设计与分析23MatrixChain的时间复杂性n算法MatrixChain的主要计算取决于程序中对r、i和k的三重循环。循环体内的计算量为O(1),1r、i、kn,三重循环的总次数为O(n3)。因此该算法时间复杂性的上界为O(n3),比直接递归算法要有效得多。算法使用空间显然为O(n2)。n这种算法称为动态规划。第23页,本讲稿共53页算法设计与分析24动态规划的基本思想n将原问题分解为若干个子问题,先求子问题的解,然后从这些子问题的解得到原问题的解。n这些子问题的解往往不是相互独立的。在求解的过程中,许多子问题的解被反复地使用。为了避免重复计算,动态规划
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 规划 优秀 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内