收藏 分享(赏)

ch3动态规划算法设计.ppt

上传人:ysd1539 文档编号:7016736 上传时间:2019-05-01 格式:PPT 页数:77 大小:380.50KB
下载 相关 举报
ch3动态规划算法设计.ppt_第1页
第1页 / 共77页
ch3动态规划算法设计.ppt_第2页
第2页 / 共77页
ch3动态规划算法设计.ppt_第3页
第3页 / 共77页
ch3动态规划算法设计.ppt_第4页
第4页 / 共77页
ch3动态规划算法设计.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

1、算法设计与分析,中原工学院计算机学院 王璐 E-Mail:dqx_ 2008年10月8日,2,第三章 动态规划,本章主要知识点: 3.1 矩阵连乘问题 3.2 动态规划算法的基本要素 3.3 最长公共子序列问题 3.4 最大子段和 3.5 凸多边形的最优三角剖分 3.6 多边形游戏 3.7 图像压缩 3.8 电路布线 3.9 流水作业调度 3.10 0-1背包问题 3.11 最优二叉搜索树 3.12 动态规划加速原理 ,3,引言,规划 (Planning) 规划是比较全面的长远的发展计划-现代汉语词典 动态规划 (Dynamic Planning) 通过多阶段决策逐步找出问题的最终解,并且每个

2、阶段的决策都是需要全面考虑各种不同的情况分别进行决策。这样,当各阶段采取决策后,会不断决策出新的数据,直到找到最优解。 每次决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义。 所以,这种多阶段最优化决策解决问题的过程称为动态规划。 动态规划主要针对最优化问题,4,引言,动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题(或者多个阶段)。 但是经分解得到的子问题往往不是互相独立的。在用分治法求解时,有些子问题被重复计算了许多次。 如果能够保存已解决的子问题的答案,需要时查找出已求得的答案,就可以避免大量重复计算。,5,动态

3、规划基本步骤,找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最优解。,6,3.1 矩阵连乘问题,给定n个矩阵A1,A2,.,An,其中Ai与Ai+1是可乘的,i=1,2,.,n-1。考察这n个矩阵的连乘积A1A2.An。 由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。 若A是p*q矩阵,B是q*r矩阵,则C=A*B是p*r矩阵,计算量

4、为p*q*r。 设有四个矩阵A,B,C,D,它们的维数分别是:A=5010,B=1040,C=4030,D=305 总共有五种完全加括号的方式:(A(BC)D) (A(B(CD) (AB)(CD) (AB)C)D) (A(BC)D) 其数乘次数分别为:16000, 10500, 36000, 87500, 34500 可见,矩阵连乘积的计算次序与其计算量有密切关系。,7,问题描述,给定n个矩阵A1,A2,An,其中Ai与Ai+1是可乘的,i=1,2,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 输入:n,矩阵的行列数p0,p1,pn 输出:最少的数乘

5、次数,计算次序(记录最优断开位置),8,穷举搜索法,穷举法:列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。 算法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1.Ak)(Ak+1An)可以得到关于P(n)的递推式如下:也就是说,P(n)是随n的增长成指数增长的。,9,动态规划法1.分析最优解的结构,下面我们考虑用DP求解。 预处理: 将矩阵连乘积AiAi+1.Aj简记为Ai:j,这里ij。 考察计算Ai:j的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之

6、间将矩阵链断开,ikj,则其相应完全加括号方式为(AiAi+1. Ak)(Ak+1 Ak+2. Aj )。 计算量:Ai:k的计算量加上Ak+1:j的计算量,再加上Ai:k和Ak+1:j相乘的计算量。 分析最优解的结构 特征:计算Ai:j的最优次序所包含的计算矩阵子链 Ai:k和Ak+1:j的次序也是最优的。 矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。,10,2.建立递归关系,设计算Ai:j,1ijn,所需要的最少数乘次数mi,j,则原问题的最优值为m1,n。 当i=j时,Ai:j=Ai,因此,m

