收藏 分享(赏)

算法设计与分析-回溯.ppt

上传人:dreamzhangning 文档编号:3351059 上传时间:2018-10-17 格式:PPT 页数:100 大小:3.14MB
下载 相关 举报
算法设计与分析-回溯.ppt_第1页
第1页 / 共100页
算法设计与分析-回溯.ppt_第2页
第2页 / 共100页
算法设计与分析-回溯.ppt_第3页
第3页 / 共100页
算法设计与分析-回溯.ppt_第4页
第4页 / 共100页
算法设计与分析-回溯.ppt_第5页
第5页 / 共100页
点击查看更多>>
资源描述

1、1,第5章 回溯法,2,学习要点 理解回溯法的深度优先搜索策略。 掌握用回溯法解题的算法框架 (1)递归回溯 (2)迭代回溯 (3)子集树算法框架 (4)排列树算法框架,3,通过应用范例学习回溯法的设计策略。 (1)装载问题; (2)批处理作业调度; (3)符号三角形问题 (4)n后问题; (5)0-1背包问题; (6)最大团问题; (7)图的m着色问题 (8)旅行售货员问题 (9)圆排列问题 (10)电路板排列问题 (11)连续邮资问题,4,第五章. 回溯法 (Back traiking),1、穷举法应用:有限离散问题总可以用穷举法求得问题的全部,0-1背包问题(0-1Knapsack Pr

2、oblem ) 设有n个物体和一个背包,物体i的重量为wi价值为pi背包的载荷为M, 若将物体i(1 i n,)装入背包,则有价值为pi . 目标是找到一个方案,使得能放入背包的物体总价值最高,例 题,若取W= (16,15, 15), P= (40,25, 25), C=30 穷举法求解相当于分别计算每个可能解,再求优解,例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1),时间复杂性: O(2n),5,2、穷举法改进对于

3、某些组合难题的较大实例,我们可以用穷举法求解,但穷举法的规模较大,所以我们对它进行改进,提出了回溯法和分支界限法两种算法设计技术。它们每次只构造候选解的一个分量,然后评估这个部分构造解:如果加上剩下的分量也不可能求得一个解,就绝不会生成剩下的分量。他们是以构造一棵解空间树为基础的,树的节点反映了对一个部分解做出的特定选择,如果可以保证,节点子孙所对应的选择不可能得出问题的一个解,两种技术都会立即停止处理这个节点。两种技术的区别在于他们能处理的问题类型不同,分支界限法只能应用于最优问题,而回溯法可以搜索任何问题的所有解和任一解。,6,5.1 回溯法基本思想,穷举法技术建议我们先生成所有的候选解,

4、然后找出那个具有需要特性的元素1、回溯法主要思想是每次只构造解的一个分量,然后按照鲜明的方法来评估这个部分构造解。如果一个部分构造解可以进一步构造而不会违反问题的约束,我们就接受对下一个分量所作的第一个合法选择。如果无法对下一个分量进行合法的选择,就不对剩下的任何分量再做任何选择了。在这种情况下,该算法进行回溯,把部分构造解的最后一个分量替换为它的下一个选择。2、解空间树:通过对所做的选择结构构造一棵解空间树,树根代表了在查找解之前的初始状态。树的第一层节点代表对解的第一个分量所做的选择,第二层节点代表了对解的第二个分量所做的选择,以此类推。如果一个部分构造解(子树)仍然有可能导致一个完整解,

5、我们说这个部分解在树中的相应节点是有希望的。否则说是没希望的。叶子要么代表没希望的,要么代表算法找到完整解,7,生成问题状态的基本方法,扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点 死结点:一个所有儿子已经产生的结点称做死结点 深度优先的问题状态生成法:如果对一个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在) 宽度优先的问题状态生成法:在一个扩展结点变成死结点之前,它一直是扩展结点 回溯法:为了避免生成那些不可能产

6、生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法,8,若取W= (16,15, 15), P= (40,25, 25), C=30,例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1),0-1背包问题解空间树,可表示为一棵3层的完全正则二叉树,时间复杂性: O(2n),求解过程相当于在树中搜索 满

