路径规划 CH ArcFlag

前端之家收集整理的这篇文章主要介绍了路径规划 CH ArcFlag前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

先立题,后面再补内容

越来越发现我的缺点:不注意总结,只有不断的总结,才能正在深刻的理解某个东西。立题已经好几天了,到今天才过来开始写,唉。。。

废话不多说了,下面开始记录自己对ArcFlag以及CH方法的理解。

路径规划概念:在一个路网中找出,任意给定2个路口,找出这2个路口之间的最短路径(距离、时间、费用)。

1.现实生活中的启发

当我们要从北京开车去天津的时候,我们根本不会计算走的某条路是不是最优路径,而只是看看这条路能不能到我要去的地方。对,正是这个“这条路能不能到达终点?”给了我们一个启发:看看这条路是不是在最优路径上面。基于这个思想,我们的ArcFlag方法应运而生。

路网G=(E,V)

E=路网G中所有路段的集合;

V=路网G中所有路口的集合;

NE=E中路段的数量

NV=V中路口的数量

给定一个路段e,它的首、末路口分别为s、t;并且它针对路网中的任意一个路口v有一个f属性属性f的代表的意义为:从s出发,到达路口v的最优路径p是否经过路段e。这样,在路径规划的过程中,到达一个路口s时,只需要查看f为1的路段,从而减少拓展过程。

外存估算:每个f用一个bit存储,一个路段需要的字节为NV/8;全国总数据量B=NE*NV/8。

假设NE=3,800,000

NV=2,400,000

那外存B=3800000*2400000/8=1087188M

显然这个数字太大。

所以我们可以考虑将路口分成NB块,然后每个路段存储它针对某个块Block的f属性:只要从s出发,到达Block块内的某一个路口的flag为一,这个f就为1。

假设VB=500

那外存B=3800000*500/8=226M

这还是一个可以接受的值。

但是:对于路段e,如果它是双向路段,可以从s走到t;也可以从t走到s;所以一个路段e需要2个f,一个是s->t的f1,一个t->s的f2;所以上面的外存需要扩大2倍,为552M左右。

有了上面这552M的flag数据,我们在路网G中进行任意2路口的路径规划,将异常的快。

双向拓展:如果只有一个方向的flag,当快到中的时候,拓展范围会形成一个圆锥形(走到终点所在块的话,flag将失去作用)。因此我们可以从2个点同时往中间拓展,避免出现圆锥。因此我们需要再做一套反向flag数据。

正向拓展:拓展过程中,使用路段e相对终点T所在块的正向数据。(看从路段的某端出发,到BT的最优路径是否经过e)

反向拓展:拓展过程中,使用路段e相对起点S所在块的反向数据。(看起点出发,到路段e的某端的最优路径是否经过e)

原文链接:https://www.f2er.com/vb/261605.html

猜你在找的VB相关文章