路网最优路径算法之一单向和双向搜索
2014-03-29 19:44
197 查看
前段时间和导航部门同事聊天,大致了解了目前公司的路径引擎,发现效率还是很低的。尽管最近几年没从事这方向的工作,但仍很表惊讶。所以分享个人对路网最优路径算法的认识,做个抽象的总结。
1 前言
关键字
1.1 路网
网络有很多种如社交网络、互联网络、交通路网等等。但是路网有它自己的特点:1、每个节点的度数不高 2、边有等级的划分 3、路网更新相对缓慢。正因为它自身的特点,学术界和行业设计了很多适用于路网特征的预处理算法。
1.2 最优路径
a、权重因子
最优路径的计算依赖的权重因子有很多类型,例如时间、长度等等。显然,权重因子不同,计算结果也会不一样
b、个性化最优路径
有人会说最优路径不是绝对的,因为任意给定的两点,每个人都会有自己的最优路径。所以最优路径与心理学有关,例如:路人甲更偏好高速路,路人乙更偏好畅通路,而路人丙更偏好沿途风景好的路。
不同的最优路径只是因为代价模型各异而已。对于给定的代价模型,最优路径都是确定的,甚至是唯一的。本文论及到的最优路径,即是给定的代价模型下的最优路径。
1.3 最优路径定理
对于给定的起点O和终点D,如果Path(O,a,b,c..D)是OD节点对的最优路径,那么Path沿途上,任意的两点间的最优路径也在Path上。
注意:反之是不成立的,例如:(a,b)节点对的最优路径是Path(a,b), (b,c)节点对的最优路径是Path(b,c),那么(a,c)节点对的最优路径不一定是Path(a,b,c)。如果a,b,c三个节点依次用三个城市武汉、西安、北京为例子,显然明白了。
2 算法
2.1 背景
流程三部曲:
a、从heap中弹出节点
b、更新当前的候选最优路径cost
c、从当前节点广度搜索展开,更新相邻节点的权重,加入heap中
伪代码如下:
View Code
为理解方便,图示如下,五角星分别表示起始和终止点,圈表示搜索范围,算法的时间复杂度和圈的面积成正比的。
单向搜索
2.2 迪杰斯特拉(Dijkstra)算法
终止条件:当heap弹出的点是终止点时
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291940097817078.png)
搜索范围:近似半径为r的红色圆圈,为了算法时间复杂度的对比,标记其耗时为1。
2.3 A-Star启发式算法
估价函数:取值当前搜索节点n到目的节点的直线距离。这样可以保证:如果最优路径经过节点n时,最优路径cost始终是大于当前节点n的估价最优值的。
终止条件:当heap弹出的点的估价值>当前候选最优路径cost值时,停止搜索。注意:A-Star算法是以估价值从小到大弹出来搜索的,所以第一次弹出目的节点时,不一定找到最优路径了,只能当成一条候选最优路径;然后继续搜索。
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291939476724367.png)
搜索范围:近似长轴为r/2的红色椭圆,标记耗时为1/8。
双向搜索
网上似乎少有相关资料证明双向Dijkstra算法和双向A-Star算法的终止条件和理论正确性,本文也仅用图文说明双向搜索的终止条件和正确性。
通常情况,最短路径搜索时我们会用到两个容器,一个堆(Heap):维护着已经reach到的候选节点集合;一个Map:维护已经从heap中弹出的节点集合。
图示如下:
![](http://images.cnitblog.com/i/312734/201403/291941394699612.png)
PSet和PRelaxed分别表示正向搜索的Map和Heap,NSet和NRelaxed分别表示反向搜索的Map和Heap。
2.4 双向Dijkstra算法
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291939170317660.png)
小圈表示PSet和NSet集合,大圈表示PRelaxed和NRelaxed集合。
终止条件:当PSet和NSet初次相遇节点时,获得了第一条候选最优路径时,继续进行双向搜索,但这时停止向heap放入新的节点,仅用弹出当前的PRelaxed和NRelaxed的集合,最优meet节点肯定在红色背景的节点集合中。
搜索范围:近似两个半径为r/2的圆,标记耗时为1/2。
2.5 双向A-Star算法
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291935461726946.png)
小椭圆圈表示PSet和NSet集合,大椭圆圈表示PRelaxed和NRelaxed集合。
终止条件:当PSet和NSet初次相遇节点时,获得了第一条候选最优路径时,继续进行双向搜索,如果一方向搜索从heap弹出节点时,发现当前节点的估价最优值大于当前的候选最优路径值时,则停止该方向的搜索。
搜索范围:近似两个长轴为r/4的椭圆范围,标记耗时为1/16。
3 总结
本文仅对最优路径基本算法作了抽象地分析,比较了最优路径算法的时间复杂度和说明了双向Dijkstra和双向A-Star搜索算法的理论可行性和正确性。如表达有误,欢迎交流讨论
1 前言
关键字
1.1 路网
网络有很多种如社交网络、互联网络、交通路网等等。但是路网有它自己的特点:1、每个节点的度数不高 2、边有等级的划分 3、路网更新相对缓慢。正因为它自身的特点,学术界和行业设计了很多适用于路网特征的预处理算法。
1.2 最优路径
a、权重因子
最优路径的计算依赖的权重因子有很多类型,例如时间、长度等等。显然,权重因子不同,计算结果也会不一样
b、个性化最优路径
有人会说最优路径不是绝对的,因为任意给定的两点,每个人都会有自己的最优路径。所以最优路径与心理学有关,例如:路人甲更偏好高速路,路人乙更偏好畅通路,而路人丙更偏好沿途风景好的路。
不同的最优路径只是因为代价模型各异而已。对于给定的代价模型,最优路径都是确定的,甚至是唯一的。本文论及到的最优路径,即是给定的代价模型下的最优路径。
1.3 最优路径定理
对于给定的起点O和终点D,如果Path(O,a,b,c..D)是OD节点对的最优路径,那么Path沿途上,任意的两点间的最优路径也在Path上。
注意:反之是不成立的,例如:(a,b)节点对的最优路径是Path(a,b), (b,c)节点对的最优路径是Path(b,c),那么(a,c)节点对的最优路径不一定是Path(a,b,c)。如果a,b,c三个节点依次用三个城市武汉、西安、北京为例子,显然明白了。
2 算法
2.1 背景
流程三部曲:
a、从heap中弹出节点
b、更新当前的候选最优路径cost
c、从当前节点广度搜索展开,更新相邻节点的权重,加入heap中
伪代码如下:
void search() { while (needSearch()) { if (!popOpenSet()) { return; } updateRouterCost(); relaxConnectedEdges(); } }
View Code
为理解方便,图示如下,五角星分别表示起始和终止点,圈表示搜索范围,算法的时间复杂度和圈的面积成正比的。
单向搜索
2.2 迪杰斯特拉(Dijkstra)算法
终止条件:当heap弹出的点是终止点时
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291940097817078.png)
搜索范围:近似半径为r的红色圆圈,为了算法时间复杂度的对比,标记其耗时为1。
2.3 A-Star启发式算法
估价函数:取值当前搜索节点n到目的节点的直线距离。这样可以保证:如果最优路径经过节点n时,最优路径cost始终是大于当前节点n的估价最优值的。
终止条件:当heap弹出的点的估价值>当前候选最优路径cost值时,停止搜索。注意:A-Star算法是以估价值从小到大弹出来搜索的,所以第一次弹出目的节点时,不一定找到最优路径了,只能当成一条候选最优路径;然后继续搜索。
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291939476724367.png)
搜索范围:近似长轴为r/2的红色椭圆,标记耗时为1/8。
双向搜索
网上似乎少有相关资料证明双向Dijkstra算法和双向A-Star算法的终止条件和理论正确性,本文也仅用图文说明双向搜索的终止条件和正确性。
通常情况,最短路径搜索时我们会用到两个容器,一个堆(Heap):维护着已经reach到的候选节点集合;一个Map:维护已经从heap中弹出的节点集合。
图示如下:
![](http://images.cnitblog.com/i/312734/201403/291941394699612.png)
PSet和PRelaxed分别表示正向搜索的Map和Heap,NSet和NRelaxed分别表示反向搜索的Map和Heap。
2.4 双向Dijkstra算法
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291939170317660.png)
小圈表示PSet和NSet集合,大圈表示PRelaxed和NRelaxed集合。
终止条件:当PSet和NSet初次相遇节点时,获得了第一条候选最优路径时,继续进行双向搜索,但这时停止向heap放入新的节点,仅用弹出当前的PRelaxed和NRelaxed的集合,最优meet节点肯定在红色背景的节点集合中。
搜索范围:近似两个半径为r/2的圆,标记耗时为1/2。
2.5 双向A-Star算法
搜索范围图示如下:
![](http://images.cnitblog.com/i/312734/201403/291935461726946.png)
小椭圆圈表示PSet和NSet集合,大椭圆圈表示PRelaxed和NRelaxed集合。
终止条件:当PSet和NSet初次相遇节点时,获得了第一条候选最优路径时,继续进行双向搜索,如果一方向搜索从heap弹出节点时,发现当前节点的估价最优值大于当前的候选最优路径值时,则停止该方向的搜索。
搜索范围:近似两个长轴为r/4的椭圆范围,标记耗时为1/16。
3 总结
本文仅对最优路径基本算法作了抽象地分析,比较了最优路径算法的时间复杂度和说明了双向Dijkstra和双向A-Star搜索算法的理论可行性和正确性。如表达有误,欢迎交流讨论
相关文章推荐
- [ 算法 ] 广度优先搜索寻找最优路径、以及双向广度搜索算法!
- 路网最优路径算法之一启发式搜索
- 路网最优路径算法之一分层搜索
- A* (路径搜索)算法导引
- 广度优先搜索迷宫路径算法的实现
- hdu 1151 - > 双向路径搜索解决覆盖问题
- 有关路径搜索的一个算法
- hdu 1151 - > 双向路径搜索解决覆盖问题
- A*路径搜索算法入门
- 广度优先搜索寻找最优路径、以及双向广度搜索算法 .
- 深度优先搜索迷宫路径算法的实现
- 练练看游戏JavaScript搜索路径的核心算法实现
- 最大流最小割算法; BFS搜索增广路径; 算法简单,打印结果也比较清晰;
- A星算法-1 A星路径搜索算法入门
- UOJ#9 浅谈在线仙人球嵌套动态网络路径剖分优化的分支定界贪心剪枝启发式迭代加深人工智能搜索决策算法解决问题
- hdu 1151 - > 双向路径搜索解决覆盖问题
- A* (路径搜索)算法导引
- 有关路径搜索的一个算法
- 二分图及其匹配算法——最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- 广度优先搜索寻找最优路径、以及双向广度搜索算法