[精选][6]动态规划策略

上传人:我**** 文档编号:182721477 上传时间:2021-05-21 格式:PPTX 页数:43 大小:376.40KB
返回 下载 相关 举报
[精选][6]动态规划策略_第1页
第1页 / 共43页
[精选][6]动态规划策略_第2页
第2页 / 共43页
[精选][6]动态规划策略_第3页
第3页 / 共43页
[精选][6]动态规划策略_第4页
第4页 / 共43页
[精选][6]动态规划策略_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《[精选][6]动态规划策略》由会员分享,可在线阅读,更多相关《[精选][6]动态规划策略(43页珍藏版)》请在金锄头文库上搜索。

1、动 态 规 划,河海大学计算机信息学院 丁海军 ,例1:求出从顶点1点到顶点7点的最短路径,方法?,一、导言,最优性原理 根据穷举法,(1,3,5,7)为优化解。 优化原理指:相对于初始决策13造成的问题状态,(3,5,7)必须是3到7的最短路。否则(1,3,5,7)也不可能是优化的。 无论第一步决策取2,3,4中那一节点,其后的决策序列必须是该节点到目的节点的最短路 节点1到目的节点的最短路长度可从2,3,4到目的节点的最短路长度节点1到这些节点的边成本经枚举得到,应用优化原理设计算法的过程如下: 选择子问题的表示:设f(i)为i到目的节点的最短路长度 建立f(i)的递归方程 设Ai为与i相

2、邻的结点集合,则有,初始f(7)=0 依次计算f(6),f(1): f(6)=1,f(5)=2, f(4)=8+f(6) f(3)=min1+f(5),5+f(6) f(2)=min7+f(5),6+f(6) f(1)=min1+f(2),4+f(3),6+f(4) 递归还可从前向后:f(i)=节点1到节点i的最短路的长度;递归从f(1)=0开始。,例1: (数字三角问题)如图所示的数字三角形,从顶部出发,在每一个节点可以选择向左走或者向右走,一直走到底部,要求找到一条路径,使路径上的数字和最大。,贪心法?,穷举法?,用函数fi(x)表示第i层节点到底部(假设是第N层)的路径上数字和的最大值。

3、,显而易见:f1(9)=9+maxf2(12)+f2(15),问题变成:f1(9)=?,f2(12)=12+maxf3(10)+f3(6),f2(15)=15+maxf3(6)+f3(8),fi(x)=x+maxfi+1(x1)+fi+1(x2)+,递归公式的终止条件: fN(19)=19 fN(7)=7 ,思考: 请同学们手工计算一下结果? 如何编程?,如何编程与数据结构有关:将原始数塔写成下面的形式,用dataij表示这个矩阵,用矩阵dij表示上面的fi(x),用矩阵表示的递归公式是什么样子?,Dij= dataij +maxdi+1j,di+1j+1,Dnj=dataij,i=n-1,n

4、-2,2,1,最终的结果d11=?,下一个问题:求的dij后如何让具体最大值路径?,b=dij-dataij if(b=di+1j), then (i,j)(i+1,j) if(b=di+1j+1), then (i,j)(i+1,j+1),总结:动态规划问题的设计要素? 划分子问题 用参数表达子问题的边界,将问题求解转化为多步判断问题 确定优化目标函数 根据问题性质,以函数的极大或者极小为依据,确定是否满足最优原理 列出关于优化函数的递推方程和边界、约束条件 注意:递推方程中总会存在极大或极小运算 求解递推方程 两种求解递推方程的方法 自顶向下:递归方法 自底向上:迭代方法,例2: (资源分

5、配问题)设有n个单位的资源(比如n万元的资金),分配给m个项目,gi(x)为第i个项目的到x单位的资源所产生的利润。求利润总和为最大的资源分配方案。 下表是n=7万元资金分配给三个项目A、B、C的利润表,分析:根据题意,本质上是求下面的优化问题 J(x1,x2,.,xm)=maxg1(x1)+g2(x2)+gm(xm) x1+x2+xm=n 0 xin, 要求xi是整数,这是一个整数规划问题。,解法1:最笨的求解方法?穷举发,解法2:动态规划方法 关键:找到一个递归公式,假设,将数量为x单位的资源分配前i个项目的最大利润为fi(x),可以写出下面的递归公式,最终所需要的最大值是:fm(n)=?

6、,如何编程?需要解决数据结构问题,将函数用数组表示,x用j表示,y用k表示,可写出下面的递归公式,fmn就是所需要的最大利润。 实际编程时,还缺少一个东西?每个项目到底分配到多少资源量?,定义数组aij aij=kmax 表示前i个项目分配资源量为j的情况下,使得前i个项目利润最时,第i个项目分配的资源量为kmax。,求的aij之后,就可以求的每个项目分的资源量: j=n; for(i=m;i=1;i-) xi=aij; j=j-xi; ,二、动态规划问题的设计方法,1.动态规划的特点 最优值 递归(递推)公式 重复子问题 自顶向下递归实现 存在问题:大量重复计算 解决办法:备忘录 自底向上递

7、推实现 根据问题递推公式性质,循环递推即可,三、进一步的例子,例3: (矩阵链乘)给定n个矩阵A1,A2,An , 其中Ai与Ai+1是可乘的(i=1,2,3,n-1)。考察这n个矩阵的连乘积 A1A2A3An 由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积,给定n个矩阵A1,A2,An,其中Ai与Ai+1是可乘的(i=1,2 ,n-1)。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘

