第5章回溯法(YZW)_第1页
第5章回溯法(YZW)_第2页
第5章回溯法(YZW)_第3页
第5章回溯法(YZW)_第4页
第5章回溯法(YZW)_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第五章第五章 回溯法回溯法教学目标教学目标掌握回溯法的算法框架掌握回溯法的算法框架理解回溯法的基本思想理解回溯法的基本思想掌握回溯法及分支限界法的异同掌握回溯法及分支限界法的异同掌握子集树、排列树及满掌握子集树、排列树及满m叉树的算法设计模式叉树的算法设计模式通过实例学习,掌握回溯法及分支限界法解决问通过实例学习,掌握回溯法及分支限界法解决问题的方法步骤题的方法步骤什么是回溯什么是回溯回溯回溯回溯回溯入口入口出口出口回溯回溯迷宫游戏迷宫游戏什么是回溯法什么是回溯法回溯法是一个既带回溯法是一个既带有系统性又带有跳跃有系统性又带有跳跃性的的性的的搜索算法搜索算法回溯法是以回溯法是以深度优先深度优

2、先的方式系统地搜索问题的方式系统地搜索问题的解的解, 它适用于解一些组合数较大的问题。它适用于解一些组合数较大的问题。回溯回溯 穷举搜索穷举搜索思想针对问题的可能解是有限种的情况,逐一检查所有可能的情况,从中找到问题真正的解。示列给定一个有向带权图G=(V,E),权非负,如图5-1所示。找出顶点15的最短路径及其长度。 问题分析该问题所有可能的路径只有三条,分别是:12451345145采用穷举搜索的方法逐一检查这三条路径的长度。最短路径为1245,其长度为3。5.2深度优先搜索深度优先搜索思想(给定图G=(V,E))初始时,所有顶点均未被访问过,任选一个顶点v作为源点。该方法先访问源点v,并

3、将其标记为已访问过;然后从v出发,选择v的一个邻接点(子结点)w,如果w已访问过,则选择v的另外一个邻接点;如果w未被访问过,则标记w为已访问过,并以w为新的出发点,继续进行深度优先搜索;如果w及其子结点均已搜索完毕,则返回到v,再选择它的另外一个未曾访问过的邻接点继续搜索,直到图中所有和源点有路径相通的顶点均已访问过为止;若此时图G中仍然存在未被访问过的顶点,则另选一个尚未访问过的顶点作为新的源点重复上述过程,直到图中所有顶点均已访问过为止。示例:给定一个有向图G=(V,E),如图5-2所示。给出深度优先搜索该图的一个访问序列。输出一个深度优先搜索序列:1,2,5,3,4,6,7 练习给定一

4、个无向图G=(V,E),如图5-4所示。给出深度优先搜索该图的一个搜索序列。算法描述/标记图中顶点是否被访问过bool Visitedn+1; for(int i=1;i=n;i+) Visitedi=0;/用0表示顶点未被访问过/从顶点k出发进行深度优先搜索Dfsk(int k) Visitedk=1;/标记顶点k已被访问过for(int j=1;j=n;j+) if(ckj=1 & Visitedj=0)/c是图G对应的邻接矩阵 Dfsk(j);/深度优先搜索整个图GDfs() for(int i=1;in) output(x); elsefor (int i=f(n,t);i0)

