导航:首页 > 源码编译 > 图路径搜索算法

图路径搜索算法

发布时间:2023-10-11 08:57:56

‘壹’ A*算法——启发式路径搜索

A*是一种路径搜索算法,比如为游戏中的角色规划行动路径。

A* 算法的输入是, 起点(初始状态) 终点(目标状态) ,以及两点间 所有可能的路径 ,以及涉及到的 中间节点(中间状态) ,每两个节点间的路径的 代价

一般还需要某种 启发函数 ,即从任意节点到终点的近似代价,启发函数能够非常快速的估算出该代价值。

输出是从 起点到终点的最优路径 ,即代价最小。同时,好的启发函数将使得这一搜索运算尽可能高效,即搜索尽量少的节点/可能的路径。

f(n)=g(n)+h(n)

f(n) 是从初始状态经由状态n到目标状态的代价估计

g(n) 是在状态空间中从初始状态到状态n的实际代价

h(n) 是从状态n到目标状态的最佳路径的估计代价

A*算法是从起点开始,检查所有可能的扩展点(它的相邻点),对每个点计算g+h得到f,在所有可能的扩展点中,选择f最小的那个点进行扩展,即计算该点的所有可能扩展点的f值,并将这些新的扩展点添加到扩展点列表(open list)。当然,忽略已经在列表中的点、已经考察过的点。

不断从open list中选择f值最小的点进行扩展,直到到达目标点(成功找到最优路径),或者节点用完,路径搜索失败。

算法步骤:

参考

A* 算法步骤的详细说明请参考 A*寻路算法 ,它包含图文案例清楚的解释了A*算法计算步骤的一些细节,本文不再详细展开。

看一下上面参考文档中的案例图,最终搜索完成时,蓝色边框是close list中的节点,绿色边框是open list中的节点,每个方格中三个数字,左上是f(=g+h),左下是g(已经过路径的代价),右下是h(估计未经过路径的代价)。蓝色方格始终沿着f值最小的方向搜索前进,避免了对一些不好的路径(f值较大)的搜索。(图片来自 A*寻路算法 )

现在我们可以理解,A*算法中启发函数是最重要的,它有几种情况:

1) h(n) = 0
一种极端情况,如果h(n)是0,则只有g(n)起作用,此时A*演变成Dijkstra算法,这保证能找到最短路径。但效率不高,因为得不到启发。

2) h(n) < 真实代价
如果h(n)经常都比从n移动到目标的实际代价小(或者相等),则A*保证能找到一条最短路径。h(n)越小,A*扩展的结点越多,运行就得越慢。越接近Dijkstra算法。

3) h(n) = 真实代价
如果h(n)精确地等于从n移动到目标的代价,则A*将会仅仅寻找最佳路径而不扩展别的任何结点,这会运行得非常快。尽管这不可能在所有情况下发生,你仍可以在一些特殊情况下让它们精确地相等(译者:指让h(n)精确地等于实际值)。只要提供完美的信息,A*会运行得很完美,认识这一点很好。

4) h(n) > 真实代价
如果h(n)有时比从n移动到目标的实际代价高,则A*不能保证找到一条最短路径,但它运行得更快。

5) h(n) >> 真实代价
另一种极端情况,如果h(n)比g(n)大很多,则只有h(n)起作用,A*演变成BFS算法。

关于启发函数h、Dijkstra算法、BFS(最佳优先搜索)算法、路径规划情况下启发函数的选择、算法实现时List的数据结构、算法变种等等更多问题,请参考: A*算法

‘贰’ bfs算法是什么

bfs算法宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。

与深度优先搜索的对比

1、把根节点压入栈中。

2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。

3、找到所要找的元素时结束程序。

4、如果遍历整个树还没有找到,结束程序。

‘叁’ 图论基础-1.查找所有路径

工作中某块需求涉及到查找两点之间全部路径的需求,尝试利用图的算法来解决这一问题。
目标:找出途中从开始到结束节点中间的所有路径

