Tsp问题的几种算法的分析

Tsp问题的几种算法的分析
Tsp问题的几种算法的分析

摘要

本文分析比较了tsp问题的动态规划算法,分支界限法,近似等算法。分析了旅行商问题的时间度特点,针对启发式算法求解旅行商问题中存在的一些问题提出了改进算法。此算法将群体分为若干小子集,并用启发式交叉算子,以较好利用父代个体的有效信息,达到快速收敛的效果,实验表明此算法能提高寻优速度,解得质量也有所提高。

关键词:旅行商问题TSP

Abstract

this paper analyzed the time complexity of traveling salesman problem,then put forward some imprivement towards the genetic algorithm for solving this problen: divding the population into some small parent individual well.so it can quickly get into convergence, the experimental result indicates the impwoved algorithm can accelerate the apeed of finding solution and improve the precision.

Keywords traveling salesman problem; genetic algorithm; subset; henristic crossover operator

目录

1、摘要--------------------------------------------------------------1

2、Abstract---------------------------------------------------------1

3、Tsp问题的提法------------------------------------------------2

4、回溯法求Tsp问题--------------------------------------------3

5、分支限界法求Tsp问题--------------------------------------7

6、近似算法求解Tsp问题-------------------------------------10

7、动态规划算法解Tsp问题----------------------------------12

引言

tsp问题刚提出时,不少人都认为很简单。后来,人们实践中才逐步认识到,这个问题只是叙述简单,易于为人所理解而其计算复杂性却是问题的输入规模的指数函数,属于NP完全问题。Tsp问题的实现思想已被应用到交通,管理等很多领域所以有必要探讨Tsp问题的算法。这里给出Tsp问题的动态规划算法,回溯算法,分支限界法,近似算法,和改进的启发式算法,以及它们之间的分析比较。

正文:

旅行售货员问题的提法是:

某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或旅费)最小。

设G=(V,E) 是一个带权图。图中各边的费用(权)为正数。图中的一条周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是这条路线上所有边的费用之和。旅行售货员问题要在图G中找到费用最小的周游路线。

图1-1:

回溯法:

(1)回溯法的基本思想:确定了解空间的组织结构后,回溯法从开始结点(根结点)出发,以深度优先方式搜索整个解空间。这个开始结点成为活结点,同时也成为当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点即成为新的活结点,并为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已无活结点时为止。

回溯法搜索解空间树时,通常采用两种则略避免无效搜索,提高回溯法的搜索效率。其一是用约束函数在扩展结点处减去不满足约束的子数;其二是用界限函数剪去得不到最优解的子数。这两类函数统称为剪支函数。

(2)回溯法解tsp问题:旅行售货员问题的解空间可以组织成一棵树,从书的根结点到任一叶结点的路径定义了图G的一条周游路线。图5-3是当n=4时解空间树的示例。其中从根结点A到叶结点L的路径上边的标号组成一条周游路

线1,2,3,4,1。而从根结点A到叶结点O的路径则表示周游路线1,3,4,2,1.图G的每一条周游路线都恰好对应于解空间树中一条从根结点到叶结点的路径。因此,解空间树中叶结点个数为【(n-1)!】。

图1-2:

对于图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。

在叶结点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。

当i

解旅行售货员问题的回溯算法可描述如下:

Template

Class Traveling{

friend Type tSP(int * *,int[],int,Type);

private:

void Backtrack(int i);

int n,

*x,

*bestx;

Type* *a,

cc,

bestx;

Type * *a,

cc,

bestc,

NoEdge;

};

Template

V oid Traveling::Backtrack(int i)

{

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]

bestc==NoEdge)){

for(int j=1;j<=n;j++)bestx[j]=x[j];

bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];}

}