7、足条件的叶结点.,9,3、搜索策略回溯法在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一节点时,先判断该节点是否包含问题的解。如果肯定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯否则,进入该子树,继续按深度优先策略搜索。回溯法求问题的所有解时,要回溯到根,且根节点的所有子树都已被搜索遍才结束。回溯法求解问题的一个解时,只要搜索到问题的一个解就可以结束。这种以深度优先方式系统搜索问题解的算法称为回溯法。,10,回溯法举例:若取W= (16,15, 15), P= (40,25, 25), C=30,11,回溯法举例: 旅行商问题 在这个问题

8、中,给出一个n 顶点网络(有向或无向),要求找出一个包含所有n 个顶点的具有最小耗费的环路。任何一个包含网络中所有n 个顶点的环路被称作一个旅行(t o u r)。在旅行商问题中,要设法找到一条最小耗费的旅行。 分析图给出了一个四顶点网络。在这个网络中,一些旅行如下: 1 , 2 , 4 , 3 , 1;1 , 3 , 2 , 4 , 1和1 , 4 , 3 , 2 , 1。旅行1 , 2 , 4 , 3 , 1的耗费为6 6;而1 , 3 , 2 , 4 , 1的耗费为2 5;1 , 4 , 3 , 2 , 1为5 9。故1 , 3 , 2 , 4 , 1是该网络中最小耗费的旅行。,12,旅

9、行是包含所有顶点的一个循环,故可以把任意一个点作为起点(因此也是终点)。针对该问题,任意选取点1作为起点和终点,则每一个旅行可用顶点序列1, v2 , vn , 1来描述,v2, , vn 是(2, 3, , n) 的一个排列。可能的旅行可用一个树来描述,其中每一个从根到叶的路径定义了一个旅行。下图给出了一棵表示四顶点网络的树。从根到叶的路径中各边的标号定义了一个旅行(还要附加1作为终点)。例如,到节点L的路径表示了旅行1 , 2 , 3 , 4 , 1,而到节点O的路径表示了旅行1 , 3 , 4 , 2 , 1。网络中的每一个旅行都由树中的一条从根到叶的确定路径来表示。因此,树中叶的数目为

10、(n- 1 )!。,13,回溯算法将用深度优先方式从根节点开始,通过搜索解空间树发现一个最小耗费的旅行。对题中网络,利用前页的解空间树,一个可能的搜索为A B C F L。在L点,旅行1 , 2 , 3 , 4 , 1作为当前最好的旅行被记录下来。它的耗费是5 9。从L点回溯到活节点F。由于F没有未被检查的孩子,所以它成为死节点,回溯到C点。C变为E-节点,向前移动到G,然后是M。这样构造出了旅行1 , 2 , 4 , 3 , 1,它的耗费是6 6。既然它不比当前的最佳旅行好,抛弃它并回溯到G,然后是C , B。从B点,搜索向前移动到D,然后是H , N。这个旅行1 , 3 , 2 , 4 ,

11、 1的耗费是2 5,比当前的最佳旅行好,把它作为当前的最好旅行。,14,从N点,搜索回溯到H,然后是D。在D点,再次向前移动,到达O点。如此继续下去,可搜索完整个树,得出1 , 3 , 2 , 4 , 1是最少耗费的旅行。,15,八皇后问题,八皇后问题是十九世纪著名的数学家高斯于1850年提出的。问题是:在88的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。,16,设第1个皇后放在第一行的x1位置,第i个皇后放在第i行的xi位置,则八皇后问题的一个解可以表示为一个向量(x1,x2,.,x8);其解空间由88个八元组构成(每个xi都有八种取值,即第i个

12、皇后放在第1,2,3,,8列上都有可能,共有8个皇后,因此解空间由88个八元组构成) 但其隐约束是对任何1j,xixj且没有两个皇后在同一条斜线上,因此一切解(x1,x2,.x8)只能是(1,2,.,8)的一个排列;所有可能的向量(可能解)有8!个可以把八皇后问题扩展到n皇后问题,即在nn的棋盘上摆放n个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上。,17,例如,八皇后问题的一个解为:可由八元组(4,6,8,2,7,1,3,5)来表示。,18,显然,棋盘的每一行上可以而且必须摆放一个皇后,所以,n皇后问题的可能解用一个n元向量X=(x1,x2, ,xn)表示,其中,1in并且1xi