图是网络结构的抽象模型。图是一组由边连接的节点(或顶点),任何二元关系都可以用图来表示。
一个图G=(V, E)由以下兀素组成:

由一条边连接在一起的顶点称为相邻顶点 比如,A和B是相邻的
一个顶点的度是其相邻顶点的数量 比如,A和其他三个顶点相连接,因此,A的度为3
路径是顶点v1, v2, ...vk的一个连续序列 以上图为例, 其中包含路径A B E I 和 A C D G。

用例:

1.邻接矩阵:(Adjacency Matrix)适用于稠密图(完全图)

2.邻接表(Adjacency Lists)适用于稀疏图

和树数据结构类似,我们可以访问图的所有节点。有两种算法可以对图进行遍历:

1.将图抽象成用例

2生成邻接矩阵

3获取所有路径

参考文档:
https://juejin.im/post/5de7c053518825125d1497e2
https://juejin.im/post/5a32688b5188254dd9366d6a
不使用递归的生成路径方法: https://juejin.im/entry/5d849fb45188255a8b635058

‘肆’ 什么是路径搜索算法

举个例子你大概就明白了,假设从上海东方明珠电视塔到北京天安门有N条线路,可以上海-天津-北京,上海-南京-北京,上海-广州-西藏-北京等等等,选择一条需要的线路这就是路径搜索,用来实现该选择的算法是路径搜索算法,可以选择最短路径,关键路径,如果有费用(权值)就可以选择最便宜路径(权最小),如果有路径需用时(飞机、火车,有些地方只有单一交通工具)就可以选择时间最短路径
用于计算机中的路径搜索就比较广泛了,但大体就是根据上述情况变化来得

‘伍’ 算法 地图上如何搜索一个点附近的点

这个还是要问程序猿,现在比较流行A*算法,至于网络是否开发出了新的算法不得而知,毕竟没有完全相同的程序。
给你看一篇文献:
地图中最短路径的搜索算法研究
学生:李小坤 导师:董峦
摘要:目前为止, 国内外大量专家学者对“最短路径问题”进行了深入的研究。本文通过理论分析, 结合实际应用,从各个方面较系统的比较广度优先搜索算法(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必须寻找所有到可能节点的所有路径,因此其时间复杂度为,其中|V|是节点的数目,而 |E| 是图中边的数目。
空间复杂度:因为所有节点都必须被储存,因此BFS的空间复杂度为,其中|V|是节点的数目,而|E|是图中边的数目。另一种说法称BFS的空间复杂度为O(B),其中B是最大分支系数,而M是树的最长路径长度。由于对空间的大量需求,因此BFS并不适合解非常大的问题。[4-5]
2、深度优先算法
深度优先搜索算法(Depth First Search)英文缩写为DFS,属于一种回溯算法,正如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。[6]其过程简要来说是沿着顶点的邻点一直搜索下去,直到当前被搜索的顶点不再有未被访问的邻点为止,此时,从当前辈搜索的顶点原路返回到在它之前被搜索的访问的顶点,并以此顶点作为当前被搜索顶点。继续这样的过程,直至不能执行为止。

‘陆’ bfs算法是什么

广度优先搜索算法(英语:Breadth-First Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。

简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。

作法

BFS是一种暴力搜索算法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能地址,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。

从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。

一般的实现里,其邻居节点尚未被检验过的节点会被放置在一个被称为open的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为closed的容器中。


(6)图路径搜索算法扩展阅读:

广度优先搜索算法的应用

广度优先搜索算法能用来解决图论中的许多问题,例如:

1、查找图中所有连接组件(ConnectedComponent)。一个连接组件是图中的最大相连子图。

2、查找连接组件中的所有节点。

3、查找非加权图中任两点的最短路径。

4、测试一图是否为二分图。

5、(Reverse)Cuthill–McKee算法

‘柒’ 求有向图两点间是否存在路径的“算法思想”

从一个点进行深度优先搜索 看能不能到另外一个点

‘捌’ 图遍历算法之最短路径Dijkstra算法

最短路径问题是图论研究中一个经典算法问题,旨在寻找图中两节点或单个节点到其他节点之间的最短路径。根据问题的不同,算法的具体形式包括:

常用的最短路径算法包括:Dijkstra算法,A 算法,Bellman-Ford算法,SPFA算法(Bellman-Ford算法的改进版本),Floyd-Warshall算法,Johnson算法以及Bi-direction BFS算法。本文将重点介绍Dijkstra算法的原理以及实现。

Dijkstra算法,翻译作戴克斯特拉算法或迪杰斯特拉算法,于1956年由荷兰计算机科学家艾兹赫尔.戴克斯特拉提出,用于解决赋权有向图的 单源最短路径问题 。所谓单源最短路径问题是指确定起点,寻找该节点到图中任意节点的最短路径,算法可用于寻找两个城市中的最短路径或是解决着名的旅行商问题。

问题描述 :在无向图 中, 为图节点的集合, 为节点之间连线边的集合。假设每条边 的权重为 ,找到由顶点 到其余各个节点的最短路径(单源最短路径)。

为带权无向图,图中顶点 分为两组,第一组为已求出最短路径的顶点集合(用 表示)。初始时 只有源点,当求得一条最短路径时,便将新增顶点添加进 ,直到所有顶点加入 中,算法结束。第二组为未确定最短路径顶点集合(用 表示),随着 中顶点增加, 中顶点逐渐减少。

以下图为例,对Dijkstra算法的工作流程进行演示(以顶点 为起点):

注:
01) 是已计算出最短路径的顶点集合;
02) 是未计算出最短路径的顶点集合;
03) 表示顶点 到顶点 的最短距离为3
第1步 :选取顶点 添加进


