路网最优路径算法之一分层搜索

1 背景

前面介绍了关于双向及启发式的搜索,它们均可以实现了效率的倍增。但是应用到长距离(例如武汉——杭州大于500公里)的搜索时,平均效率存在100ms级甚至s级的耗时,显然这样一个面对广大用户群的互联网服务引擎效率是不可接受的,那么有没有优化的方向可以实现数量级的提升?
      但人类对效率与正确的极致追求也是不止境的。关于双向及启发式搜索,它们的优化初衷均是一致的:缩短搜索范围。有人想到另一个路网搜索优化的方向:稀疏搜索路网密度——分层算法。

2 分层算法

假设有个长距离路径搜索的case1,某人春节后从A省所在的a县城返到B省所在的b县城,从人的认知心理学角度进行搜索的过程:
a 正向搜索:首先寻找a县城出发地周围内(例如20km)所在的主路或环路,然后再寻找县城周围内(30km)去A省所在省道的出口,再然后上国道高速路等。
b 反向搜索:类似正向搜索的行为过程。 
      正是由于路网具有等级差异的特征,所以路网分层算法应运而生了:我们会把路网根据国家规定或行业定制着不同的等级规则(主干道、省道、国道高速),进行归类与分层。
      当在出发地开始寻路时,首先仅考虑环路或主干路的搜索在30km的范围,然后继续仅考虑省道的搜索在80km的范围内,最后继续考虑高速等道路的搜索在100km的范围,这样搜索路网的密度会大大下降。可是不幸的是,这样的搜索直觉上是对的,但理论上未必靠谱。
     举个不恰当的反例case2:有人从城市武汉出发去西藏林芝等区自驾游,驾驶随着离出发地距离渐远的过程,走向高层的路网行驶,经过了重庆和四川,这时得经过一段“低等级的碎石路”才能入藏,可是“这段低等级的碎石路”可能已不在高层的候选路网中了,导致此次寻路失败。
      人类对自然与社会的认知过程,通常会先有直觉上的假设,然后会有理论及量化的证明。这也是社会科学和自然科学的奥妙关系。而HH路网处理算法的特点:正是对所有路网的重要性进行量化的分层算法之一。

3 HH算法

3.1 背景

路网由一堆节点和边组成。路网最优路径的搜索耗时,是与节点和边规模的平方成正比的。其算法设计初衷计算任意节点对最优路径时,在尽量稀疏的路网上进行搜索,来降低路网搜索规模,而又能同时保证结果的最优正确性。

3.2 思路

a 预处理阶段:采取分层的方法不断迭代,当前层的路网是由低一层的路网不断进行干掉拓扑点和边,生成新的逻辑路网的结果。
   并且每一层逻辑路网满足下面两个性质:
   条件1:每一层的逻辑路网是其低一层逻辑路网的子集
   条件2:每一层的逻辑路网中,任意拓扑点对的最优路径,一定属于当前层。 
b 实时查询阶段:在逻辑路网上进行最优路径的查询(比原始路网搜索快近1000倍)

3.3预处理

预处理的过程:基于当前路网不断迭代,进行干掉拓扑点和边生成更高层逻辑路网的过程。

3.3.1干掉节点(contract_node)

a 背景
     试图思考下,我们干掉一个节点时,其入边和出边也相应的也会干掉了,但为了保证拓扑的完整性,会增加相应的逻辑边。
     如果一个节点node,其入边个数和出边个数分别是nDegIn和nDegOut,contract其node时,去掉了其入边和出边的个数是(nDegIn+nDegOut),而最坏情况下,会引入的逻辑边的个数是inDeg*outDeg。显然,如果nDegIn与nDegOut均大于1时,值nDegIn*nDegOut大于值(inDeg+outDeg)的,并且nDegIn和nDegOut越大,其差值越大。
b 条件
    现在的矛盾:我们想去掉一些不是那么重要的节点,而又不想引入更多的逻辑边,所以引入contract因子contract_factor,通常取值1-2之间。当且仅当节点满足条件时:(nDegIn*nDegOut)<(nDegIn + nDegOut)*contract_factor,才会contract掉这个节点。

3.3.2 干掉边(build partial_tree 和 select_highway)

a 对于每个节点,基于给定的neighbour_size,计算其邻域半径neighborhood_radius
b 对于每个节点,计算每个节点的最优路径树partial_tree
c 对于每个partial_tree,对其每个叶子节点进行边的回溯,按照既定的规则,选取符合条件的边为更高层的边