5、 if (f(n,t)=g(n,t) for (int i=f(n,t);in) output(x); if(constraint(t)/判断能否沿着扩展结点的左分支进行扩展 做相关标识;Backtrack(t+1);做相关标识的反操作; if(bound(t)/判断能否沿着扩展结点的右分支进行扩展做相关标识;Backtrack(t+1);做相关标识的反操作;示例示例1:0-1 背包问题背包问题问题描述问题描述给定给定n种物品和一背包。物品种物品和一背包。物品i的重量是的重量是wi,其价值为,其价值为vi,背包的容量为背包的容量为W。一个物品要么全部装入背包,要么全。一个物品要么全部装入背包,

6、要么全部不装入背包,不允许部分装入。装入背包的物品的总部不装入背包,不允许部分装入。装入背包的物品的总重量不超过背包的容量。问应如何选择装入背包的物品,重量不超过背包的容量。问应如何选择装入背包的物品,使得装入背包中的物品总价值最大使得装入背包中的物品总价值最大?定义问题的解空间定义问题的解空间 解的形式解的形式(x(x1 1,x,x2 2,x,xn n) ),其中,其中x xi i=0=0或或1 1x xi i=0:=0:第第i i个物品不装入背包个物品不装入背包x xi i=1:=1:第第i i个物品装入背包个物品装入背包确定接空间的组织结构确定接空间的组织结构搜索解空间搜索解空间约束条件

7、约束条件 wic(c为包的剩余容量)也就是:为包的剩余容量)也就是:限界条件:限界条件:cp+rpbestp 其中其中cp:当前已装入背包的物品的总价值当前已装入背包的物品的总价值rp:剩余不知道是否装入的物品的总价值剩余不知道是否装入的物品的总价值bestp:当前已经找到的最优解的价值:当前已经找到的最优解的价值搜索过程搜索过程以以n=4,W=7,w=(3,5,2,1),v=(9,10,7,4) 为例为例展示搜索过程展示搜索过程n1iiiWxw根结点是活结点并且是当前的扩展根结点是活结点并且是当前的扩展结点结点 第一个物品的重量为第一个物品的重量为3,34,不,不满足约束条件满足约束条件cp

8、=9,rp=11,bestp=0,cp+rpbestp,满足限界条件。满足限界条件。 第第3个物品的重量是个物品的重量是2,背包的剩,背包的剩余容量为余容量为4,满足约束条件,满足约束条件 第第4个物品的重量为个物品的重量为1,背包的剩,背包的剩余容量为余容量为2,满足约束条件。现在已,满足约束条件。现在已经到达叶子,找到当前最优解,经到达叶子,找到当前最优解,bestp=20此时要回溯到离结点此时要回溯到离结点5最近的活最近的活结点结点4,结点,结点4再次成为扩展结再次成为扩展结点点限界条件限界条件cp=16,rp=0,bestp=20 cp+rpbestp,限界,限界条件不满足条件不满足;

9、 回溯到最近的活结点回溯到最近的活结点3,结点,结点3再次成为扩展结点再次成为扩展结点限界条件是否满足,限界条件是否满足,cp=9,rp=4,bestp=20,cp+rpbestp,限界条,限界条件满足件满足 扩展结点扩展结点6沿着左分支继续扩展,第二个物品沿着左分支继续扩展,第二个物品的重量为的重量为5,57,满足约束条件,满足约束条件 扩展结点扩展结点7沿着左分支继续扩展,判断约束条沿着左分支继续扩展,判断约束条件,当前背包剩余容量为件,当前背包剩余容量为2,第,第3个物品的重个物品的重量为量为2,满足约束条件,满足约束条件 扩展结点扩展结点7沿着左分支继续扩展,判断约束条沿着左分支继续扩

10、展,判断约束条件,当前背包剩余容量为件,当前背包剩余容量为2,第,第3个物品的重个物品的重量为量为2,满足约束条件,满足约束条件 扩展结点扩展结点8沿着左分支继续扩展,当沿着左分支继续扩展,当前背包剩余容量为前背包剩余容量为0,第,第4个物品的个物品的重量为重量为1,01,不满足约束条件,不满足约束条件沿着扩展结点沿着扩展结点8的右分支进行扩展,的右分支进行扩展,判断限界条件,判断限界条件,cp=17,rp=0,bestp=20,cp+rpbestp,不满足,不满足限界条件限界条件回溯到最近的活结点回溯到最近的活结点7,扩展结点,扩展结点7沿着右分支继续扩展,判断限界条沿着右分支继续扩展,判断

11、限界条件,当前件,当前cp=10,rp=4,bestp=20,cp+rpbestp,限界条件不满足,限界条件不满足回溯到活结点回溯到活结点6,扩展结点,扩展结点6沿着右沿着右分支继续扩展,当前分支继续扩展,当前cp=0,rp=11,bestp=20,cp+rpbestp 中,rp表示第t+1个物品到第n个物品的总价值。事实上,背包的剩余容量不一定能够容纳从第t+1个物品到第n个物品的全部物品,那么剩余容量所能容纳的从第t+1个物品到第n个物品的最大价值(用brp表示)肯定小于或等于rp,用brp取代rp限界条件可改写为:cp+brpbestp 练习:参考教材,写一份对比分析报告。要求画出搜索过

12、程,并说明与改进前的搜索过程对比有哪些改进。关键代码分析int Knap:Bound(int i) /计算上界int cleft=c-cw;/剩余容量int b=cp;/以物品单位重量价值递减序装入物品while(i=n & wi=cleft) cleft-=wi; b+=pi;i+;/装满背包if(in)/到达叶子结点 for(int j=1;j=n;j+) bestxj=xj; bestp=cp;return; if(cw+wt=c) /搜索左子树 xt=1; cw+=wt; cp+=pt;复杂性分析判断约束函数需O(1),在最坏情况下有2n-1个左孩子,约束函数耗时最坏为O(2n

13、)。计算上界限界函数需要O(n)时间,在最坏情况下有2n-1个右孩子需要计算上界,限界函数耗时最坏为O(n2n)。0-1背包问题的回溯算法所需的计算时间为O(2n)+O(n2n)= O(n2n)。示例示例2:最大团问题最大团问题基本概念基本概念完全子图:完全子图:给定无向图给定无向图G=(V,E)。如果。如果U V,且对任意,且对任意u,v U有有(u,v) E,则称,则称U是是G的完全子图。的完全子图。团:团:G的完全子图的完全子图U是是G的团当且仅当的团当且仅当U不包含在不包含在G的更的更大的完全子图中。大的完全子图中。最大团:是指最大团:是指G中所含顶点数最多的团。中所含顶点数最多的团。

14、问题描述:最大团问题要求找出给定无向图问题描述:最大团问题要求找出给定无向图G的最大团的最大团12453问题分析问题分析最大团问题就是要求找出无向图最大团问题就是要求找出无向图G=(V,E)的的n个个顶点集合顶点集合1,2,3,n的一个子集,这个子集中的的一个子集,这个子集中的任意两个顶点在无向图中都有边相连,且包含任意两个顶点在无向图中都有边相连,且包含顶点个数是最多的。顶点个数是最多的。解空间:解空间:子集树子集树约束条件:约束条件:顶点顶点i到已选入的到已选入的顶点集合中每一个顶点集合中每一个顶点都有边相连。顶点都有边相连。 Bool Place(int t) Bool OK=true;

15、 for (int j=1; jbestncn:当前已包含在顶点集中的顶点个数当前已包含在顶点集中的顶点个数rn:剩余顶点个数;剩余顶点个数;bestn:当前已找到的最优解包含的顶点个数当前已找到的最优解包含的顶点个数搜索过程(以图搜索过程(以图5-14为例)为例)关键代码分析关键代码分析void Backtrack(int t) if (t n) / 到达叶结点到达叶结点 for(int i=1;ibestn) / 进入右子树进入右子树 xt=0; Backtrack(t+1); 4.4 回溯法(Backtracking)算法如下:算法如下:piblic class MaxClique st

16、atic int x; /当前解 static int n; /图G的顶点数 static int cn; /当前顶点数 static int bestn; /当前最大顶点数 static int bestx; /当前最优解 static boolean a; /图G的邻接矩阵 public static int maxClique(int v) /初始化 x=new int n+1; cn=0; bestn=0; bestx=v;4.4 回溯法(Backtracking) /回溯搜索 backtrack(1); return bestn; private static void backtr

17、ack(int i) if(in) /到达叶结点 for(int j=1;j=n;j+) bestxj=xj; bestn=cn; return ; /检查顶点i与当前团的连接 boolean ok=true; for (int j=1;jbestn) /进入右子树 xi=0; backtrack(i+1); 算法效率:O(n2n)算法分析判断约束函数需O(n),在最坏情况下有2n-1个左孩子,耗时最坏为O(n2n)。判断限界函数需要O(1)时间,在最坏情况下有2n-1个右孩子结点需要判断限界函数,耗时最坏为O(2n)。最大团问题的回溯算法所需的计算时间为O(2n)+O(n2n)= O(n2n

18、)。62思考 子集和数问题已知n+1个正数:wi, 1in, 和M。要求找出wi 的所有子集使得子集内元素之和等于M。例如: n=4, (w1,w2,w3,w4)=(11,13,24,7),M=31 则满足要求的子集是(11,13,7)和(24,7)。 如果用满足条件的wi的下标表示解向量,则这两个解可表示为(1,2,4)和(3,4)。5.3.3排列树排列树当所给的问题是从n个元素的排列中找出满足某种性质的一个排列时,相应的解空间树称为排列树。此类问题解的形式为n元组(x1,x2,xn),分量xi(i=1,2,n)表示第i个位置的元素是xi。n个元素组成的集合为S=1,2,n,xiS-x1,x

19、2,xi-1,i=1,2,n。n=3时的排列树如图5-17所示:算法设计模式void Backtrack (int t) if (tn) output(x); else for (int i=t;i=n;i+) swap(xt, xi); if (constraint(t)&bound(t) Backtrack(t+1); swap(xt, xi); 示例1:批处理作业调度问题描述:给定n个作业的集合J1,J2,Jn。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完

20、成处理的时间和称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。jit符号意义tji: 作业i在j机器上的处理时间Fji:作业i在j机器上处理完成的时间f=F2i:作业调度的完成时间和目标:要求找出使得f最小的调度方案tji机器机器1 1机器机器2 2J J1 12 21 1J J2 23 31 1J J3 32 23 3n=3的实例如下:调度1,2,3F11=2 F21=3F12=5 F22=5+1=6F13=7 F23=7+3=10f=F21+F22+F23=19调度1,3,2F11=2 F21=3F12=4 F22=4+3

21、=7F13=7 F23=7+1=8f=F21+F22+F23=18定义问题的解空间解的形式(x1,x2,xn)xi取值范围令S=1,2,n,则xiS-x1,x2,xi-1解空间的组织结构排列树,深度为问题的规模搜索解空间约束条件()限界条件:当前部分排列的作业在机器2上的完成时间和f当前找到的最排列所需要的完成时间和bestf搜索过程(以上述实例为例)从根结点A开始,结点A成为活结点,并且是当前的扩展结点。扩展结点A沿着x1=1的分支扩展,F11=2,F21=3,故cf=3,bestf=+,cfbestf,限界条件满足。扩展结点B沿着x2=2的分支扩展,F12=5,F22=6,故cf=F21+

22、F22=9,bestf=+,cfbestf,限界条件满足。扩展结点E沿着x3=3的分支扩展,F13=7,F23=10,故cf=F21+F22+F23=19,bestf=+,cfbestf,限界条件满足,扩展生成的结点K是叶子结点。此时,找到当前最优的一种调度方案(1,2,3),同时修改bestf=19叶子结点K不具备扩展能力,开始回溯到活结点E。结点E只有一个分支,且已搜索完毕,因此结点E成为死结点,继续回溯到活结点B。扩展结点B沿着x2=3的分支扩展,cf=10,bestf=19,cfbestf,限界条件满足。扩展结点F沿着x3=2的分支扩展,cf=18,bestf=19,cfbestf,限

23、界条件满足,扩展生成的结点L是叶子结点。此时,找到比先前更优的一种调度方案(1,3,2),修改bestf=18。从叶子结点L开始回溯到活结点F。结点F的一个分支已搜索完毕,结点F成为死结点,回溯到活结点B。结点B的两个分支已搜索完毕,回溯到活结点A。扩展结点A沿着x1=2的分支扩展 , c f = 4 , b e s t f = 1 8 ,cfbestf,限界条件满足。扩展结点C沿着x2=1的分支扩展,cf=10,bestf=18,cfbestf,限界条件不满足,扩展生成的结点被剪掉 结点G的一个分支搜索完毕,结点G成为死结点,回溯到活结点C。 扩展结点C沿着x2=3的分支扩展,cf=12,b

24、estf=18,cfbestf,限界条件不满足,扩展生成的结点被剪掉。结点H的一个分支搜索完毕,开始回溯到活结点C。此时,结点C的两个分支已搜索完毕,继续回溯到活结点A扩展结点A沿着x1=3的分支扩展 , c f = 5 , b e s t f = 1 8 ,cfbestf,限界条件满足 扩展结点D沿着x2=1的分支扩展,cf=11,bestf=18,cfbestf,限界条件不满足,扩展生成的结点被剪掉,开始回溯到活结点D。扩展结点D沿着x2=2的分支扩展,cf=11,bestf=18,cfbestf,限界条件不满足,扩展生成的结点被剪掉,开始回溯到活结点D,结点D的两个分支搜索完毕,继续回溯

25、到活结点A。活结点A的三个分支也已搜索完毕,结点A变成死结点,搜索结束。至此,找到的最优的调度方案为从根结点A到叶子结点L的路径(1, 3, 2) 关键代码分析Backtrack(int i) if (i n) for (int j = 1; j = n; j+) bestxj = xj; bestf = f; else for (int j = i; j f1)?f2i-1:f1)+Mxj2; f+=f2i; if (f bestf) Swap(xi, xj); Backtrack(i+1); Swap(xi, xj); f1- =Mxj1; f- =f2i; 作业本身要在机器1上完成,另外

26、前一个作业在机器2上也要完成,机器2有空闲才能利用算法分析计算限界函数需要O(1)时间,需要判断限界函数的结点在最坏情况下有1+n+n(n-1)+ n(n-1)(n-2)+n(n-1)+2nn!个 ,故耗时O(nn!);在叶子结点处记录当前最优解需要耗时O(n),在最坏情况下会搜索到每一个叶子结点,叶子结点有n!个,故耗时为O(nn!)。批处理作业调度问题的回溯算法所需的计算时间为O(nn!)+O(nn!)= O(nn!)=O(n+1)!)。示例示例2:旅行售货员问题:旅行售货员问题问题描述问题描述设有设有n个城市组成的交通图,一个售货员从住地个城市组成的交通图,一个售货员从住地城市出发,到其

27、它城市各一次去推销货物,最后城市出发,到其它城市各一次去推销货物,最后回到住地城市。假定任意两个城市回到住地城市。假定任意两个城市i,j之间的距之间的距离离dij(dij=dji)是已知的,问应该怎样选择一条最短是已知的,问应该怎样选择一条最短的路线?的路线?定义问题的解空间定义问题的解空间解的形式(解的形式(x1,x2,xn) 令令n个城市组成的集合为个城市组成的集合为S=1,2,n ,则,则x1=1,xiS-x1,x2, ,xi-1,i=2, ,n。确定解空间的组织结构确定解空间的组织结构n=4的旅行售货员问题的解空间树的旅行售货员问题的解空间树 搜索解空间搜索解空间 设置约束条件;设置约

28、束条件;用二维数组用二维数组c存储无向带权图的邻接矩阵,如果存储无向带权图的邻接矩阵,如果cij表示城市表示城市i和城市和城市j有边相连,能走通。有边相连,能走通。设置限界条件设置限界条件clbestl,cl的初始值为的初始值为0,bestf的初始值为的初始值为。 cl:当前已走过的城市所用的路径长度:当前已走过的城市所用的路径长度bestl:表示当前找到的最短路径的路径长度:表示当前找到的最短路径的路径长度搜索过程:以右图为例说明搜索过程:以右图为例说明搜索树搜索树算法描述Backtrack(int i) if (i = n) if (axn-1xn != NoEdge & axn1

29、 != NoEdge & (cc + axn-1xn + axn1 bestc | bestc = NoEdge) for (int j = 1; j = n; j+) bestxj = xj; bestc = cc + axn-1xn + axn1; else for (int j = i; j = n; j+)/ 是否可进入xj子树? if (axi-1xj != NoEdge & (cc + axi-1xi bestc | bestc = NoEdge) / 搜索子树 Swap(xi, xj); cc += axi-1xi; Backtrack(i+1); cc -= a

30、xi-1xi; Swap(xi, xj); 算法分析判断限界函数需要O(1)时间,在最坏情况下有1+(n-1)+ (n-1)(n-2)+(n-1)+2n(n-1)!个结点需要判断限界函数,故耗时O(n!);在叶子结点处记录当前最优解需要耗时O(n),在最坏情况下会搜索到每一个叶子结点,叶子结点有(n-1)!个,故耗时为O(n!)。旅行售货员问题的回溯算法所需的计算时间为O(n!)+O(n!)= O(n!)。87电路板排列问题 n 块电路板 B=b1,b2,bn m 个网组集合 L=N1,N2,Nm Ni是 B 的子集,子集中的元素需要连接起来。目标:找到一种电路板的排列方式,使机箱中任意一对相

31、邻插槽间所连电线数目最小。例: n=8,m=5B=b1,b2,b3,b4,b5,b6,b7,b8L=N1,N2,N3,N4,N5N1 =b4,b5,b6 N2 =b2,b3N3 =b1,b3N4 =b3,b6 N5 =b7,b81 2 3 4 5 6 7 8b2 b1 b3 b4 b5 b6 b7 b888算法设计解空间:排列树解向量:x1,x2,xn 可行性约束函数:在当前部分排列之后加入一块未排定的电路板。 下界函数:dbestd static int n,m; /电路板数,连接块数static int x; /当前解static int bestx; /当前最优解static int t

32、otal; / totalj为连接块j的电路板数static int now; / now j为当前解中所含连接块j的 /电路板数static int bestd; /当前最优密度static int b; /bij表示电路板i在连接块j中static void backtrack(int i,int dd) if (i=n) for (int j=1;j=n ;j+ ) bestxj=xj; bestd=dd; else for (int j=i;j=n ;j+ ) int d=0; for (int k=1;k0&totalk!=nowk) d+; if(ddd)d=dd; if

33、(dbestd) MyMath.swap(x,i,j); backtrack(i+1,d); MyMath.swap(x,i,j); for (int k=1;k=m ;k+ ) nowk-=bxjk; static int arrange(int bb,int mm, int xx) n=bb.length-1;m=mm;x=new intn+1;bestx=new intn+1;bestx=xx;total=new intm+1;now=new intm+1;bestd=m+1;b=bb;for (int i=1;i=n ;i+ ) xi=i; for (int j=1;jn) outpu

34、t(x); else for (int i=1;in) sum+; for (int i=1; i=n; i+) cout xi ; cout endl; else for (int i=1;i=m;i+) xt=i; if (Ok(t) Backtrack(t+1); Ok(int k)/ 检查颜色可用性 for (int j=1;j=n;j+) if (akj=1)&(xj=xk) return false; return true;算法分析计算限界函数需要O(n)时间,需要判断限界函数的结点在最坏情况下有1+m+m2+ m3+mn-1=(mn-1)/(m-1)个,故耗时O(nmn);在叶子结点处输出着色方案需要耗时O(n),在最坏情况下会搜索到每一个叶子结点,叶子结点有mn个,故耗时为O(nmn)。图的m着色问题的回溯算法所需的计算时间为O(nmn)+O(nmn)= O(nmn)。示例2:最小重量机器设计问题 问题描述设某一机器由n个部件组成,每一个部件可以从m个不同的供应商处购得。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。试设计一个算法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论