13、n,即第i个皇后放在第i行第xi列上。由于两个皇后不能位于同一列上,所以,解向量X必须满足约束条件 xixj (式1),19,若两个皇后摆放的位置分别是(i, xi)和(j, xj),在棋盘上斜率为-1的斜线上,元素的两个下标值的差(行-列)相等,即满足条件i-xi = j- xj , (1) 在棋盘上斜率为1的斜线上,元素的两个下标值的和(行+列)相等,满足条件 i xi = j xj , (2) (1)和 (2)等价于 i-j=xi-xj i-j=xj-xi,20,综合两种情况,由于两个皇后不能位于同一斜线上,所以,解向量X必须满足约束条件: |ixi|jxj| (式2),21,为了简化问

14、题,下面讨论四皇后问题。 四皇后问题的解空间树是一个完全4叉树,树的根结点表示搜索的初始状态,从根结点到第2层结点对应皇后1在棋盘中第1行的可能摆放位置,从第2层结点到第3层结点对应皇后2在棋盘中第2行的可能摆放位置,依此类推。回溯法求解4皇后问题的搜索过程,22,23,解空间树 树中的每一个结点确定所求解问题的一个问题状态(problem states)。由根结点到其它结 点的所有路径则确定了这个问题的状态空间 (state space)。解状态(solution states)是 这样一些问题状态S,对于这些问题状态,由 根到S的那条路径确定了这解空间中的一个元 组。答案状态(answer

15、 states)是这样的一些 解状态S,对于这些解状态而言,由根到S的这 条路径确定了这问题的一个解(即,它满足隐 式约束条件)。解空间的树结构称为状态空间 树(state space tree)。,24,四皇后问题的解空间树 四皇后问题的状态空间树上共有24个叶节点(4!),就是问题的所有可能解, 树的内部结点代表问题的部分解;例如 36为部分解(x1,x2,x3)=(3,1,2) 结点的编号是按DFS(Deep First Search) 方式排列的,其实也就是按回溯方式遍历搜索的次序,25,四皇后问题的回溯算法的搜索过程图示 从结点1到结点2,满足 条件,放置皇后x1=1,继续搜索,26

16、,结点3不满足条件,回溯 到结点2;再向下搜索到 结点8;满足条件,放置 皇后x2=3,继续搜索,27,结点9不满足条件,回溯 到结点11,仍不满足条 件;这时经结点8,回溯 到结点2,28,感性认识(8),向下搜索到结点13,满足条件,放置第二个皇后x2=4; 继续向下搜索到结点14满足条件,放置第三个皇后x3=2;,29,向前搜索到结点15,不 满足条件(只测试x4=3 的情形),回溯搜索到 结点16,仍不满足条件,30,回溯到结点1后,向下搜索到结点18,x1=2,31,结点19不满足条件, 回溯到结点24后,也不满足条件;回溯到结点29之后满足条件,x2=4,32,结点30满足条件,

17、x3=1;再向前搜索到结 点31,满足条件, x4=3;此时,i=4,找到 解,33,搜索代价分析 时间代价 空间树共有65个结点,24个叶节点,但在搜索过程中, 只遍历了16个结点,其中2个叶节点能满足题目要求如果要找所有解的话,则要继续遍历下去直到搜索到结点65(但是,遍历的总结点数肯定大大小于65) 空间代价与树的高度有关,而不是和树的总结点树有关回溯算法中,并不需要真正创建一个解空间树,34,原理描述(1), 回溯法步骤 确定问题的可能解空间 相当于找出进行穷举的搜索范围 以某种便于搜索的方式组织所有可能解, 一般是形成可能解空间树 以某种方式搜索解深度优先(Deep First Se

18、arching,DFS):这就是回溯技术 广度优先(Breadth First Searching,BFS):这就是分支限界技术 在搜索过程中使用判定函数(也称代价函数或限界函数),通过“剪枝”来加速搜索过程(回溯技巧),35,36,思考题:1后的解有多少个?解分别是什么? 2后的解有多少个?解分别是什么?3后的解有多少个?解分别是什么? 4后的解有多少个?解分别是什么? 6后的解有多少个?解分别是什么?,37,1后的解有1个,解是x1=1; 2后的解有0个 3后的解有0个 4后的解有2个,解分别是:(2,4,1,3);(3,1,4,2) 6后的解有4个,解分别是: (2,4,6,1,3,5)

