第8章组合算法与计算复杂性课件.ppt
《第8章组合算法与计算复杂性课件.ppt》由会员分享,可在线阅读,更多相关《第8章组合算法与计算复杂性课件.ppt(158页珍藏版)》请在三一办公上搜索。
1、第八章 组合算法与计算复杂性,8.1 回溯、剪枝与分治算法 8.2 动态规划技术 8.3 试探(启发式)算法 8.4 作业安排问题 8.5 图灵机与特殊语言类,8.1 回溯、 剪枝与分治算法,8.1.1 回溯法(Backtracking) 回溯法有“通用解题法”的美称。用回溯法可以求得问题的所有解或任意解。 回溯法按深度优先搜索策略搜索状态空间树, 从而改进了对解空间所有向量进行穷举,并检查约束条件搜索解的朴素做法, 减少了搜索工作量。 其基本思想如下:,设问题的解x所属的解空间为E=x=(x1, x2, , xn)|xiSi, i=1, 2, , n,构造一棵状态空间树T,解x所满足的约束条
2、件为Pn(x1, x2, , xn)。若k元组(x1, x2, , xn)使Pk(x1, x2, , xk)成立(kn),则称(x1, x2, , xk)为部分解,即T中的一个状态节点,激活该点。对已有部分解(x1, x2, , xk), 在Sk+1中按序选取xk+1;若 xk+1 Sk+1 ,均不能使Pk+1(x1, x2, , xk+1)成立,即把状态节点(x1, x2, , xk)删去(或杀死),回溯到(x1, x2, , xk-1),在Skxk中选取新的xk,激活新的状态节点(x1, x2, , xk),检查Pk(x1, x2, , xk)是否成立。按这种方法对T搜索求解,直至得到解,
3、或者问题无解。对应问题P的状态空间树T可动态构造,也可作为一棵实际中并不出现的虚拟树存在。,例1(Gauss 八后问题) 88国际象棋棋盘上放置8个皇后。 为使各个皇后不能互相攻击, 要求任两个皇后都不在同一行、同一列或同一对角线上。 已知共有92种放法, 用回溯法可求出全部92种方案。 为简化问题,将88棋盘上的八后问题缩小到44棋盘上的四后问题。 用向量(x1, x2, x3,x4) 表示问题的一个解,即要求第i行上皇后放在第xi列。为方便计,称第i行上皇后为第i个皇后。 先放第1个皇后, 再依次放第2、 第3、 第4个皇后。 由国际象棋棋子攻击规则可知,问题的约束条件为任意二后不能在同行
4、、 同列或同一对角线上。,首先已知四后问题有解。 (1) 第1个皇后最初置于第1列, 以后根据回溯要求依次取第2、 第3、 第4列。 (2) 第2个皇后考虑约束条件最初只能置于第3列,依次还可取第4列,以后根据回溯要求后移1列,或依第1个皇后回溯结果再确定满足约束条件的新位置。 (3) 因对1后与2后确定的位置,第3个皇后无论放在哪个位置都违反约束条件, 故回溯。 (4) 第3个皇后依1后居第1列, 2后居第4列而置于第2列。,(5) 对(4)中结果, 因第4个皇后无论放在哪个位置都违反约束条件。 又3后右移1个,2个方格都违反约束条件, 加之2后已居第4列, 故回溯。 (6) 回溯结果1后置
5、于第2列。 (7) 1后居第2列, 2后只能选第4列。 (8) 3后置于第1列, 4后因放于第1、 2列均违反约束条件, 故放到第3列; 从而得到四后问题的一个解(2, 4, 1, 3)。 接着第4个皇后右移一格继续求解, 又可得到另一解(3, 1, 4, 2)。,回溯法求解问题时,要求若Pk(x1,x2,xk)不成立,则一定有Pk+1(x1,x2,xk+1)不成立。从而,当断定(x1,x2,xk)已不满足Pi(x1,x2,xk)时,由部分解不可能搜索到问题的解。 因而没必要继续求余下的分支,从而可以减少计算的工作量。 设xiXi,(x1,x2,xk)是部分解,xk+1的可选范围是xk+1的子
6、集Sk+1。例如上述四后问题中取x1=1之后,S2=3, 4。,回溯算法 1 若Sk非空,选xk是Sk中还未选过的最小值;若kn,则 k k+1, 并重复1;若k=n,则(x1, x2, , xn) 为一解;若要求出所有的解,则kk-1, 并重复1; 2 若Sk为空,且k=1,停止;若Sk为空,且k1,则kk-1,转1。,例2 求如下不等式的正整数解:3x1+2x2+x38,i=1, 2, 3, 1xi3 解 对i=1, 2, 3,令Xi=1, 2, 3,则P1(x1):3x18, 1x13 P2(x1 ,x2):3x1+2x28, 1 x1, x23 P3(x1,x2,x3):3x1+2x2
7、+x38, 1xi3, i=1, 2, 3 因若(x1,x2,x3)满足P3(x1,x2,x3), 则(x1,x2,)一定满足P2(x1,x2),且x1一定满足P1(x1)。 即问题的解对约束条件具有完备性或具有多米诺性质, 故适于用回溯法求解。,显见(x1=1)满足P1(1): 318, 即(1)为一部分解; 取(x1 =1, x2=1), P2(1, 1): 31+218, 11, 13 亦成立; 再取(x1 =1, x2 =1, x3=1), P3(1,1, 1):31+21+1=68 (1, 1, 1)为一解; (x1 =1, x2 =1, x3 =2), P3(1,1, 2):31+
8、21+2=78 (1, 1, 2)为一解; (x1 =1, x2 =1, x3 =3), P3(1,1, 3):31+21+3=88(1, 1, 3) 为一解; x3=4已违反约束条件。,取(x1=1,x2=2),P2(1,2)=3x1+2x2=31+22=78,1x1, x23亦成立; 再取(x1=1,x2=2,x3=1), P3(1,2, 1)=31+22+1=88(1, 2, 1)为一解,x3=2 已违反约束条件。 取 (x1=1, x2=3), P2(1,3)=31+23=98 已不满足原不等式。 不难验证,对(x1 =2), (x1 =3), 采用回溯法均已求不出问题的解。 故例2仅
9、有4个解: (1, 1, 1), (1, 1, 2), (1, 1, 3),(1,2,1),注意1:回溯法能一个不漏地求出问题的解, 因为它只跳过对状态空间树中T不可能通向解的状态节点的搜索。 注意2:回溯法求解问题P的过程是系统地、 动态地搜索激活、 检查约束和回溯杀死状态空间树T的一个状态节点序列的过程。,注意3:可以采用回溯法求解的问题须满足完备性或多米诺性质。对如下问题求整数解:3x1+4x2-x310, i=1, 2, 3, 1xi3 因为3x1+4x2 10,但3x1+4x2-x310,即P2(x1, x2)不满足P3(x1, x2, x3)不满足,多米诺性质不成立,故不能采用回溯
10、法。这时可令x3 =3-x3,则原问题变为3x1+4x2+ x3 13,i=1, 2, 1xi3, 0 x32,时问题就满足了多米诺性质,可用回溯法求出解向量(x1, x2, x3 ),进而转为原问题的解(x1, x2, x3)。,注意4:改进回溯算法的途径。 (1) 回溯算法对于比较复杂的问题因执行时间太长而无法实现。但有些问题(如八后)所求状态,其位置从几何上看具有对称性, 从而可考虑改进算法, 减少工作量。 (2)把一个较大问题分解为几个子问题, 并利用子问题的解进行组合来求得原问题的解。 参见1.4节分治算法。,8.1.2 分支界限法(Branch and Bound) 分支界限方法是
11、从回溯法演变而来的,也是一种在状态空间树T上搜索解的过程。 二者的不同之处在于搜索目标。 回溯法旨在搜索T中满足约束的所有叶状态; 而分支界限法的求解目标则是找出T中满足约束且使某一目标函数达到极大(或极小)的叶状态,即问题在某种意义下的最优解。 回溯法只通过约束条件, 分支界限法除要通过约束条件, 还要通过目标函数的界限来减少无效搜索,提高搜索效率。,回溯法采用的是深度优先搜索策略,即先检查扩展节点的每个子节点,并把满足约束条件且不越过目标函数当前界限者都激活, 然后从中选出一个扩展节点继续搜索。 分支界限法中把满足约束条件的解称为可行解, 最后要求的最优解是指在最大(最小)化问题中, 求目
12、标函数值取最大(最小)的可行解。 因为最大、 最小是可以相互转化的, 如下仅讨论目标函数值取最小的情形。,状态空间树的每个分支点对应(x1, x2, , xk),kn ,仍用(x1, x2, , xn)表示解。分支界限法求最小解时,对每个部分解,都有一相应的“代价”, 且“代价”函数应满足关系: C(x1, x2, , xk)C(x1, x2, , xk, xk+1)即父节点的代价不得超过子节点的代价。还要求代价函数和目标函数在叶状态的值相同。 当找到一个可行解Y时,设Y的代价为B。对状态空间树中搜索到的某个分支点X, 若X的代价大于B,则其子孙的代价会更大, 故不可能成为最优解,因此,没有必
13、要再搜索X的子孙。 可将X为根的子树剪去, 减少计算工作量。 一般将可行解的代价作为上界B, 当找到一个更优(代价更小)的解时,B就修改成这个解的代价。,求最大解可类似讨论。 对有些问题,代价函数C(x1, x2, , xk-1)往往不易求得,但可用一个容易计算的函数C*(x1, x2, , xk-1)代替C(x1, x2, , xk-1)。,例3(分配问题) 设有4个零件P1,P2,P3,P4,要在4台机器m1,m2,m3,m4 上加工。矩阵A=(aij)中,(aij) 表示Pj在mi上加工的时间。 规定每个零件只能在一台机器上加工,且每台机器只能加工一个零件, 这是约束条件。 求耗时最少的
14、加工安排方案。,用向量(x1, x2, x3, x4)表示Pi在mxi上加工,i=1, 2, 3, 4 。由问题的约束条件知x1, x2, x3, x4 是1, 2, 3, 4的一个排列。满足约束条件的解称为可行解,使目标函数ax1, 1+ax2, 2+ax3, 3+ax4, 4取最小值的可行解为最优解。 因m1加工P1耗时最少,可取C*(1)=4为下界,并取x1=1,其余xi值待定,部分解为(1),因P1在m1上加工,在矩阵A中不再考虑第1行、第1列。从A中删去第1行、第1列, 得子矩阵:,图 8.1.1 例3插图,例4 (背包问题) 设xj为放入背包内Pj类物件的件数,b为背包内允许装入物
15、件的最大重量,wj,vj(1jn)分别为Pj类物件的重量和价值, 则背包问题(在不超重前提下装入物件价值最大)可归结为如下整数规划问题:,即求满足约束条件并使目标函数值取最大的解(x1, x2, , xn)。,解背包问题之前先将物件按价值比重量进行排序并编号, 考虑把单位重量价值高的物件排在前边优先装包,使得对物件重新编号后有vi/wivi+1/wi+1。 背包问题的解由n元组(x1, x2, , xn)表示,属状态空间树T的叶节点。k元组(kn)(x1, x2 , , xk)为部分解,是树T的分支点。此时,对已装入背包内物件的重量 ,有如下2种情况:,(1) 存在jk,使得,这表明背包内还可
16、装入物件xj(jk)而不超重。其中,若全部放Pk+1类物件自然要比放其它物件价值高。从而,对部分解(x1, x2, , xk),相应的函数值C*(x1, x2, , xk)就取为,由于vi/wivi+1/wi+1,上式给出的值就是前缀为(x1, x2, ,xk)的可行解的目标函数值的一个上界。且这样确定的C*值满足,C*(x1, x2, , xk)C*(x1, x2, , xk, xk+1),(2) 对所有jk,,这说明背包内已无法放入任一Pj(jk)类物件,否则就会超重。它对应的可行解为解空间中的向量(x1, x2, , xk, 0, 0, , 0),故在树T的这个状态点上不必再生成子节点。
17、C*(x1, x2, , xk)就取,设背包内可放4种物件P1, P2, P3, P4,已知w1=8, w2=6, w3=5, w4=2;v1=10, v2=7, v3=5, v4=1。限制背包内总重不超过10。求把物件放入背包在不超重的前提下使装入物件价值最大的方案。,解 根据题意, 可得如下整数规划问题:约束条件: 8x1+6x2+5x3+2x410 目标函数: z=10 x1+7x2+5x3+x4 求4元组(x1, x2, x3, x4), xi为非负整数(i=1,2, 3, 4), 满足约束条件且使目标函数z取最大值。,一般情况下需要对物件先进行排序编码,因本例所给物件已满足v1/w1
18、v2/w2v3/w3v4/w4,即10/87/65/51/2,就按P1, P2, P3, P4先后排列的优先顺序向背包内放物件。背包容纳物件重量限制为10,已知w1=8, 放入背包的物件数只能是0个或1个。记X1=0, 1,同理可得X2=0, 1,X3=0, 1, 2,X4=0, 1, 2, 3, 4, 5。 在要生成的状态空间树T中,根节点只有2个子节点(1)及(0)。 第1层节点也有2个子节点,第2层节点有3个子节点,第3层节点有6个子节点。,由根生成子节点(0)和(1),有,图 8.1.2 例4插图,8.1.3 游戏树与-剪裁 在博弈游戏中,对弈双方需要根据当前弈局分析预见以后的格局,
19、选择自己的对策,希望能战胜对方,战平对方,或在最不利的情况下, 输得最少。 决策树是处理对弈乃至一般竞争的工具。 设有2个人F(First,先手)与S(Second,后手)玩棋子游戏,一共6枚棋子,2人轮流取,每次可取1枚、 2枚、3枚,但不能不取; 谁最后取完棋子算谁赢,且取到几枚赢几分。,图 8.1.3 6子游戏树,参见图8.1.3, 方框表示轮F取子, 圆圈表示轮S取子, 其中的数字表示剩余棋子数,边上的数字表示取走的棋子数,叶节点处标F表示F赢,标S表示S赢。叶节点中的数值表示F(或S)赢得的分值。 现从对策树中要选出估计可能是“最好”的一系列对策。这种估计是由树叶的估计函数值通过最大
20、最小过程进行的。树叶的估价函数值是静态的估价函数值,这是从现在的格局以及对将来的影响综合得到的。,由于游戏是F、 S双方轮流进行, 决策树以一方(如F)考虑每个分支的估价函数值。 图8.1.4是一棵假象对策树。 树叶上的值是事先对格局综合考虑后给出的。 其中方框节点表示由F作决策, 圆圈节点表示由S作决策。 如果以赢x分表示F赢x分, 当然F希望赢的分值越大越好,故称F为极大化者。 对S而言, 自然希望这个x越小越好, 甚至一直小到-x, 即F赢-x分或看作S赢|x|分,故称S为极小化者。,图 8.1.4 由叶节点导出的决策树,从而对F而言, 给每个方框节点都从子节点选最大值填入; 而对S而言
21、, 给每个圆圈节点都从子节点中选最小值填入。 对于一个比较复杂的游戏,如果采用上述分析方法,从树叶开始一步一步向回推, 直到树根为止, 这实际上几乎是不可能的。从而对某些问题考虑采用分支界限的方法,对决策树而言, 就称这种技术为-剪裁。,图 8.1.5 -剪裁,在图8.1.5(a)中, r为极大化点, u是r的子节点且u值为。 当v时, 在搜索中就可删去v及以它为根的子树。 亦即, 可把v为根的子树从决策树中剪掉, 常称其为CD*2剪裁。 值称为r的下剪裁值。对于r的后裔, 凡是小于r的下剪裁值者都要剪掉。 不难发现,如果r的下剪裁值为,则r的所有后裔的下剪裁值也是。 因为对r的后裔,比如v,
22、 它是极小化点, 只有当v的所有儿子都大于等于时, v的值才能大于等于。故对v的所有小于的子节点根本不必考虑。,类似地,可定义r的上剪裁值。 在图8.1.5(b)中, r是极小化点, u是r的一个子节点,且u值为。如果v值, 则可以把以v为根的树从决策树中剪裁掉, 常称其为-剪裁,并称为上剪裁值。不难看出,当r的上剪裁值为时,r的所有后裔的上剪裁值也是。 如图8.1.6所示的对策树, 采用-剪裁技术后变为图8.1.7。,图 8.1.6 剪裁树,图 8.1.7 -剪裁实例,8.1.4 分治算法 分治算法是一种重要的设计算法的方法。一般将一个规模大的问题分割成若干个子问题,解出这些子问题后,再把它
23、们组合成原问题的解。 往往子问题和原来问题的类型相同,这就可与递归过程结合使用。 分治算法中一个著名的例子是Strassen的矩阵相乘算法。 设A, B为两个nn矩阵,乘积C=AB也是nn矩阵,计算C(i, j)要n次乘法, n-1次加法。矩阵C一共有n2个元素,因此总共需要作n2(n-1)次加法, n3次乘法。分治算法提出了另一种计算矩阵的方法。为简单起见,假设n=2k,把矩阵分别划分为4个n/2n/2的子矩阵,矩阵A和B相乘为,通常矩阵乘法是,Strassen计算Cij的方法,仅需要7次矩阵乘法和18次矩阵加减法,公式如下:,设T(n)是两个nn矩阵乘积所需的元素运算(乘法,加减法)次数。
24、依上述Strassen方法,可得递推公式:,于是,其中,n=2k, k=lbn。因此Strassen矩阵相乘算法的时间复杂性是O(nlb7)O(n2.81) K.Glover证明恰有36种方法计算Cij,每种方法仅使用7次乘法。以下再介绍一种。,S1=A21+A22, S2=S1-A11, S3=A11-A21, S4=A12-S2S5=B12-B11, S6=B22-S5, S7=B22-B12, S8=S6-B21M1=S2S6, M2= A11B11, M3= B21, M4= S3 S7 ;M6=S4B22, M7= A22 S8, T1= M1 + M2,T2= M1 + M4 ;C
25、11=M2+M3, C12=T1+M5+M6, C21=T2-M7, C22=T2+M5,一共7次矩阵乘法和15次矩阵加减法。若能找到一个方法, 少于7次矩阵乘法,则时间复杂性O(n2.81)能进一步减少。但是, Hopcroft和Kerr证明7次乘法是必需的, 再也不能减少。Victor pan发现新方法,时间复杂性是O(n2.734)。,8.2 动态规划技术,所谓动态规划, 是相对于静态规划而言的。一般的线性或非线性规划问题,不涉及与时间有关的因素,故称之为静态规划。 在动态规划中,要处理的问题可以分成多个子问题,子问题互相关联,形成多个阶段,多阶段的决策策略只与有关阶段的因素有关,因此可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 组合 算法 计算复杂性 课件

链接地址:https://www.31ppt.com/p-1819707.html