else{

for(int j=i;j<=n;j++)

if(a[x[i-1][x[j]]!=NoEdge&&(cc+a[x[i-1]][x[j]]

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)分支界限法的基本思想:分支界限法以广度优先或以最小耗费(最大效益)优势的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树。在搜索问题的解空间树时,分支界限法与回溯法的主要区别在于他们对当前扩展结点所采用的扩展方式不同。在分支界限法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解得儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

(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相继成为扩展结点而被扩展。

此时活结点队列中的结点依次是F,G,H,I,J,K。

算法描述:

算法开始时创建一个最小堆,用于表示活结点优先队列。堆中每个结点的子树费用的下界lcost值是优先队列的优先级。接着算法计算出图中每个顶点的最小费用出边并用minout记录。如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法即告结束。如果每个顶点都有出边,则根据计算出的minout作算法初始化。

算法的while循环体完成对排列树内部结点的扩展。对于当前扩展结点,算法分2种情况进行处理:

1、首先考虑s=n-2的情形,此时当前扩展结点是排列树中某个叶结点的父结点。如果该叶结点相应一条可行回路且费用小于当前最小费用,则将该叶结点插入到优先队列中,否则舍去该叶结点。

2、当s

算法中while循环的终止条件是排列树的一个叶结点成

为当前扩展结点。当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的最小生成树的算法设计找近似最优的旅行售货员回路的算法。

void approxTSP (Graph g)

{

(1)选择g的任一顶点r;

(2)用Prim算法找出带权图g的一棵以r为根的最小生成树T;

(3)前序遍历树T得到的顶点表L;

(4)将r加到表L的末尾,按表L中顶点次序组成回路H,作为计算结果返回;

}

当费用函数满足三角不等式时,算法找出的旅行售货员回路的费用不会超过最优旅行售货员回路费用的2倍。

在费用函数不一定满足三角不等式的一般情况下,不存在具有常数性能比的解TSP问题的多项式时间近似算法,除非P=NP。换句话说,若P≠NP,则对任意常数ρ>1,不存在性能比为ρ的解旅行售货员问题的多项式时间近似算法。

(b)表示找到的最小生成树T;(c)表示对T作前序遍历的次序;(d)表示L产生的哈密顿回路H;

(e)是G的一个最小费用旅行售货员回路。

动态规划解tsp问题:

由于货郎担问题经过的路线是一条经过所有城市的闭合回路,因此从哪一点出发是无所谓的,因此不妨设从城市1出发。

问题的动态规划模型构造如下:

阶段k:已经历过的城市个数,包括当前所在的城市。k=1, 2, …, n , n+1,k=1表示出发时位于起点,k=n+1表示结束时回到终点。

状态变量:xk=(i, Sk),其中i表示当前所在的城市,Sk表示

尚未访问过的城市的集合。很明显

S1={2,3,…,n},…,Sn=Sn+1=F

其中F表示空集。并且有

xn=(i, F) i=2,3,…,n,xn+1=(1, F)

决策变量:dk=( i , j ),其中i为当前所在的城市,j为下一站将要到达的城市。

状态转移方程:若当前的状态为

xk=( i ,Sk)

采取的决策为

dk=( i , j )

则下一步到达的状态为

xk+1=T(xk,dk)=( j ,Sk\ {j})

阶段指标:vk(xk,dk)=Cij

最优指标函数:fk(xk)=fk(i,Sk) 表示从城市i出发,经过Sk中每个城市一次且仅一次,最后返回城市1的最短距离。

终端条件:fn+1(xn+1)=fn+1(1, F)=0

对于如图3.7.1所示的一个五个城市的货郎担问题,求解步骤如下:

对于k=5,有

f5(i,F)=min{Cij+f6(1,F)}=Ci1

i=2,3,4,5

d5?(i,1)

f5(I,F)的值列表如下:

i f5(i, F)

2 2

3 7

4 2

5 5

对于k=4,有

f4(i, S4)=min{Cij+f5(j,S5)}

j?S4

f4(i,S4)的值列表如下:

(i,S4) j Cij S5 Cij+f5(j,S5) f4(i,S4) j*

(2,{3}) {3} 3 F 3+f5(3,F)=3+7=10 10 3

(2,{4}) {4} 5 F 5+f5(4,F)=5+2=7 7 4

(2,{5}) {5} 1 F 1+f5(5,F)=1+5=6 6 5

(3,{2}) {2} 3 F 3+f5(2,F)=3+2=5 5 2

(3,{4}) {4} 4 F

4+f5(4,F)=4+2=6 6 4

(3,{5}) {5} 6 F 6+f5(5,F)=6+5=11 11 5

(4,{2}) {2} 5 F 5+f5(2,F)=5+2=7 7 2

(4,{3}) {3} 4 F 4+f5(3,F)=4+7=11 11 3

(4,{5}) {5} 3 F 3+f5(5,F)=3+5=8 8 5

(5,{2}) {2} 1 F 1+f5(2,F)=1+2=3 3 2

(5,{3}) {3} 6 F 6+f5(3,F)=6+7=13 13 3

(5,{4}) {4} 3 F 3+f5(4,F)=3+2=5 5 4

对于k=3,有

f3(i,S3)=min{Cij+f4(j,S4)}

j?S3

f3(i,S3)的值列表如下:

(i,S3) j Cij S4 Cij+f4(j,S4) f3(i,S3) j*

(2,{3,4}) {3}{4} 35 {4}{3}

3

(2,{3,5}) {3}{5} 31 {5}{3} 3+f4(3,{5})=3+11=14*1+f4(5,{3})=1+13=14* 14 3,5

(2,{4,5}) {4}{5} 51 {5}{4} 5+f4(4,{5})=5+8=131+f4(5,{4})=1+5=6* 6 5 (3,{2,4}) {2}{4} 34 {4}{2} 3+f4(2,{4})=3+7=10*4+f4(4,{2})=4+7=11 10 2

(3,{2,5}) {2}{5} 36 {5}{2} 3+f4(2,{5})=3+6=9*6+f4(5,{2})=6+3=9* 9 2,5

(3,{4,5}) {4}{5} 46 {5}{4} 4+f4(4,{5})=4+8=126+f4(5,{4})=6+5=11* 11 5

(4,{2,3}) {2}{3} 54 {3}{2} 5+f4(2,{3})=5+10=154+f4(3,{2})=4+5=9* 9 3

(4,{2,5}) {2}{5} 53 {5}{2} 5+f4(2,{5})=5+6=113+f4(5,{2})=3+3=6* 6 5 (4,{3,5}) {3}{5} 43 {5}{3}

3

(5,{2,3}) {2}{3} 16 {3}{2} 1+f4(2,{3})=1+10=11*6+f4(3,{2})=6+5=11* 11 2,3

(5,{2,4}) {2}{4} 13 {4}{2} 1+f4(2,{4})=1+7=8*3+f4(4,{2})=3+7=10 8 2 (5,{3,4}) {3}{4} 63 {4}{3} 6+f4(3,{4})=6+6=12*3+f4(4,{3})=3+11=14 12 3

对于k=2有

(i,S2) j Cij S3 Cij+f3(j,S3) f2(i,S2) j*

(2,{3,4,5}) {3}{4}{5} 351 {4,5}{3,5}{3,4}

3+f3(3,{4,5})=3+11=145+f3(4,{3,5})=5+15=201+f3(5,{3,4})= 1+12=13* 13 5

(3,{2,4,5}) {2}{4}{5} 346 {4,5}{3,5}{2,4}

3+f3(2,{4,5})=3+6=9*4+f3(4,{2,5})=4+6=106+f3(5,{2,4})=6+ 8=14 9 2

(4,{2,3,5}) {2}{3}{5} 543

{3,5}{2,5}{2,3}

5+f3(2,{3,5})=5+14=194+f3(3,{2,5})=4+9=13*3+f3(5,{2,3})= 3+11=14 13 3

(5,{2,3,4}) {2}{3}{4} 163 {3,4}{2,4}{2,3}

1+f3(2,{3,4})=1+9=10*6+f3(3,{2,4})=6+10=163+f3(4,{2,3})= 3+9=12 10 2

对于k=1,有

f1(1,S1)=min{C1j+f2(j,S2)}

f1(1,S1)的值列表如下:

(1,S1) j Cij S2 Cij+f2(j,S2) f1(1,S1) j*

(1,{2,3,4,5}) {2}{3}{4}{5} 2725 {3,4,5}{2,4,5}{2,3,5}{2,3,4}

2+f2(2,{3,4,5})=2+13=15*7+f2(3,{2,4,5})=7+9=162+f2(4,{2,3, 5})=2+13=15*5+f2(5,{2,3,4})=5+10=15* 15 2,4,5

由状态x1=(1,{2,3,4,5})开始回朔,得到

(1,{2,3,4,5})

j*=2 j*=5 j*=4

(2,{3,4,5}) (5,{2,3,4}) (4{2,3,5})

j*=5 j*=2 j*=3

(5,{3,4}) (2,{3,4}) (3,{2,5})

j*=3 j*=3 j*=2 j*=5

(3,{4}) (3,{4}) (2,{5}) (5,{2})

j*=4 j*=4 j*=4 j*=2

(4,Φ) (4, Φ) (5, Φ) (2, Φ)

即得到以下四条回路:

(1) ①à②à⑤à③à④à①

(2) ①à⑤à②à③à④à①

(3) ①à④à③à②à⑤à①

(4) ①à④à③à⑤à②à①

其中(1)和(4)是同一条回路,(2)和(3)是同一条回路。容易验证,两条回路的长度都是15。

动态规划方法并不是解决TSP问题的一个好方法,因其占用空间和时间复杂度均较大。

改进的启发式算法:

本算法将群体分成若干小子集,再进行杂交变异操作,

相关主题
相关文档
最新文档