地图中最短路径的搜索算法研究综述 (1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

地图中最短路径的搜索算法研究

学生:李小坤导师:董峦

摘要:目前为止, 国内外大量专家学者对“最短路径问题”进行了深入的研究。本文通过理论分析, 结合实际应用,从各个方面较系统的比较广度优先搜索算法(BFS)、深度优先搜索算法(DFS)、A* 算法的优缺点。

关键词:最短路径算法;广度优先算法;深度优先算法;A*算法;

The shortest path of map's search algorithm Abstract:So far, a large number of domestic and foreign experts and scholars on the" shortest path problem" in-depth study. In this paper, through theoretical analysis and practical application, comprise with the breadth-first search algorithm ( BFS ), depth-first search algorithm ( DFS ) and the A * algorithms from any aspects of systematic.

Key words: shortest path algorithm; breadth-first algorithm; algorithm; A * algorithm;

前言:

最短路径问题是地理信息系统(GIS)网络分析的重要内容之一,而且在图论中也有着重要的意义。实际生活中许多问题都与“最短路径问题”有关, 比如: 网络路由选择, 集成电路设计、布线问题、电子导航、交通旅游等。本文应用深度优先算法,广度优先算法和A*算法,对一具体问题进行讨论和分析,比较三种算的的优缺点。

在地图中最短路径的搜索算法研究中,每种算法的优劣的比较原则主要遵循以下三点:[1]

(1)算法的完全性:提出一个问题,该问题存在答案,该算法能够保证找到相应的答案。算法的完全性强是算法性能优秀的指标之一。

(2)算法的时间复杂性: 提出一个问题,该算法需要多长时间可以找到相应的答案。算法速度的快慢是算法优劣的重要体现。

(3)算法的空间复杂性:算法在执行搜索问题答案的同时,需要多少存储空间。算法占用资源越少,算法的性能越好。

地图中最短路径的搜索算法:

1、广度优先算法

广度优先算法(Breadth-First-Search),又称作宽度优先搜索,或横向优先搜索,是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型,Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽

度优先搜索类似的思想。广度优先算法其别名又叫BFS ,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。BFS 并不使用经验法则算法。

广度优先搜索算法伪代码如下:[2-3]

BFS(v)//广度优先搜索G ,从顶点v 开始执行

//所有已搜索的顶点i 都标记为Visited(i)=1.

//Visited 的初始分量值全为0

Visited(v)=1;

Q=[];//将Q 初始化为只含有一个元素v 的队列

while Q not null do

u=DelHead(Q);

for 邻接于u 的所有顶点w do

if Visited(w)=0 then

AddQ(w,Q); //将w 放于队列Q 之尾

Visited(w)=1;

endif

endfor

endwhile

end BFS

这里调用了两个函数:AddQ(w,Q)是将w 放于队列Q 之尾;DelHead(Q)是从队列Q 取第一个顶点,并将其从Q 中删除。重复DelHead(Q)过程,直到队列Q 空为止。

完全性:广度优先搜索算法具有完全性。这意指无论图形的种类如何,只要目标存在,则BFS 一定会找到。然而,若目标不存在,且图为无限大,则BFS 将不收敛(不会结束)。 时间复杂度:最差情形下,BFS 必须寻找所有到可能节点的所有路径,因此其时间复杂度为()E V O +,其中|V|是节点的数目,而 |E| 是图中边的数目。

空间复杂度:因为所有节点都必须被储存,因此BFS 的空间复杂度为

()E V O +,其中|V|是节点的数目,而|E|是图中边的数目。另一种说法称BFS 的空间复杂度为O(B),其中B 是最大分支系数,而M 是树的最长路径长度。由于对空间的大量需求,因此BFS 并不适合解非常大的问题。[4-5]

2、深度优先算法

深度优先搜索算法(Depth First Search)英文缩写为DFS,属于一种回溯算法,正如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。

[6]其过程简要来说是沿着顶点的邻点一直搜索下去,直到当前被搜索的顶点不再有未被访问的邻点为止,此时,从当前辈搜索的顶点原路返回到在它之前被搜索的访问的顶点,并以此顶点作为当前被搜索顶点。继续这样的过程,直至不能执行为止。

深度优先搜索算法的伪代码如下:[7]

DFS(v) //访问由v到达的所有顶点

Visited(v)=1;

for邻接于v的每个顶点w do

if Visited(w)=0 then

DFS(w);

endif

endfor

end DFS

作为搜索算法的一种,DFS对于寻找一个解的NP(包括NPC)问题作用很大。但是,搜索算法毕竟是时间复杂度是O(n!)的阶乘级算法,它的效率比较低,在数据规模变大时,这种算法就显得力不从心了。[8]关于深度优先搜索的效率问题,有多种解决方法。最具有通用性的是剪枝,也就是去除没有用的搜索分支。有可行性剪枝和最优性剪枝两种。

BFS:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元用来存储状态)。

DFS:对于解决遍历和求所有问题有效,对于问题搜索深度小的时候处理速度迅速,然而在深度很大的情况下效率不高。

3、A*算法

1968年的一篇论文,“P. E. Hart, N. J. Nilsson, and B. Raphael. A formal basis for the heuristic determination of minimum cost paths in graphs. IEEE Trans. Syst. Sci. and Cybernetics, SSC-4(2):100-107, 1968”。[9]从此,一种精巧、高效的算法——A*算法问世了,并在相关领域得到了广泛的应用。A* 算法其实是在宽度优先搜索的基础上引入了一个估价函数,每次并不是把所有可扩展的结点展开,而是利用估价函数对所有未展开的结点进行估价, 从而找出最应该被展开的结点,将其展开,直到找到目标节点为止。

A*算法主要搜索过程伪代码如下:[10]

创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。

算起点的估价值;

将起点放入OPEN表;

while(OPEN!=NULL) //从OPEN表中取估价值f最小的节点n;

if(n节点==目标节点) break;

相关文档
最新文档