第2步 :选取顶点 添加进 ,更新 中顶点最短距离




第3步 :选取顶点 添加进 ,更新 中顶点最短距离




第4步 :选取顶点 添加进 ,更新 中顶点最短距离





第5步 :选取顶点 添加进 ,更新 中顶点最短距离



第6步 :选取顶点 添加进 ,更新 中顶点最短距离



第7步 :选取顶点 添加进 ,更新 中顶点最短距离

示例:node编号1-7分别代表A,B,C,D,E,F,G

(s.paths <- shortest.paths(g, algorithm = "dijkstra"))输出结果:

(s.paths <- shortest.paths(g,4, algorithm = "dijkstra"))输出结果:

示例:

找到D(4)到G(7)的最短路径:

[1] 维基网络,最短路径问题: https://zh.wikipedia.org/wiki/%E6%9C%80%E7%9F%AD%E8%B7%AF%E9%97%AE%E9%A2%98 ;
[2]CSDN,Dijkstra算法原理: https://blog.csdn.net/yalishadaa/article/details/55827681 ;
[3]RDocumentation: https://www.rdocumentation.org/packages/RNeo4j/versions/1.6.4/topics/dijkstra ;
[4]RDocumentation: https://www.rdocumentation.org/packages/igraph/versions/0.1.1/topics/shortest.paths ;
[5]Pypi: https://pypi.org/project/Dijkstar/

阅读全文

与图路径搜索算法相关的资料

热点内容
android获取窗口大小 浏览:178
程序员为世界带来的贡献 浏览:214
程序员招聘自荐信 浏览:693
魔兽键位设置命令宏 浏览:645
程序员没有目标了 浏览:828
抢答器c程序编程 浏览:703
什么app可以自己玩 浏览:76
刨客app是什么 浏览:963
cad输入命令栏不见了 浏览:834
做故事集可以用什么app 浏览:692
qq邮箱发送压缩包 浏览:672
程序员桌面机器人 浏览:589
xjr快速开发平台源码 浏览:159
java接口runnable 浏览:31
python怎么运行web服务器 浏览:349
notepad编程代码 浏览:740
什么安卓的毛病最少 浏览:611
hp的pjl设备访问命令 浏览:635
googlewebp图片压缩技术 浏览:215
tbc萨满加血宏命令 浏览:757