您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > Tsp问题的几种算法的分析
1摘要本文分析比较了tsp问题的动态规划算法,分支界限法,近似等算法。分析了旅行商问题的时间度特点,针对启发式算法求解旅行商问题中存在的一些问题提出了改进算法。此算法将群体分为若干小子集,并用启发式交叉算子,以较好利用父代个体的有效信息,达到快速收敛的效果,实验表明此算法能提高寻优速度,解得质量也有所提高。关键词:旅行商问题TSPAbstractthispaperanalyzedthetimecomplexityoftravelingsalesmanproblem,thenputforwardsomeimprivementtowardsthegeneticalgorithmforsolvingthisproblen:divdingthepopulationintosomesmallparentindividualwell.soitcanquicklygetintoconvergence,theexperimentalresultindicatestheimpwovedalgorithmcanacceleratetheapeedoffindingsolutionandimprovetheprecision.Keywordstravelingsalesmanproblem;geneticalgorithm;subset;henristiccrossoveroperator2目录1、摘要--------------------------------------------------------------12、Abstract---------------------------------------------------------13、Tsp问题的提法------------------------------------------------24、回溯法求Tsp问题--------------------------------------------35、分支限界法求Tsp问题--------------------------------------76、近似算法求解Tsp问题-------------------------------------107、动态规划算法解Tsp问题----------------------------------123引言tsp问题刚提出时,不少人都认为很简单。后来,人们实践中才逐步认识到,这个问题只是叙述简单,易于为人所理解而其计算复杂性却是问题的输入规模的指数函数,属于NP完全问题。Tsp问题的实现思想已被应用到交通,管理等很多领域所以有必要探讨Tsp问题的算法。这里给出Tsp问题的动态规划算法,回溯算法,分支限界法,近似算法,和改进的启发式算法,以及它们之间的分析比较。正文:旅行售货员问题的提法是:某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或旅费)最小。设G=(V,E)是一个带权图。图中各边的费用(权)为正数。图中的一条周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是这条路线上所有边的费用之和。旅行售货员问题要在图G中找到费用最小的周游路线。4图1-1:回溯法:(1)回溯法的基本思想:确定了解空间的组织结构后,回溯法从开始结点(根结点)出发,以深度优先方式搜索整个解空间。这个开始结点成为活结点,同时也成为当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点即成为新的活结点,并为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已无活结点时为止。回溯法搜索解空间树时,通常采用两种则略避免无效搜索,提高回溯法的搜索效率。其一是用约束函数在扩展结点处减去不满足约束的子数;其二是用界限函数剪去得不到最优解的子数。这两类函数统称为剪支函数。(2)回溯法解tsp问题:旅行售货员问题的解空间可以组织成一棵树,从书的根结点到任一叶结点的路径定义了图G的一条周游路线。图5-3是当n=4时解空间树的示例。其中从根结点A到叶结点L的路径上边的标号组成一条周游路23415线1,2,3,4,1。而从根结点A到叶结点O的路径则表示周游路线1,3,4,2,1.图G的每一条周游路线都恰好对应于解空间树中一条从根结点到叶结点的路径。因此,解空间树中叶结点个数为【(n-1)!】。图1-2:124342423434232对于图1-2的图G,用回溯法找最小费用路线时,从解空间树的根结点A出发,搜索至B,C,F,L.在叶结点L处记录找到的周游路线1,2,3,4,1,该周游路线的费用为59.从叶结点L返回至最近活结点F处。由于F处已没有可扩展结点。算法又返回到结点C处。结点C成为新扩展结点,由新扩展结点,算法再移至结点G后又移至结点M,得到周游路线1,2,4,3,1,其费用为66.这个费用不比已有周游路线1,2,3,4,1的费用更小。因此舍弃该结点。算法又依次返回至结点G,C,B。从结点B,算法继续搜索至结点D,H,N。ABDCEFGHIJKLMNOPQ6在叶结点N处,相应的周游路线1,23,2,4,1的费用为25.它是当前找到的最好的一条周游路线。从结点N算法返回至结点H,D,然后在从结点D开始D开始继续向纵深搜索至结点O。以此方法算法继续搜索遍整个解空间,最终得到最小费用周游路线1,3,2,4,1.在递归算法Backtrack中,当i=n时,当前扩展结点是排列数的叶结点的父结点。此时算法检测图G是否存在一条从顶点x【n-1]到顶点x[n]的边和一条从顶点x[n]到顶点1的边如果这两条边都存在,则找到一条旅行售货员回路。此时算法还需要判断这条回路的费用是否优于已找到的当前最优回路的费用bustc。如果是则必须更新当前最优值bestc和当前最优解bestx。当in时,当前扩展结点位于排列树的第i-1层。图G中存在从顶点xi-1]到顶点x[i]的边时,x[l,:i]构成图G的一条路径,且当x[;:i]的费用小于当前最优值时算法进入排列树的第i层,否则将剪去相应的子数。算法中用变量cc记录当前路径x【l:i]的费用。解旅行售货员问题的回溯算法可描述如下:TemplateclassTypeClassTraveling{friendTypetSP(int**,int[],int,Type);private:7voidBacktrack(inti);intn,*x,*bestx;Type**a,cc,bestx;Type**a,cc,bestc,NoEdge;};TemplateclassTypeVoidTravelingType::Backtrack(inti){If(i==n){If(a[x[n-1]])[x[n]!=NoEdge&&a[x[n]][1]!=N0Edge&&(cc+a[x[n-1]][x[n]+a[x[n][1]best||bestc==NoEdge)){for(intj=1;j=n;j++)bestx[j]=x[j];bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];}}8else{for(intj=i;j=n;j++)if(a[x[i-1][x[j]]!=NoEdge&&(cc+a[x[i-1]][x[j]]bestc||bestc==NoEdge)]{Swap(x[i],x[j];cc+=a[x[i-1]][x[[i]];Backtrack(i+10;cc-=a[x[i-1]][x[i]];swap(x[i],x[j]);}}}分支界限法:(1)分支界限法的基本思想:分支界限法以广度优先或以最小耗费(最大效益)优势的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树。在搜索问题的解空间树时,分支界限法与回溯法的主要区别在于他们对当前扩展结点所采用的扩展方式不同。在分支界限法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解得儿子结点被舍弃,其余儿子结点被加入活结点表中。9此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。(2)从活结点表中选择下一个扩展结点的不同方式导致不同的分支界限法。最常用的有两种方式1.方式队列式(FIFO)分支界限法队列式分支界限法将活结点组织成一个队列,并按队列的先进先出原则选择下一个结点为当前扩展结点。2.优先队列式分支界限法优先队列式的分支界限法将活结点表组织成一个优先队列,并按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。(3)分支法解tsp问题:考察4城市旅行售货员的例子,如图5-3所示,该问题的解空间树是一棵排列树。解次问题的队列式分支界限法以排列树中结点B作为初始扩展结点。此时,活结点队列为空。由于从图G的顶点1到顶点2,3和4均有边相连,所以结点B的儿子结点C,D,E均为可行结点,它们被加入到活结点队列中,并舍去当前扩展结点B。当前活结点队列中的队首结点C成为下一个扩展结点。由于图G的顶点2到顶点3和4有边相连,故结点C的2个儿子结点F和G均为可行结点,从而被加入到活结点队列中。接下来,结点D和结点E相继成为扩展结点而被扩展。10此时活结点队列中的结点依次是F,G,H,I,J,K。算法描述:算法开始时创建一个最小堆,用于表示活结点优先队列。堆中每个结点的子树费用的下界lcost值是优先队列的优先级。接着算法计算出图中每个顶点的最小费用出边并用minout记录。如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法即告结束。如果每个顶点都有出边,则根据计算出的minout作算法初始化。算法的while循环体完成对排列树内部结点的扩展。对于当前扩展结点,算法分2种情况进行处理:1、首先考虑s=n-2的情形,此时当前扩展结点是排列树中某个叶结点的父结点。如果该叶结点相应一条可行回路且费用小于当前最小费用,则将该叶结点插入到优先队列中,否则舍去该叶结点。2、当sn-2时,算法依次产生当前扩展结点的所有儿子结点。由于当前扩展结点所相应的路径是x[0:s],其可行儿子结点是从剩余顶点x[s+1:n-1]中选取的顶点x[i],且(x[s],x[i])是所给有向图G中的一条边。对于当前扩展结点的每一个可行儿子结点,计算出其前缀(x[0:s],x[i])的费用cc和相应的下界lcost。当lcostbestc时,将这个可行儿子结点插入到活结点优先队列中。算法中while循环的终止条件是排列树的一个叶结点成11为当前扩展结点。当s=n-1时,已找到的回路前缀是x[0:n-1],它已包含图G的所有n个顶点。因此,当s=n-1时,相应的扩展结点表示一个叶结点。此时该叶结点所相应的回路的费用等于cc和lcost的值。剩余的活结点的lcost值不小于已找到的回路的费用。它们都不可能导致费用更小的回路。因此已找到的叶结点所相应的回路是一个最小费用旅行售货员回路,算法可以结束。算法结束时返回找到的最小费用,相应的最优解由数组v给出。近似算法:近似算法解旅行售货员问题:问题描述:给定一个完全无向图G=(V,E),其每一边(u,v)∈E有一非负整数费用c(u,v)。要找出G的最小费用哈密顿回路。旅行售货员问题的一些特殊性质:比如,费用函数c往往具有三角不等式性质,即对任意的3个顶点u,v,w∈V,有:c(u,w)≤c(u,v)+c(v,w)。当图G中的顶点就是平面上的点,任意2顶点间的费用就是这2点间的欧氏距离时,费用函数c就具有三角不等式性质。对于给定的无向图G,可以利用找图G的最小生成树的算法设计找近似最优
本文标题:Tsp问题的几种算法的分析
链接地址:https://www.777doc.com/doc-2863910 .html