路径规划 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |