导航算路

来源:互联网 发布:网络推广公司铭心营销 编辑:程序博客网 时间:2024/04/30 00:51

一:基本概念
1.Dijkstra算法

2.二叉堆快速排序
   简单说就是先把要排序的数按照第一排1个,第二排2个,第三排4个,第四排8个,。。。。第n排2的n-1次方个
  然后按照从下到上,从右到左的顺序进行调整,把每一个二叉树中的三个最小的放到树顶
 参考:  http://blog.csdn.net/zxm342698145/article/details/28434153
3.曼哈顿距离
   简单理解就是两个点的横坐标距离加上纵坐标距离和,就是这两个点连成斜边的直角三角形两个直角边的和
4.数据分层
   根据曼哈顿距离来决定使用哪一层的数据,距离越短使用越底层的数据,越底层数据越详细,比例尺越小
5.Link代价
   1. 对应导航领域来说,link代价指的就是link的通行时间
   2.Link通行时间通常是根据link的距离和平均速度来计算的,如果有tmc信息时,就要参考tmc信息对速度进行调整,重新计算link通行时间
6.Node代价


二:Level_0层探索
1.由自车和目的地计算的最小覆盖区域(区域A)
2.由自车和目的地计算的次可能覆盖区域(区域B)
  区域A和B是根据起始link和目的地link的Region和LEVEL_0 层分割维数的关系来确定左下和右上点的位置,从而确定区域A和区域B的大小
3.加载自车中心所在数据包
  把自车端的格网数据加载到内存
4.自车端link搜集和代价制作
5.将自车端的Link压人heap中
  第4和第5步就是先找到自车端附近的link,然后把他放到heap队列中,供自车端的探索使用。
6.自车端探索
  6.1探索简单过程:
  使用第4.5步找到的Link开始探索,具体就是每次从heap顶端弹出一个Link(heap中自己保证cost最小),然后找邻接Link,再把邻接Link压人heap中
heap中排序后,最小cost到顶端,然后再弹出顶端,再找下一个邻接link,这样不停循环。
  然后给这种探索加一个终止条件,比如heap中现在已经有32条link了,或者pop的次数超过了64等,然后就终止探索,末端的Link就在heap中了(比如有32条link)


  6.2 heap中简单的逻辑:
  while(true){
      一个容器A,放Link,最开始放起始的Link,后面放转向Link
1.弹出A中的link(第一次是startlink)
        2.根据startlink获取下个转向Link,然后把该转向Lin可放入容器A中
}
7.加载目的地所在数据包
  把目的地端的格网数据加载进内存
8.目的地端的数据搜集和代价制作
  这个就是把目的地端的link找到,然后放到heap中
9.目的地端探索
10.将自车端探索结果压人heap中
11.循环扩展heap中的Link
第9.10.11这个探索过程类似自车端的探索,不同的是反向探索,找进入的Link。最后也是保留末端的探索link到heap中(也是有终止条件)(比如探索结束heap中也有32条link)


三:路径制作
3.1起始端和目的地端的link对接
   探索结束后我们得到的是起始端和目的地端的末端link集(如都有32条),然后从起始集里向目的地集里探索对接,当对接成功时就找到了对接link集
3.2路径制作
   拿到对接link集后根据prelink来找整个路径的link集,具体就是从对接link开始向起始端或者向目的地端回溯,把回溯到的link按顺序放到队列中
这样回溯完后我们就能得到一个完整的从其实端到目的地端的完整的link集,这个就是一条完整的路径了


四:其他
4.1.算路的startlink是在定位VP模块做好的,根据定位的gps信息,取出自车点的经纬度,然后在一个范围内画矩形,根据矩形取出地图数据,然后匹配道路信息和link信息
   同理,destlink应该也是这么玩出来的。
4.2 前方封闭:这个就是根据封闭的范围找到这个范围的Link,然后把这些link的cost值加大,从而达到在探索过程尽可能避开这些link
4.3 算路方式:如高速优先,时间优先,距离优先等,这个会影响算路时link的cost


0 0