8、次数最少?,为了表示方便, 以矩阵加括号表示矩阵相乘的顺序,输入:向量 P = ,n个矩阵的行数、列数 实例: P = A1: 10 100, A2: 100 5, A3: 5 50,完全加括号的矩阵连乘积可递归地定义为:,(1)单个矩阵是完全加括号的; (2)矩阵连乘积A是完全加括号的,则A可 表示为2个完全加括号的矩阵连乘积B和C 的乘积并加括号,即 A=(B)(C),设有四个矩阵A、B、C、D,它们的维数分别是,16000,10500,36000,87500,34500,四种加括号方式,穷举法 列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的

9、计算次序。,算法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1.Ak)(Ak+1An)可以得到关于P(n)的递推式如下:,将矩阵连乘积 A1A2A3,An简记为Ai:j,这里ij,考察计算Ai:j的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,ikj,则其相应完全加括号方式为,计算量:Ai:k的计算量加上Ak+1:j的计算量,再加上Ai:k和Ak+1:j相乘的计算量,动态规划, 划分子问题,确定子问题的边界,有i和j确定子问题的边界,设计算Ai:j,1ijn,所需要的最少数乘次数mi,j,则原

10、问题的最优值为m1,n 当i=j时,Ai:j=Ai,因此,mi,i=0 当ij时,这里 的维数为,的位置只有 种可能,可以递归地定义mi,j为:, 确定优化函数和递推方程:,设立标记函数(决策函数) 为了确定加括号的次序,定义 si,j,记录mi,j最优时k的位置 si,j=k,问题:如何编程实现?, 自顶向下递归实现 自底向上迭代(递推)实现,int RecurMatrixChain(P,i,j) mi,j= si,j=i for( k=i to j1 ) q = RecurMatrixChain(P,i,k) + RecurMatrixChain(P,k+1,j) + pi1 pk pj

11、If (qmi,j) mi,j=q si,j=k /end if /end for return mi,j ,这里没有写出算法的全部描述(进入递归调用的初值等),方法1:直接递归方法实现,26,复杂性满足递推关系,数学归纳法证明 T(n)2n1 n=2,显然为真 假设对于任何小于n 的 k 命题为真, 则,*递归实现的复杂性,27,n=5,计算子问题:81个;不同的子问题:15个,复杂性高的原因:子问题重复计算,方法2:直接递推方法,MatrixChain(P,n) 令所有的 mi,j初值为0 1 i j n for( r 2 to n) / r为计算的矩阵链长度 for( i 1 to nr

12、+1) /n-r+1为最后r链的始位置 j i+r1 / 计算链ij mi,j mi+1,j + pi1*pi*pj / Ai(Ai+1.Aj) si,j i /记录分割位置 for(k i+1 to j1) t mi,k+mk+1,j+ pi1*pk*pj /(Ai.Ak)(Ak+1.Aj) if( tmi,j) mi,jt si,jk /end if / end for(k=) /end for(i=.),算法复杂度分析: 算法matrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)

13、。算法所占用的空间显然为O(n2)。,例4:(最长公共子序列) 概念: 若给定序列X=x1,x2,xm,另一序列Z=z1,z2,zk,如果存在一个严格递增下标序列i1,i2,ik使得对于所有j=1,2,k有:zj=xij。则称Z是X的子序列。 例,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相应的递增下标序列为2,3,5,7。 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。 给定2个序列X=x1,x2,xm和Y=y1,y2,yn,X和Y的公共子序列有很多,找出X和Y的最长公共子序列。,分析:设 X=“abcbdab” Y=

14、“bdcdb”,最长公共子序列是:Z=“bcdb”, 子问题划分及依赖关系,子问题边界: X和Y 起始位置为1,X的终止位置是 i,Y 的 终止位置是 j,记作 Xi=,Yj= 依赖关系: X=, Y=, Z=, Z 为 X 和 Y 的 LCS,那么,(1)若xi=yj,则zk=xi=yj,且Zk-1是Xi-1和Yj-1的最长公共子序列。 (2)若xiyj且zkxi,则ZK是Xi-1和Yj的最长公共子序列。 (3)若xiyj且zkyj,则Zk是Xi和Yj-1的最长公共子序列。,由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。

15、,由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。 用cij记录序列和的最长公共子序列的长度。其中, Xi=x1,x2,xi;Yj=y1,y2,yj。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时Cij=0。 其他情况下,由最优子结构性质可建立递归关系如下:, 递推方程、决策函数,标记函数:Bi, j, 其值为字符、,分别表示Ci,j取得最大值时的三种情况,LCS(X,Y,m,n) /求最长公共子序列长度 for( i=1 to m) Ci,0=0 /边界情况 for( i=1 to n ) C0,i=0 for( i=1 to m ) for( j=1 to

16、n) if (Xi=Yj) Ci,j=Ci1,j1+1 Bi,j= else if(Ci1,j Ci,j1) Ci,j=Ci1,j Bi,j= else Ci,j=Ci,j1 Bi,j= end for(j=),Construct_Sequence(B, i, j) /输入:Bi,j /输出:X与Y的最长公共子序列 if( i=0 or j=0 ) then return /一个序列为空 if (Bi,j =“”) 输出Xi Construct_Sequence (B, i1, j1) else if(Bi,j=“”) Construct_Sequence (B, i1, j) else Construct_Sequence (B, i, j1),算法的计算复杂度 计算优化函数和标记函数:时间为O(mn) 构造解:每一步至少缩小X 或 Y 的长度,时间(m+n) 空间:(mn),输入:X=, Y=, 标记函数: 解:X2,X3, X4, X6, 即 B, C, B, A,实例,例4:(最长递增子序列) 若给定序列A=(a1,a2,am),如果存在一个下标序列 i1i2ik ,使得 则称

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号