7、i,i=0,i=1,2,n。 当ij时,mi,j=mi,k+mk+1,j+pi-1pkpj,这里Ai的维数为pi-1pi。 可以递归地定义mi,j为:k的位置只有j-i种可能。,11,3.计算最优值,从上述分析可以看出,DP也是一个将大问题拆成小问题的过程,也可以称为若干子过程。但不同的是,在每个子过程都需要进行某种决策,以决定最优的解决方案。 子问题不独立,存在重叠情况。,12,3.计算最优值,由此可见,在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。 用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案

8、。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。,13,3.计算最优值,自底向上地分阶段计算 初始状态为1个矩阵相乘的计算量为0; 第2阶段,计算两个相邻矩阵相乘的计算量,如A1*A2,A2*A3,共n-1组。 第3阶段,计算两个相邻矩阵相乘的结果与第三个相邻矩阵相乘的计算量,如A1:3包括A1*(A2*A3)、(A1*A2)*A3,共n-2组。此时,可以利用前面的计算结果。 最后一个阶段,n个相邻矩阵相乘的计算量,共1组,也就是问题的解。,14,决策过程(例),以4个矩阵相乘为例(r1,r2,r3,r4,r5: 5,20,50,1,10

9、0) 先计算相乘的矩阵个数为2的3种情况 m12=r1*r2*r3=5000 m23=r2*r3*r4=1000 m34=r3*r4*r5=5000 再计算相乘的矩阵个数为3的两种情况 m13=minm12+m33+r1*r3*r4,m11+m23+r1*r2*r4=min5250,1100=1100 m24=minm23+m44+r2*r4*r5,m22+m34+r2*r3*r5=min3000,10500=3000,15,决策过程(例),最后计算相乘的矩阵个数为4的一个结果 m14=minm11+m24+r1*r2*r5, m12+m34+r1*r3*r5, m13+m44+r1*r4*r