19、;(3,6,2,5,1,4);(4,1,5,2,6,3); (5,3,1,6,4,2);,38,回溯法的基本思想,(1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。,常用剪枝函数: 用约束函数在扩展结点处剪去不满足约束的子树; 用限界函数剪去得不到最优解的子树。,用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n)。而显式地存储整个解空间则需要

20、O(2h(n)或O(h(n)!)内存空间。,39,递归回溯,回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法实现回溯法。,void backtrack (int t) if (tn) output(x);elsefor (int i=f(n,t);i=g(n,t);i+) xt=h(i);if (constraint(t) ,40,迭代回溯,采用树的非递归深度优先遍历算法,可将回溯法表示为一个非递归迭代过程。,void iterativeBacktrack () int t=1;while (t0) if (f(n,t)=g(n,t) for (int i=f(n,t);i=g(n,

21、t);i+) xt=h(i);if (constraint(t) ,41,子集树与排列树,遍历子集树需O(2n)计算时间,遍历排列树需要O(n!)计算时间,void backtrack (int t) if (tn) output(x);elsefor (int i=0;i=1;i+) xt=i;if (legal(t) backtrack(t+1); ,void backtrack (int t) if (tn) output(x);elsefor (int i=t;i=n;i+) swap(xt, xi);if (legal(t) backtrack(t+1);swap(xt, xi);

22、,42,n后问题,在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。,43,解向量:(x1, x2, , xn) 显约束:xi=1,2, ,n 隐约束:1)不同列:xixj2)不处于同一正、反对角线:|i-j|xi-xj|,n后问题,Int Place(int k) int j for j =1;jn) sum+;elsefor (int i=1;i=n;i+) xt=i;if (Place(t) Backtrack(t+1);,44,n

23、后排列树算法框架,#define N 8 int bestN+1,xN+1=0,1,2,3,4,5,6,7,8,num; int constrain(int t)/*约束函数,因为排列树已使得不同皇后在不同行 列,因此只要满足不在同一斜线即可*/ int i; for (i=1;it;i+) if (abs(xi-xt)=abs(i-t) return 0; return 1; ,45,void nqueen(int t) int i,temp; if (tN)num+;for (i=1;i=N;i+) printf(“%d “,xi);printf(“n“); else for (i=t;i

24、=N;i+)temp=xi;xi=xt;xt=temp;if (constrain(t)nqueen(t+1);temp=xi;xi=xt;xt=temp; ,46,void main() nqueen(1); printf(“%d“,num); ,47,n后子集树算法框架,#include #define N 8 int xN+1,num; int constrain(int t) int i; for (i=1;it;i+) if (xi=xt|abs(xi-xt)=abs(i-t) return 0; return 1; ,48,void nqueen(int t) int i; if

25、(tN) for (i=1;i=N;i+)printf(“%d “,xi);printf(“n“);num+;elsefor (i=1;i=N;i+)xt=i;if (constrain(t)nqueen(t+1); ,49,vvoid main() nqueen(1);printf(“%d“,num); ,50,n后迭代回溯算法框架,#define N 8 int xN+1,num; int constrain(int t) int i; for (i=1;it;i+) if (xi=xt|abs(xi-xt)=abs(i-t) return 0; return 1; ,51,void di

26、edainqueen() int t=1,i; while (t0)xt=xt+1;/*第t后是从上次位置的下一位置开始搜索,上次位置即xt*/i=xt; for (;i=N;i+)xt=i;if (constrain(t)if (t=N) num+;else t+;i=0; /*i=0,必不可少,因为每个新后搜索都是从第1个位置开始搜*/t-; /*如果第t后的所有位置都已搜索完,则说明第t后没有合适位置存放,因此返回到安排第t-1后即xt*/,52,void main() diedainqueen();printf(“%d“,num); ,53,0-1背包问题,解空间:子集树 可行性约束函

27、数: 上界函数:,int beibao(int w,int v,int t,int c,int current) int i;if (tN) if (currentbest) best=current;return ;else for (i=1;i=0;i-)xt=i;current+=xt*vt;c=c-xt*wt;if (c=0) beibao(w,v,t+1,c,current);current-=xt*vt;c+=xt*wt; ,54,int beibao(int w,int v,int t,int c,int current) /*c 为当前背包即递归层次为t时的剩余容量, curr

28、ent当前背包即递归层次为t时的物品总价值*/ int i;if (tN) if (currentbest) best=current;return ; /*已搜索至叶结点,如果该次搜索的背包价值大于最优背包价值,则更新最优背包价值为刚刚搜索到的背包价值*/else for (i=1;i=0;i-)xt=i;if (c-xt*wt)=0) /*对第t物品处理,它有两种情况,装入或不装入,如果背包能装下第t号物品则肯定背包的剩余容量再减去第t号物品必须大于等于0(不装入该式无影响)*/current+=xt*vt; c=c-xt*wt;if (c=0) beibao(w,v,t+1,c,curr

29、ent); /*如果背包还有剩余空间可继续往下递归*/current-=xt*vt; /*对第t物品处理完后,要把背包还原到原始状态, 这步很重要*/c+=xt*wt; ,55,int best=0,xN+1; int beibao(int w,int v,int t,int c,int current) int i;if (tN) if (currentbest) best=current;return ;else for (i=0;i=0)current+=xt*vt;c=c-xt*wt;if (c=0) beibao(w,v,t+1,c,current);/*current-=xt*vt

30、;c+=xt*wt;*/ ,56,0-1背包的递归回溯算法框架,57,#include #define N 3 int c=30,best,value,xN+1,wN+1=0,16,15,15,vN+1=0,40,25,25; void beibao01(int t) int i; if (tN) if (valuebest) best=value;elsefor (i=0;i=0) /*一定是=*/c=c-xt*wt;value+=xt*vt;beibao01(t+1);/*还原状态*/value-=xt*vt;c+=xt*wt; ,58,void main() beibao01(1);pr

31、intf(“%d“,best); ,59,旅行售货员问题,解空间:排列树,复杂度分析 算法backtrack在最坏情况下可能需要更新当前最优解O(n-1)!)次,每次更新bestx需计算时间O(n),从而整个算法的计算时间复杂性为O(n!)。,60,61,排列树算法框架,#include #define N 4 #define Max 1000 int best=Max,current,cN+1N+1=,0,Max,30,6,4,0,30,Max,5,10,0,6,5,Max,20,0,4,10,20,Max,xN+1=0,1,2,3,4,bestxN+1;,62,void tsp(int t

32、) int i,temp; if (tN)if (current+cxt-11best) best=current+cxt-11;for (i=1;i=N;i+) bestxi=xi; else,63,for (i=t;i=N;i+)temp=xi;xi=xt;xt=temp;current+=cxt-1xt;if (currentbest)tsp(t+1);current-=cxt-1xt;temp=xi;xi=xt;xt=temp; ,64,void main() int i; tsp(2); printf(“最优旅费:%d“,best); printf(“最优路径:“); for (i=

33、1;i=N;i+)printf(“%d-“,bestxi); ,65,66,int xN+1,minbest=INF,bestN+1; void tsp(int t,int cN+1,int current) int temp,I,j; if (tN) if (cxt-11!=INF /全部城市都已遍历,即递归深度达到叶子结点,其深度为N,叶子结点再往深度搜索则tN,递归结束 else,67,for (i=t;i=N;i+)if (cxt-1xi!=INF)temp=xi;xi=xt;xt=temp;current+=cxt-1xt;if (currentminbest) tsp(t+1,c,

34、current);current-=cxt-1xt;temp=xi;xi=xt;xt=temp; ,68,main() int i,cN+1N+1=0,0,0,0,0,1,INF,30,6,4,1,30,INF,5,10,1,6,5,INF,20,1,4,10,20,INF; /0存储单元浪费,第0行第0列不用for (i=1;i=N;i+)xi=i;tsp(2,c,0);/对2,3,4顶点进行全排列printf(“%4d“,minbest); ,69,70,图的m着色问题,给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶

35、点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。,71,由于用m种颜色为无向图G=(V, E)着色,其中,V的顶点个数为n,可以用一个n元组C=(c1, c2, , cn)来描述图的一种可能着色,其中,ci1, 2, , m (1in)表示赋予顶点i的颜色。 例如,5元组(1, 2, 2, 3, 1)表示对具有5个顶点的无向图的一种着色,顶点1着颜色1,顶点2着颜色2,顶点3着颜色2,如此等等。 如果在n元组C中,所有相邻顶点都不会着相同颜色,就称此n元组为

36、可行解,否则为无效解。,72,回溯法求解图着色问题,首先把所有顶点的颜色初始化为0,然后依次为每个顶点着色。在图着色问题的解空间树中,如果从根结点到当前结点对应一个部分解,也就是所有的颜色指派都没有冲突,则在当前结点处选择第一棵子树继续搜索,也就是为下一个顶点着颜色1,否则,对当前子树的兄弟子树继续搜索,也就是为当前顶点着下一个颜色,如果所有m种颜色都已尝试过并且都发生冲突,则回溯到当前结点的父结点处,上一个顶点的颜色被改变,依此类推。,73,解向量:(x1, x2, , xn)表示顶点i所着颜色xi 可行性约束函数:顶点i与已着色的相邻顶点颜色不重复。,图的m着色问题,void mzhaos

37、e(int t,int cN+1) int temp,i,j; if (tN) for (j=1;j=N;j+)printf(“%4d“,xj);printf(“n“);sum+;elsefor (i=1;i=M;i+)xt=i;if (ok(t,c) mzhaose(t+1,c); int ok(int t,int cN+1) int j;for (j=1;j=Nj+)if (ctj ,复杂度分析 图m可着色问题的解空间树中内结点个数是 对于每一个内结点,在最坏情况下,用ok检查当前扩展结点的每一个儿子所相应的颜色可用性需耗时O(mn)。因此,回溯法总的时间耗费是,74,6.4 批处理作业调

38、度问题 给定n个作业的集合J1,J2,Jn。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。,75,批处理作业调度问题的一个常见例子是在计算机系统中完成一批n个作业,每个作业都要完成先计算,然后将计算机结果打印输出这两项任务。计算任务由计算机的中央处理器完成,打印输出任务由打印机完成。因此在这种情况下,计算机的中央处理器是机器1,打印机是机器2。

39、,76,显然,批处理作业的一个最优调度应使机器1没有空闲时间,且机器2的空闲时间最小。 可以证明,存在一个最优作业调度使得在机器1和机器2上作业以相同次序完成。,77,例:三个作业1, 2, 3,这三个作业在机器1上所需的处理时间为(2, 3, 2),在机器2上所需的处理时间为(1, 1, 3),则最佳调度方案是(1, 3, 2) ,其完成时间和为18。,78,(a)作业1在机器1上完成的时间为2,在机器2上完成的时间为3 作业2在机器1上完成的时间为5,在机器2上完成的时间为6 作业3在机器1上完成的时间为7,在机器2上完成的时间为10 3+6+10=19,所以是19 (b)作业1在机器1上

40、完成的时间为2, 在机器2上完成的时间为3 作业3在机器1上完成的时间为4,在机器2上完成的时间为7 作业2在机器1上完成的时间为7,在机器2上完成的时间为8 3+7+8=18,所以时间和为18,79,80,81,算法设计,对于批处理作业调度问题,由于我们要从n个作业的所有排列中找出有最小完成时间和的作业调度,所以批处理作业调度问题的解空间树是一棵排列树。 按照回溯法搜索排列树的算法框架,设开始时x=1,2,n是所给的n个作业,则相应的排列树由x1:n的所有排列构成。,82,#define N 3 int xN+1=0,1,2,3,xbestN+1,best=1000,JN+12=0,0,2,

41、1,3,1,2,3; void pichuli(int t,int c1,int c2)int i,temp;if (tN) if (c2best) best=c2;for (i=1;i=N;i+)xbesti=xi;return ;,83,else for (i=t;i=N;i+)temp=xt;xt=xi;xi=temp;c1+=Jxt0;c2+=c1+Jxt1;,84,if (c2best) pichuli(t+1,c1,c2);c2-=c1+Jxt1;c1-=Jxt0;temp=xt;xt=xi;xi=temp; ,85,批处理作业算法框架,/*回溯批处理作业*/ #include #

42、include #define N 3 #define MAX 1000 int xN+1=0,1,2,3; int m3N+1=0,0,0,0,0,2,3,2,0,1,1,3; int bestxN+1; int f2N+1; int f1=0,f; int bestf=MAX;,86,void swap(int *a,int *b) int temp=*a;*a=*b;*b=temp; ,87,void Backtrace(int t) int i;if(tN)if (fbestf) bestf=f;for( i=1;i=N;i+)bestxi=xi;else,88,for( i=t;if

43、1?f2t-1:f1)+m2xt;f+=f2t;if(fbestf)Backtrace(t+1); f1-=m1xt; f-=f2t; swap( ,89,int main() int i;Backtrace(1);printf(“该作业调度的最优完成时间和为:%dn调度顺序为:n“,bestf);for( i=1;i=N;i+)printf(“%d “,bestxi); printf(“n“);return 0; ,90,91,最大团问题,给定无向图G=(V,E)。如果UV,且对任意u,vU有(u,v)E,则称U是G的完全子图。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G

44、的最大团是指G中所含顶点数最多的团。 如果UV且对任意u,vU有(u,v)E,则称U是G的空子图。G的空子图U是G的独立集当且仅当U不包含在G的更大的空子图中。G的最大独立集是G中所含顶点数最多的独立集。 对于任一无向图G=(V,E)其补图G=(V1,E1)定义为:V1=V,且(u,v)E1当且仅当(u,v)E。,U是G的最大团当且仅当U是G的最大独立集。,92,最大团问题,解空间:子集树 可行性约束函数:顶点i到已选入的顶点集中每一个顶点都有边相连。 上界函数:有足够多的可选择顶点使得算法有可能在右子树中找到更大的团。,void Clique:Backtrack(int i) / 计算最大团

45、if (i n) / 到达叶结点for (int j = 1; j bestn) / 进入右子树xi = 0;Backtrack(i+1); ,复杂度分析 最大团问题的回溯算法backtrack所需的计算时间显然为O(n2n)。,93,进一步改进,选择合适的搜索顺序,可以使得上界函数更有效的发挥作用。例如在搜索之前可以将顶点按度从小到大排序。这在某种意义上相当于给回溯法加入了启发性。 定义Si=vi,vi+1,.,vn,依次求出Sn,Sn-1,.,S1的解。从而得到一个更精确的上界函数,若cn+Si=max则剪枝。同时注意到:从Si+1到Si,如果找到一个更大的团,那么vi必然属于找到的团,此

46、时有Si=Si+1+1,否则Si=Si+1。因此只要max的值被更新过,就可以确定已经找到最大值,不必再往下搜索了。,94,圆排列问题,给定n个大小不等的圆c1,c2,cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3个圆的半径分别为1,1,2时,这3个圆的最小长度的圆排列如图所示。其最小长度为,95,圆排列问题,float Circle:Center(int t) / 计算当前所选择圆的圆心横坐标float temp=0;for (int j=1;jtemp) temp=valuex;ret

47、urn temp; ,void Circle:Compute(void) / 计算当前圆排列的长度float low=0,high=0;for (int i=1;ihigh) high=xi+ri;if (high-lowmin) min=high-low; ,void Circle:Backtrack(int t) if (tn) Compute();elsefor (int j = t; j = n; j+) Swap(rt, rj);float centerx=Center(t);if (centerx+rt+r1min) /下界约束xt=centerx;Backtrack(t+1);Swap(rt, rj); ,

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

当前位置:首页 > 高等教育 > 大学课件

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


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

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

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