路线规划算法设计要点

路线规划算法设计要点

  (2012-08-25 10:42:14)
标签: 

lbs

 

gis

 

路线规划

 

手机导航

 

在线地图

 

导航

 

路线

 

it

 
 

         路线规划算法真的是太多了,基本上每一种算法都有自己的优势和劣势。路线算法永远是导航研发的主题之一,从过去到未来。网上路线规划算法的资料很多,但讲述算法有劣势的文档很少,所以在实际开发中,会积累到血与泪的经验,哈哈,题外话了。

1  D算法与A*算法

         Dijkstra算法是最基本的算法,是算法教科书上的经典教程,是所有入门路线规划必须精通的算法,是大多数导航引擎路线规划初级版本所使用的算法,还是最容易被算法高手忽略的算法。为什么会忽略它呢,因为在简单的验证后,会发现D算法耗时耗空间。最后许许多多的高手把目光转向的其他高效的算法。的确,几乎其它所有算法都比D算法来的高效。在经过一段血与泪的付出后,发现其它所有高效的算法几乎都有自己在路线合理性上的弊病,可是,在不考虑用户习惯路线的前提下,D算法却丝毫没有路线合理性的问题。路线规划算法的最难点是在路线合理性、时间消耗、空间消耗、硬件成本上做出合理的取舍。

         只要路段权值设计的对,D算法的合理性不成问题(这里所说的合理性是在不考虑用户习惯路线的前提下。结合用户习惯路线的规划不在这里进行讨论),但其效率非常低下,时间复杂度和空间复杂度都非常高。

         A*算法在时间复杂度和空间复杂度上对比D算法都提升了很多很多,但其有固有的先天缺陷,在大量测试后暴露的尤为明显。对于下图从起点到终点,有两条路线,一条是路段序列A、C,一条是路段序列B、D,在使用A*算法时,路段序列B、D是没有机会被计算到的,而路段序列B、D却优于A、C。这是A*的一大弊端。

路线规划算法设计要点

 

2 规划算法耗时点

         路线规划算法的耗时主要由参与计算的路段数量、拓扑数据的读取效率、临时表的排序效率这三部分组成。在路线算法层面,大部分的算法都是在满足路线合理性的基础上,尽量减少参与计算路段的数目。拓扑数据的读取效率由硬件、文件系统和拓扑数据的设计格式读取方式决定,读取方式如预加载、区域加载、动态缓存池等。临时表的排序效率,在初期设计时是容易忽视的,冒泡排序、斐波那契堆、最小堆等,其中堆排序效率要高。有一点需要特别注意,不要迷信网上的已有的效率评测,一定要根据的自己数据和算法实测,比如在一些环境下实测,最小堆的效率要高于斐波那契堆,这说明需要根据自己的代码场景实测、选择、优化不同的排序算法。

 

3 分区规划思路思路简析

         在路线规划时,从起点到终点一次规划完毕,耗时耗资源。如果时间复杂度是O(nlogn),那么可知遍历的路段越多,开销越大,或者说越到计算后期,耗时的增量越大。一种改进思路是把规划分成几个区域或部分,如起点区域、中间区域和终点区域,这几个区域相对独立。起点区域和终点区域分别通过正向邻接表和逆向邻接表来进行规划,当预设条件成立时终止起点和终点区域的规划,再进行中间段的规划,最后整合路线。这里涉及了两个概念,一是逆向邻接表,简单的说就是从到达路段到出发路段的邻接关系;二是终止起点和终点规划的条件,这是重点所在。对于终止条件好的设计是既要满足整合后的路线是近似最优路线,又要满足在和中间区域路线的衔接上不要有过多的冗余。

         在路线规划中,起点区域规划路线的道路等级总体上是向上升级,就是由低等级路段过渡到高等级路段;终端区域路线规划的道路等级总体上是向下降级,就是由高等级路段过渡到低等级路段;中间区域的规划总体上保持在高等级路段上。这就是常说的规划要处理的升降级机制,这样的处理可以有效减少要遍历路段的数量,提高规划效率。

         有一种情况需要特别注意,如下图,中间区域规划中高等级道路有可能存在不连通情况,这种情况需要一定的策略进行处理,一种比较好的方式是在预处理中进行逻辑升级。


路线规划算法设计要点

 

4 抽象层规划思路简析

         拓扑数据抽象的概念是吧数据分成主干、枝干、详细等几个层次(一般3~5层)后,逐层规划。有两个难点,一是如何抽象,而是层次之间的连接。

         抽象层的划分,一般是在数据预处理中完成。最简单的抽象层划分就是按照道路等级或者路线功能/经路等级来划分。在实做过程中会遇到抽象层连通性的问题,需要适当升高或降低部分路段的层级。层次间的连接,主要是高低抽象层次间路段的映射关系。

 

5  M2M路线的设计要点

         这里之所以单提出了M2M(宏观到微观)思想,是因为这一思路是在路线规划应用上,是精彩所在。

         基于M2M的基本路线规划算法,在网上有资料介绍,这里就不多说了。在实际开发中,由于一个图幅内有成千上万条路段,面临如何抽象节点或抽象成高等级图层的问题。一种方法是在图幅内进行连通性分析;一种方法是再次细分网格,逐层抽象,一种方法是图幅作为最底层,也就是最子层,而用图幅出入度来构建图幅连通拓扑关系。

         当然每一种方法都有自己的优劣势,其中有几个可能的提升点。一是各个抽象层是可以被抽稀和合并的,抽稀后会减少抽象层的数目,而增加抽象节点的节点数目,至于去除多少抽象层,取决于那种方案计算效率最优。另一是容差的RV值的确定,这是个经验数值,实做中可以根据不同的层级设计不同的RV值或函数。RV值要在路线合理性和计算效率上做权衡。

        

6 路线规划实做几点注意

         产品级路线规划往往不是使用一个的算法,而是一套互相结合和支持的策略和算法。比如M2M、抽象层、分区等这些是可以有效结合在一起的。再比如短途的规划算法可以采用和长途规划不同算法,以使路线更合理、效率更高。

         线程的使用可以提升单次路线的规划效率。线程可以使用在分区、分层的规划策略中,也可以使用在双向规划的算法中。双向规划对拓扑有一定的要求,就是需要建立必要的逆向邻接表。对于服务端路线服务来说,使用线程可以提升用户响应时间,但并不能提升并发用户数。

         基本的路线规划条件一般是距离最短和时间最少。距离是可度量的,而时间确实估值,这其中收到路面状况、车流量、驾驶习惯、红绿灯等因素影响。在不考虑实时路况和道路不同等级花销固定的条件下,影响规划耗时的因素主要是红绿灯、复杂路口和岔路口、出入主辅路等。

         不同的人和驾驶习惯对道路是否最优的评定会有所不同,路线合理是指能符合绝大部分的驾驶习惯。路线合理性测试十分重要,一是测试要上量,达到一定的测试量才能暴露问题,而是要和主流引擎的路线结果做对比,评估优缺点并改正。

         路线规划算法在设计时要留适当的扩展接口,如接入实时路况、指定避让路段等,这下算法本身没有难度,只是最好在设计之初予以考虑未来可能的需求。同样,路线服务协议的设计也要有足够的扩展性,其中唯一用户标识一定要有,更高级的规划算法是和用户当前路线以及驾驶习惯相结合的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值