4 路网算法优化方向

最后对路网算法优化的方向做个简单总结:
a Bi-Directional
b Heuristic (策略:缩减搜索范围,Dijkstra搜索空间是近似圆,A*搜索空间近似椭圆)
c Hierarchy(shortcut/contration,策略:缩减搜索密度,通常搜索密度为原始路网的近似百分之一,并且能保证结果正确性。典型算法如:HH、HNR、CH)
d TimeTable(预存储和实时取)
   并且上面4个优化方向互不冲突,通常可以任何组合同时使用。

参考

1http://algo2.iti.kit.edu/routeplanning.php

时间: 2024-10-05 18:30:57

路网最优路径算法之一分层搜索的相关文章

路网最优路径算法总结

前段时间,关于路网最优路径算法的专题我做了一次内部分享,感兴趣的朋友可以进行查看与下载,     链接如下: http://files.cnblogs.com/files/gisorange/%E8%B7%AF%E7%BD%91%E6%9C%80%E4%BC%98%E8%B7%AF%E5%BE%84%E7%AE%97%E6%B3%95%E6%A6%82%E8%BF%B0-2015-9-22.pdf

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io

算法提高课——搜索

BFS 求最小 基迭代,不会爆栈 Flood fill算法: 可以在线性时间复杂度内,找到某个点所在的连通块. //Home键到行首,End键到行尾 AcWing 1097. 池塘计数 AcWing 1098. 城堡问题 AcWing 1106. 山峰和山谷 最短路模型: 所有边权相等时,可以在线性时间内得到单源或多源最短路(可视为特殊的dijkstra) AcWing 1076. 迷宫问题 AcWing 188. 武士风度的牛 AcWing 1100. 抓住那头牛 AcWing 173. 矩阵

Matlab实现Flyod求最短距离及存储最优路径

Matlab实现Flyod求最短距离及存储最优路径 一.实际数据 已知图中所有节点的X.Y坐标. J01-J62:1-62; F01-F60:63-122; Z01-Z06:123-128; D01-D02:129-130. 二.Floyd求所有节点间的最小距离及通过矩阵存储最优路径的节点 1 function [ optimal,path,maxnum ] = Floyd( distance,liantong,num,p,q ) 2 %Author:ljy 3 %Date:20170919 4

十大基础实用算法之深度优先搜索和广度优先搜索

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.DFS属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相

最优路径问题

package 数阵中的最优路径; import java.util.Scanner; public class Main { /** * 数值三角形中的最大路径 * 随机产生一个n行的点数值三角形(第k行有k个点,每个点都带有一个正整数,)寻找从顶点开始每一步可沿着左或者右向下的至底部的一条路径, * 使得该路径的和最大. * * 数值三角形中的最大路径的搜索 * 应用动态规划,采用逆推法从低向上逐行反推 * 随机产生的点数值三角形存储在一个二维数组中,同时赋值给b(n,n),这里的数组b(i

数据结构与算法 - 排序与搜索

排序与搜索 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法. 1.冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序),就

Path环境变量包含不存在的路径时对dll搜索的影响

在Windows中,根据MSDN的文档,某些情况下应用程序运行时会在Path环境变量指定的目录中搜寻它需要的dll.那么如果Path中包含一个不存在的路径,Windows会如何处理这种情况?我本以为这些路径会被忽略,然后Windows会继续搜索,后来发现其实不然.至少在Windows 7上,cmd和Msys的行为不完全是这样. 假设我有一个应用程序conftest.exe,它依赖于SDL.dll:并且假设SDL.dll放在Path包含的某个目录中.在正常情况下,我在cmd中运行conftest.

《围住神经猫》的逃跑路径算法

关于<围住神经猫>的逃跑路径算法 <围住神经猫>是去年在微信上挺火的H5游戏,在学习unity3d的过程中我就想把这个游戏用我学习到的unity3d知识重新编写.神经猫的逃跑路径有6个方向,分别是左上,右上,左,右,左下,右下,如图A.当神经猫到达边界点(最左,最右,最上,最下的点)时,则神经猫成功逃脱. 图A 其中橙色圆点为不能到达点.如果在神经猫的逃跑路径上有橙色圆点,则称这条路径为不可通路径,反之为可通路径.逃跑算法的第一步是在6个逃跑方向寻找可通路径,再从可通路径中选择最短