您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 理解回溯法的深度优先搜索策略
补充2回溯法补充2回溯法z理解回溯法的深度优先搜索策略。解回溯法的深度优先搜索策略z掌握用回溯法解题的算法框架(1)递归回溯(2)迭代回溯(2)迭代回溯(3)子集树算法框架(4)排列树算法框架z通过应用范例学习回溯法的设计策略z通过应用范例学习回溯法的设计策略。1算法导论Sch2-1方法概述z搜索算法介绍Sch2-1方法概述搜索算法介绍(1)穷举搜索(2)盲目搜索—深度优先(DFS)或回溯搜索(Backtracking);—广度优先搜索(BFS);分支限界法(Branch&Bound)—分支限界法(Branch&Bound);—博弈树搜索(α-βSearch)(3)启发式搜索—A*算法和最佳优先(Best-FirstSearch)—迭代加深的A*算法—B*AO*SSS*等算法B,AO,SSS等算法—LocalSearch,GA等算法2算法导论Sch2-1方法概述z搜索空间的三种表示:Sch2-1方法概述搜索空间的三种表示:—表序表示:搜索对象用线性表数据结构表示;—显示图表示:搜索对象在搜索前就用图(树)的数据结构表示;—隐式图表示:除了初始结点,其他结点在搜索过程中动态生成。缘于搜索空间大,难以全部存储。z搜索效率的思考:随机搜索—上世纪70年代中期开始,国外一些学者致力于研究随机搜索求解困难的组合问题,将随机过程引入搜索;—选择规则是随机地从可选结点中取一个从而可以从统计角度分析搜选择规则是随机地从可选结点中取一个,从而可以从统计角度分析搜索的平均性能;—随机搜索的一个成功例子是:判定一个很大的数是不是素数,获得了第个多式时算法3第一个多项式时间的算法。算法导论Sch2-1方法概述z回溯法:Sch2-1方法概述回溯法:—回溯法是一个既带有系统性又带有跳跃性的搜索算法;—它在包含问题的所有解的解空间树中按照深度优先的策略从根结—它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。——系统性—算法搜索至解空间树的任一结点时,判断该结点为根的子树是否包含算法搜索至解空间树的任结点时,判断该结点为根的子树是否包含问题的解,如果肯定不包含,则跳过以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续深度优先的策略进行搜索。——跳跃性—这种以深度优先的方式系统地搜索问题的解得算法称为回溯法,它适用于解一些组合数较大的问题。4算法导论Sch2-1方法概述z问题的解空间Sch2-1方法概述—问题的解向量:回溯法希望一个问题的解能够表示成一个n元式(x1,x2,…,xn)的形式。—显约束:对分量xi的取值限定。—隐约束:为满足问题的解而对不同分量之间施加的约束。—解空间:对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该实例的一个解空间。注意:同一个问题可以有多种表示,有些表示方法更简单,所需表示的状态空间更小(存储量少,搜索方法简单)。5n=3时的0-1背包问题用完全二叉树表示的解空间算法导论Sch2-1方法概述Sch2-1方法概述6算法导论Sch2-1方法概述z基本思想:Sch2-1方法概述—搜索从开始结点(根结点)出发,以深度优先搜索整个解空间。—这个开始结点成为活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为新的活结点,并成索移新这新成新并成为当前扩展结点。—如果在当前的扩展结点处不能再向纵深方向扩展,则当前扩展结点就成为死结点。结点—此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点;直到找到一个解或全部解。7算法导论Sch2-1方法概述z基本步骤:Sch2-1方法概述基本步骤:①针对所给问题,定义问题的解空间;②确定易于搜索的解空间结构;②确定易于搜索的解空间结构;③以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索搜索。常用剪枝函数:①用约束函数在扩展结点处剪去不满足约束的子树;②用限界函数剪去得不到最优解的子树。8算法导论Sch2-1方法概述z二类常见的解空间树:Sch2-1方法概述类常见的解空间树:①子集树:当所给的问题是从n个元素的集合S中找出满足某种性质的子集时相应的解空间树称为子集树子集树通常有2n个叶子结点子集时,相应的解空间树称为子集树。子集树通常有2n个叶子结点,其总结点个数为2n+1-1,遍历子集树时间为Ω(2n)。如0-1背包问题,叶结点数为2n,总结点数2n+1;排列树当所给问题是确定个元素满足某种性质的排列时相应的②排列树:当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。排列树通常有n!个叶子结点,因此,遍历排列树需要Ω(n!)的计算时间。如TSP问题,叶结点数为n!,遍历时间为Ω(n!)。9算法导论Sch2-1方法概述例1[0-1背包]:n=3,w=(16,15,15),v=(45,25,25),c=30Sch2-1方法概述(1)定义解空间:X={(0,0,0),(0,0,1),(0,1,0),…,(1,1,0),(1,1,1)}(2)构造解空间树:10算法导论Sch2-1方法概述Sch2-1方法概述11算法导论Sch2-1方法概述z例2[TSP问题]:Sch2-1方法概述(1)定义解空间:X={12341,12431,13241,13421,14231,14321}(2)构造解空间树:(3)从A出发按DFS搜索整棵树:最优解:13241,14231成本:2512算法导论Sch2-1方法概述z用回溯法解题的一个显著特征是在搜索过程中动态产生问Sch2-1方法概述用回溯法解题的个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))。而显式地存储整个解空间则需要O(2h(n))或O(h()!)内存空间O(h(n)!)内存空间。13算法导论Sch2-2算法框架z回溯法对解空间作深度优先搜索,因此在一般情况下可用递归函数来实现溯法Sch2-2算法框架实现回溯法:z子集树回溯算法Backtrack(intt)//搜索到树的第t层{//由第t层向第t+1层扩展,确定x[t]的值iftnthenoutput(x);//叶子结点是可行解elsewhile(allXt)do//Xt为当前扩展结点的所有可能取值集合{{x[t]=Xt中的第i个值;if(Constraint(t)andBound(t))Backtrack(t+1);();}}14执行时,从Backtrack(1)开始。算法导论Sch2-2算法框架z排列树回溯法Sch2-2算法框架排列树回溯法Backtrack(intt)//搜索到树的第t层{//由第t层向第t+1层扩展,确定x[t]的值iftnthenoutput(x);//叶子结点是可行解elsefori=ttondoforittondo{swap(x[t],x[i]);if(Ctit(t)dBd(t))if(Constraint(t)andBound(t))Backtrack(t+1);swap(x[t],x[i]);}}15算法导论Sch2-3排列生成问题z问题定义:给定正整数n,生成1,2,…,n所有排列。Sch2-3排列生成问题z解空间树(排列树):当n3时当n=3时,16算法导论Sch2-3排列生成问题Sch2-3排列生成问题17算法导论Sch2-4TSP问题z问题描述:略Sch2-4TSP问题z基本思想:利用排列生成问题的回溯算法Backtrack(2),对x[]={1,2…n}的x[2n]进行全排列则(x[1]x[2])(x[2]x[3])…(x[n]2,,n}的x[2..n]进行全排列,则(x[1],x[2]),(x[2],x[3]),,(x[n],x[1])构成一个回路。在全排列算法的基础上,进行路径计算保存以及进行限界剪枝进行限界剪枝。zmain(intn){{a[n][n];x[n]={1,2,…,n};bestx[];cc=0.0;bestv=∞;//bestx保存当前最佳路径,bestv保存当前最优值input(a);//输入邻接矩阵TSPBacktrack(2);output(bestvbestx[]);18output(bestv,bestx[]);}算法导论Sch2-4TSP问题TSPBacktrack(inti){//cc记录(x[1]x[2])(x[i1]x[i])的距离和Sch2-4TSP问题{//cc记录(x[1],x[2]),…,(x[i-1],x[i])的距离和if(in){//搜索到叶结点,输出可行解与当前最优解比较if(cc+a[x[n]][1]bestvorbestv=∞){bestvcc+a[x[n]][1]bestv=cc+a[x[n]][1];for(j=1;j=n;j++)bestx[j]=x[j];}}}else{for(j=i;j=n;j++)if([[i1]][[j]]bb){//界裁剪树if(cc+a[x[i-1]][x[j]]bestvorbestv=∞){//限界裁剪子树swap(x[i],x[j]);cc+=a[x[i-1]][x[i]];TSPBacktrack(i+1);cc-=a[x[i-1]][x[i]];swap(x[i],x[j]);19}}}算法导论Sch2-5n皇后问题z问题描述:Sch2-5n皇后问题在4x4棋盘上放上4个皇后,使皇后彼此不受攻击。不受攻击的条件是彼此不在同行(列)斜线上。求出全部的攻击的条件是彼此不在同行(列)、斜线上。求出全部的放法。解表z解表示:20算法导论Sch2-5n皇后问题Sch2-5n皇后问题21算法导论Sch2-5n皇后问题Sch2-5n皇后问题22算法导论Sch2-5n皇后问题Sch2-5n皇后问题23算法导论Sch2-6符号三角形问题Sch2-6符号三角形问题下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是下图是由4个和4个组成的符号三角形。个同号下面都是“+”,2个异号下面都是“-”。++-+-+++----+-+++--++--+---+在一般情况下符号三角形的第一行有n个符号。符号三角形问题要求在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“”的个数相同24-的个数相同。算法导论Sch2-6符号三角形问题z解向量:用n元组x[1:n]表示符号三角形的第一行,x[i]=1Sch2-6符号三角形问题表示符号三角形的第一行第i个符号为“+”,x[i]=0表示符号三角形的第一行第i个符号为“-”。可行性约束数当前符号角形所包含的“”个数与z可行性约束函数:当前符号三角形所包含的“+”个数与“-”个数均不超过n*(n+1)/4z无解的判断n*(n+1)/2为奇数z无解的判断:n*(n+1)/2为奇数++-+-++++-+-++----+-+++--++-+-----+++-++++-+---+-+-25+算法导论Sch2-6符号三角形问题voidTriangle::Backtrack(intt){Sch2-6符号三角形问题{//是一棵子集树,t控制着第一行符号个数,对应于树的层次if((counthalf)||(t*(t-1)/2-counthalf))return;//剪枝法,剪除不必要的子树if(tn)sum++;//到叶子结点,”+”号数和”-”号数相同的符号三角形个数增加1elsefor(inti=0;i2;i++){//当前扩展结点Z只有两种可能的取值0或1,即只可能有2个孩子p[1][t]=i;//二维数据p记录了符号三角形矩阵p[1][t]i;//二维数据p记录了符号三角形矩阵count+=i;//当前符号三角形矩阵中,”+”号的个数for(intj=2;j=t;j++){//从第二行起计算”+”号个数,计算可行性约束[
本文标题:理解回溯法的深度优先搜索策略
链接地址:https://www.777doc.com/doc-829793 .html