10、5=min3000+10000,5000+5000+25000,1100+500=1600,数乘次数计算结果,断开位置计算结果 (A1*(A2*A3)*A4,16,决策过程总结,满足最优子结构,建立递推关系。 自底向上计算(分阶段)。 当前决策以先前决策为基础,但不会影响先前决策(无后向性)。 表格存储中间决策结果,需要时查表,避免重复计算。,17,算法描述,算法描述: void MatrixChain(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 (in

11、t i = 1; i = n - r+1; i+) int j=i+r-1;mij = mi+1j+ pi-1*pi*pj;sij = i;for (int k = i+1; k j; k+) int t = mik + mk+1j + pi-1*pk*pj;if (t mij) mij = t; sij = k; ,18,示例,19,4.构造最优解,算法描述:略。 复杂性分析: 算法MatrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。 算法Tra

12、ceBack的复杂性?,20,3.2 动态规划算法的基本要素,从计算矩阵连乘积最优计算次序的动态规划算法可以看出,该算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。从一般意义上讲,问题的这两个重要性质是该问题可以用动态规划算法求解的基本要素。本节着重介绍: 最优子结构 重叠子问题 备忘录方法 此外,本节最后对动态规划算法与备忘录方法的适用条件作了简单介绍。,21,一、最优子结构,矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。 在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然

13、后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。 利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。 注意:同一个问题可以有多种方式刻划它的最优子结构,有些表示方法的求解速度更快(空间占用小,问题的维度低),22,二、重叠子问题,递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。 通常不同的子问题个数随问题

14、的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。,23,三、备忘录方法,备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。 int LookupChain(int i,int j) if (mij 0) return mij; if (i = j) return 0; int u = LookupChain(i,i) + LookupChain(i+1,j) + pi-1*pi*pj; sij = i; for (int k = i+1; k j; k+) int t =

15、 LookupChain(i,k) + LookupChain(k+1,j) + pi-1*pk*pj; if (t u) u = t; sij = k; mij = u; return u; 算法复杂性:T(n)=O(n3),24,关于动态规划算法和备忘录方法的适用条件,综上所述,矩阵连乘积的最优计算次序问题可用自顶向下的备忘录方法或自底向上的动态规划算法在O(n3)计算时间内求解。 这两个算法都利用了子问题重叠性质。总共有(n2)个不同的子问题,对每个子问题两种算法都只解一次并记录答案。当再次遇到该子问题时,简单地取用已得到的答案,节省了计算量,提高了算法的效率。 适用条件:一般来说,当一

16、个问题的所有子问题都至少要解一次时,用动态规划算法比用备忘录方法好。此时,动态规划算法没有任何多余的计算,还可以利用其规则的表格存取方式来减少在动态规划算法中的计算时间和空间需求。当子问题空间中部分子问题可以不必求解时,易用备忘录方法则较为有利,因为从其控制结构可以看出,该方法只解那些确实需要求解的子问题。,25,3.3 最长公共子序列,概述: 若给定序列X=x1,x2,xm,则另一序列Z=z1,z2,zk,是X的子序列是指存在一个严格递增下标序列i1,i2,ik使得对于所有j=1,2,k有:zj=xij。例如,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相应的递增下标

17、序列为2,3,5,7。 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。 给定2个序列X=x1,x2,xm和Y=y1,y2,yn,找出X和Y的最长公共子序列。,26,最长公共子序列的结构,设序列X=x1,x2,xm和Y=y1,y2,yn的最长公共子序列为Z=z1,z2,zk ,则 若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列。 若xmyn且zkxm,则Z是Xm-1和Y的最长公共子序列。 若xmyn且zkyn,则Z是X和Yn-1的最长公共子序列。 由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子

18、序列。因此,最长公共子序列问题具有最优子结构性质。,27,子问题的递归结构,由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用cij记录序列和的最长公共子序列的长度。其中, Xi=x1,x2,xi;Yj=y1,y2,yj。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时Cij=0。其它情况下,由最优子结构性质可建立递归关系如下:,28,计算最优值,由于在所考虑的子问题空间中,总共有(mn)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。 void LCSLength(int m,int n,char *x,char *y,int *c,i

19、nt *b) int i,j; for (i = 1; i =cij-1) cij=ci-1j; bij=2; else cij=cij-1; bij=3; ,29,构造最长公共子序列,算法描述: void LCS(int i,int j,char *x,int *b) if (i =0 | j=0) return; if (bij= 1) LCS(i-1,j-1,x,b); coutxi; else if (bij= 2) LCS(i-1,j,x,b); else LCS(i,j-1,x,b); ,30,算法的改进,在算法lcsLength和lcs中,可进一步将数组b省去。事实上,数组元素c

20、ij的值仅由ci-1j-1,ci-1j和cij-1这3个数组元素的值所确定。对于给定的数组元素cij,可以不借助于数组b而仅借助于c本身在时间内确定cij的值是由ci-1j-1,ci-1j和cij-1中哪一个值所确定的。 如果只需要计算最长公共子序列的长度,则算法的空间需求可大大减少。事实上,在计算cij时,只用到数组c的第i行和第i-1行。因此,用2行的数组空间就可以计算出最长公共子序列的长度。进一步的分析还可将空间需求减至O(min(m,n)。,31,3.4 最大子段和,问题描述: 给定由n个整数(包含负整数)组成的序列a1,a2,.,an,求该序列子段和的最大值。当所有整数均为负值时定义

21、其最大子段和为0。 依此定义,所求的最优值为:例如,当(a1,a2, a3, a4, a5,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为:,32,1. 一个简单算法,一个简单算法: int MaxSum(int n, a, 算法有3重循环,复杂性为O(n3)。,由于有: 算法可作如下改进: int MaxSum(int n, a, 改进后的算法复杂性为O(n2) 。,33,2. 分治方法求解,从问题的解的结构可以看出,它适合于用分治策略求解: 如果将所给的序列a1:n分为长度相等的两段a1:n/1和an/2+1:n,分别求出这两段的最大子段和,则a1:n的最大子段和有三种情形

22、: a1:n的最大子段和与a1:n/2的最大子段和相同; a1:n的最大子段和与an/2+1:n的最大子段和相同; a1:n的最大子段和为下面的形式。 A、B这两种情形可递归求得。对于情形C,容易看出,an/2与an/2+1在最优子序列中。因此,我们可以在a1:n/2和an/2+1:n中分别计算出如下的s1和s2。则s1+s2即为出现情形C使得最优值。从而设计出下面所示的分治算法。,int MaxSubSum(int a, int left, int right) int sum=0;if (left=right)sum=aleft0?aleft:0;elseint center=(left+

23、right)/2;int leftsum=MaxSubSum(a,left,center);int rightsum=MaxSubSum(a,center+1,right);int s1=0;lefts=0;for (int i=center;i=left;i-) lefts+=ai;if (leftss1) s1=lefts;int s2=0;rights=0;for (int i=center+1;is2) s2=rights;sum=s1+s2;if (sumleftsum) sum=leftsum;if (sumsightsum) sum=rightsum;return sum; ,3

24、4,3. 动态规划方法求解,在对上述分治算法的分析中我们注意到,由bj的定义易知,当bj-10时bj=bj-1+aj,否则bj=aj。由此可得计算bj的动态规划递归式bj=maxbj-1+aj,aj,1jn。 据此,可设计出求最大子段和的动态规划算法如下: int MaxSum(int n, int a) int sum=0; b=0; for (i=1;i0) b+=ai; else b=ai; if (bsum) sum=b; return sum; 显然该算法的计算时间为O(n)。,35,4. 算法的推广,最大矩阵和问题,略 最大m子段和问题,略,36,3.5 凸多边形最优三角剖分,用多

25、边形顶点的逆时针序列表示凸多边形,即P=v0,v1,vn-1表示具有n条边的凸多边形。 若vi与vj是多边形上不相邻的2个顶点,则线段vivj称为多边形的一条弦。弦将多边形分割成2个多边形vi,vi+1,vj和vj,vj+1,vi。 多边形的三角剖分是将多边形分割成互不相交的三角形的弦的集合T。 给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和为最小。,37,三角剖分的结构及其相关问题,一个表达式的完全加括号方式相应于一棵完全二叉树,称为表达式的语法树。例如,完全加括号的矩阵连乘积(A1(A2A3)(A4(A5A

26、6)所相应的语法树如图 (a)所示。 凸多边形v0,v1,vn-1的三角剖分也可以用语法树表示。例如,图 (b)中凸多边形的三角剖分可用图 (a)所示的语法树表示。 矩阵连乘积中的每个矩阵Ai对应于凸(n+1)边形中的一条边vi-1vi。三角剖分中的一条弦vivj,ij,对应于矩阵连乘积Ai+1:j。,38,最优子结构性质,凸多边形的最优三角剖分问题有最优子结构性质。 事实上,若凸(n+1)边形P=v0,v1,vn-1的最优三角剖分T包含三角形v0vkvn,1kn-1,则T的权为3个部分权的和:三角形v0vkvn的权,子多边形v0,v1,vk和vk,vk+1,vn的权之和。可以断言,由T所确定

27、的这2个子多边形的三角剖分也是最优的。因为若有v0,v1,vk或vk,vk+1,vn的更小权的三角剖分将导致T不是最优三角剖分的矛盾。,39,最优三角剖分的递归结构,定义tij,1ijn为凸子多边形vi-1,vi,vj的最优三角剖分所对应的权函数值,即其最优值。为方便起见,设退化的多边形vi-1,vi具有权值0。据此定义,要计算的凸(n+1)边形P的最优权值为t1n。 tij的值可以利用最优子结构性质递归地计算。当j-i1时,凸子多边形至少有3个顶点。由最优子结构性质,tij的值应为tik的值加上tk+1j的值,再加上三角形vi-1vkvj的权值,其中ikj-1。由于在计算时还不知道k的确切位

28、置,而k的所有可能位置只有j-i个,因此可以在这j-i个位置中选出使tij值达到最小的位置。由此,tij可递归地定义为:,40,计算最优值,凸n+1边形P=v0,v1,.,vn的最有三角剖分动态规划算法MinWT: void MinWT(int n, type *t, int *s) for (int i=1;i=n;i+) tii=0; for (int r=2; r=n; r+)for (i=1; i=n; i+) int j=i+r-1; tij=tii+ti+1j+w(i-1,i,j); sij=i; for (int k=i+1;kj;k+) int u=tik+tk+1j+w(i-

29、1,k,j); if (utij)tij=u;sij=k; 复杂性:T(n)=O(n3) S(n)=O(n2),41,构造最优解,思考:构造一个在O(n)时间内的求最优解的算法。,42,3.6 多边形游戏,多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下方式操作: (1)选择一条边E以及由E连接着的2个顶点V1和V2; (2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋

30、予新顶点。 最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。 问题:对于给定的多边形,计算最高得分。,43,最优子结构性质,设所给的多边形的定点和便的顺时针序列为: op1, v1, op2, v2, ., opn, vn 在所给多边形中,从顶点i(1in)开始,长度为j(链中有j个顶点)的顺时针链p(i,j) 可表示为vi,opi+1,vi+j-1。 如果这条链的最后一次合并运算在opi+s处发生(1sj-1),则可在opi+s处将链分割为2个子链p(i,s)和p(i+s,j-s)。 设m1是对子链p(i,s)的任意一种合并方式得到的值,而a和b分别是在所有可能的合并中得到

31、的最小值和最大值。m2是p(i+s,j-s)的任意一种合并方式得到的值,而c和d分别是在所有可能的合并中得到的最小值和最大值。依此定义有am1b,cm2d (1)当opi+s=+时,显然有a+cmb+d (2)当opi+s=*时,有minac,ad,bc,bdmmaxac,ad,bc,bd 换句话说,主链的最大值和最小值可由子链的最大值和最小值得到。,44,递归求解,由前面的分析可知,为了求链合并的最大值,必须同时求子链合并的最大值和最小值。 设mi,j,0是链p(i,j)合并的最小值,mi,j,1是最大值。 若最优合并在opi+s处将p(i,j)分为2个长度小于j的子链p(i,s)和p(i+

32、s,j-s),且从顶点i开始的长度小于j的子链的最大值和最小值均已计算出。为叙述方便,记 a=mi,s,0,b=mi,s,1,c=mi+s,j-s,0,d=mi+s,j-s,0 (1)当opi+s=+时,mi,j,0=a+c,mi,j,1=b+d (2)当opi+s=*时,mi,j,0=minac,ad,bc,bd,mi,j,1=maxac,ad,bc,bd 综合(1)和(2),将p(i,j)在opi+s处断开的最大值为maxf(i,j,s),最小值为minf(i,j,s),则由于最优断开位置s有1sj-1的j-1种情况,由此可知初始边界值显然为mi,1,0=vi, mi,1,1=vi, 1i

33、n。,45,算法描述,算法描述:P63 算法复杂性:O(n3),46,3.7 图像压缩,图象的变位压缩存储格式将所给的象素点序列p1,p2,pn,0pi255分割成m个连续段S1,S2,Sm。第i个象素段Si中(1im),有li个象素,且该段中每个象素都只用bi位表示。设 则第i个象素段Si为设 ,则hibi8。因此需要用3位表示bi,如果限制1li255,则需要用8位表示li。因此,第i个象素段所需的存储空间为li*bi+11位。按此格式存储象素序列p1,p2,pn,需要 位的存储空间。图象压缩问题要求确定象素序列p1,p2,pn的最优分段,使得依此分段所需的存储空间最少。每个分段的长度不超

34、过256位。,47,最优子结构性质,设li,bi,是p1,p2,pn的最优分段。显而易见,l1,b1是p1,pl1的最优分段,且li,bi,是pl1+1,pn的最优分段。即图象压缩问题满足最优子结构性质。 设si,1in,是象素序列p1,pn的最优分段所需的存储位数。由最优子结构性质易知:其中 算法复杂度分析:由于算法compress中对k的循环次数不超这256,故对每一个确定的i,可在时间O(1)内完成的计算。因此整个算法所需的计算时间为O(n)。,48,递归计算最优值与构造最优解,递归计算最优值算法描述:P6465 构造最优解算法描述:P6566 Compress:S(n)=O(n),T(

35、n)=O(n),49,3.8 电路布线,在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导线(i,(i)将上端接线柱与下端接线柱相连,如图所示。其中(i)是1,2,n的一个排列。导线(i,(i)称为该电路板上的第i条连线。对于任何1i(j)。 电路布线问题要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。换句话说,该问题要求确定导线集Nets=(i,(i),1in的最大不相交子集。,=8,7,4,2,5,1,9,3,10,6,50,最优子结构性质,记N(i,j)=t|(t,(t)Nets,ti,(t)j,N(i,j)的最大不相交子集为MNS(i,j),Size(i,j)

36、=|MNS(i,j)|。 (1)当i=1时, (2)当i1时, j(i)。此时, (i,(i)N(i,j)。故在这种情况下,N(i,j)=N(i-1,j),从而Size(i,j)=Size(i-1,j)。 j(i)。若(i,(i)MNS(i,j) 。 则对任意(t,(t) MNS(i,j)有ti且(t)(i)。在这种情况下MNS(i,j)-(i,(i)是N(i-1,(i)-1)的最大不相交子集。若(i,(i)N(i,j),则对任意(t,(t) MNS(i,j)有ti。从而MNS(i,j)N(i-1,j)。因此,Size(i,j)Size(i-1,j)。另一方面MNS(i-1,j)N(i,j),

37、故又有Size(i,j)Size(i-1,j),从而Size(i,j)=Size(i-1,j)。 综上可知,电路布线问题满足最优子结构性质。,51,递归计算最优值,算法描述:详见P6768,计算最优值,构造最优解。 算法复杂性: MNS算法:T(n)=O(n2),S(n)=(n2) Traceback算法:T(n)=O(n) 思考:求解目标为最少层数时的算法问题。,void MNS(C, n, *size) for (j=0; jC1; j+) size1j=0;for (j=C1; j=n; j+) size1j=0;for (i=2; in; i+) for (j=0; jCi; j+)

38、sizeij=sizei-1j;for (j=Cj; j=n; j+)sizeij=maxsizei-1j, sizei-1Ci-1+1;sizenn=maxsizen-1n, sizen-1Cn-1+1; ,void Traceback(C, *size, n, Net, m) int j=n;m=0;for (int i=n; i1; i-)if (sizeij!=sizei-1jNetm+=i; j=Ci-1;if (j=C1) Netm+=1; ,52,3.9 流水作业问题,n个作业1,2,n要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M

39、2上加工。M1和M2加工作业i所需的时间分别为ai和bi。 流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。 分析: 直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。在一般情况下,机器M2上会有机器空闲和作业积压2种情况。 设全部作业的集合为N=1,2,n。S是N的作业子集。在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其他作业,要等时间t后才可利用。将这种情况下完成S中作业所需的最短时间记为T(S,t)。流水作业调度问题的最优值为T(N,0)。,53,最优子结构性质,

40、设是所给n个流水作业的一个最优调度,它所需的加工时间为 a(1)+T。其中T是在机器M2的等待时间为b(1)时,安排作业(2),(n)所需的时间。记S=N-(1),则有T=T(S,b(1)。 证明:事实上,由T的定义知TT(S,b(1)。若TT(S,b(1),设是作业集S在机器M2的等待时间为b(1)情况下的一个最优调度。则(1),(2),(n)是N的一个调度,且该调度所需的时间为a(1)+T(S,b(1)a(1)+T。这与是N的最优调度矛盾。故TT(S,b(1)。从而T=T(S,b(1)。这就证明了流水作业调度问题具有最优子结构的性质。 由流水作业调度问题的最优子结构性质可知, 思考:直接利

41、用该递归关系构造动态规划算法。,54,Johnson不等式,对递归式的深入分析表明,算法可进一步得到简化。 设是作业集S在机器M2的等待时间为t时的任一最优调度。若(1)=i, (2)=j。则由动态规划递归式可得: T(S,t)=ai+T(S-i,bi+maxt-ai,0)=ai+aj+T(S-i,j,tij) 其中, 如果作业i和j满足minbi,ajminbj,ai,则称作业i和j满足Johnson不等式。,55,流水作业调度的Johnson法则,交换作业i和作业j的加工顺序,得到作业集S的另一调度,它所需的加工时间为T(S,t)=ai+aj+T(S-i,j,tji) 其中, 当作业i和j

42、满足Johnson不等式时,有 由此可见当作业i和作业j不满足Johnson不等式时,交换它们的加工顺序后,不增加加工时间。对于流水作业调度问题,必存在最优调度 ,使得作业(i)和(i+1)满足Johnson不等式。进一步还可以证明,调度满足Johnson法则当且仅当对任意ij有 由此可知,所有满足Johnson法则的调度均为最优调度。,56,算法及其复杂性,流水作业调度问题的Johnson算法: 令N1=i|aibi,N2=i|aibi; 将N1中作业依ai的非减序排序;将N2中作业依bi的非增序排序; N1中作业接N2中作业构成满足Johnson法则的最优调度。 思考:上述步骤得到的作业序

43、列满足Johnson法则。 算法描述:P70。 算法复杂度分析:算法的主要计算时间花在对作业集的排序。因此,在最坏情况下算法所需的计算时间为O(nlogn)。所需的空间为O(n)。,57,3.10 0-1背包问题,给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 0-1背包问题是一个特殊的整数规划问题。,58,最优子结构性质,设所给0-1背包问题的子问题 的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,可以建立计算m(i

44、,j)的递归式如下。,59,计算最优值算法及其复杂性,算法描述:P72 算法复杂度分析:从m(i,j)的递归式容易看出,算法需要O(nc)计算时间。当背包容量c很大时,算法需要的计算时间较多。例如,当c2n时,算法需要(n2n)计算时间。,60,算法改进,由m(i,j)的递归式容易证明,在一般情况下,对每一个确定的i(1in),函数m(i,j)是关于变量j的阶梯状单调不减函数。跳跃点是这一类函数的描述特征。在一般情况下,函数m(i,j)由其全部跳跃点惟一确定。如图所示。 对每一个确定的i(1in),用一个表pi存储函数m(i,j)的全部跳跃点。表pi可依计算m(i,j)的递归式递归地由表pi+

45、1计算,初始时pn+1=(0,0)。,示例:n=3,c=6,w=4,3,2,v=5,2,1。,62,关于m(i,j),函数m(i,j)是由函数m(i+1,j)与函数m(i+1,j-wi)+vi作max运算得到的。因此,函数m(i,j)的全部跳跃点包含于函数m(i+1,j)的跳跃点集pi+1与函数m(i+1,j-wi)+vi的跳跃点集qi+1的并集中。易知,(s,t)qi+1当且仅当wisc且(s-wi,t-vi)pi+1。因此,容易由pi+1确定跳跃点集qi+1如下qi+1=pi+1(wi,vi)=(j+wi,m(i,j)+vi)|(j,m(i,j)pi+1 另一方面,设(a,b)和(c,d)

46、是pi+1qi+1中的2个跳跃点,则当ca且db时,(c,d)受控于(a,b),从而(c,d)不是pi中的跳跃点。除受控跳跃点外,pi+1qi+1中的其他跳跃点均为pi中的跳跃点。 由此可见,在递归地由表pi+1计算表pi时,可先由pi+1计算出qi+1,然后合并表pi+1和表qi+1,并清除其中的受控跳跃点得到表pi。,63,另一个例子,实例: n=5,c=10,w=2,2,6,5,4, v=6,3,5,4,6。 初始时p6=(0,0),(w5,v5)=(4,6)。 因此,q6=p6(w5,v5)=(4,6)。 p5=(0,0),(4,6)。 q5=p5(w4,v4)=(5,4),(9,10

47、)。从跳跃点集p5与q5的并集p5 q5=(0,0),(4,6),(5,4),(9,10)中看到跳跃点(5,4)受控于跳跃点(4,6)。将受控跳跃点(5,4)清除后,得到p4=(0,0),(4,6),(9,10) q4=p4(6,5)=(6,5),(10,11) p3=(0,0),(4,6),(9,10),(10,11) q3=p3(2,3)=(2,3),(6,9) p2=(0,0),(2,3),(4,6),(6,9),(9,10),(10,11) q2=p2(2,6)=(2,6),(4,9),(6,12),(8,15) p1=(0,0),(2,6),(4,9),(6,12),(8,15) p1的最后的那个跳跃点(8,15)给出所求的最优值为m(1,c)=15。,

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

当前位置:首页 > 实用文档 > 工作计划

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


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

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

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