前段时间和导航部门同事聊天,大致了解了目前公司的路径引擎,发现效率还是很低的。尽管最近几年没从事这方向的工作,但仍很表惊讶。所以分享个人对路网最优路径算法的认识,做个抽象的总结。

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

相关文章: