理解OSRM(4)-MLD算法总览
转载⾃。
Multi-Level Dijkstra算法来源⾃CRP算法论⽂。
设计⽬标
应⽤于⼤陆级别的实际路⽹数据
⽀持任意类型metric(可以理解为cost function)
响应时间满⾜实时查询的需求
傲慢不逊快速的路况更新以及定制化metric更新
主要思想超级过山车
实际路⽹由拓扑结构和metric属性两部分组成。路⽹拓扑结构由道路的⼀系列静态属性组成,包括道路长度,转向类型,车道数,道路类型,最⼤速度等;metric属性代表经过⼀条道路或转向时的实际cost。我们认为路⽹拓扑将结构是各个metric通⽤的并且很少变
化,metric 属性可能会经常变化并且可以是⽤户定制的。
crp 算法包括以下三个阶段:
metric-independent processing:处理路⽹拓扑数据,运⾏较慢,但是运⾏频率低
metric customization:处理每个metric的时候都必须运⾏,要求执⾏速度快
query stage:响应时间需满⾜实时查询
需要注意的是,针对⼀个指定的metric,crp算法的响应时间不如像ch等具有很好等级特性的算法,crp 算法的优势是在满⾜实时查询的基础上可以快速应⽤各种不同metric。某天某时
主流路径规划算法
以ch为代表的strong hierarchy 算法,依赖于道路等级特性进⾏数据预处理,响应时间快,对于等级特性差的metric加速效果变差(最短距离⽐最短时间慢10倍),缺点是不能很好的⽀持各种metric
以A*,ALT为代表⽬标启发式算法,算法特点是相⽐ch,可以更好的⽀持多种metric,算法缺点是响应时间较慢。
基于图分割的路径规划算法,把路⽹处理为多层overlay graph,算法的特点是图分割和响应时间和metric相互独⽴,适⽤于crp算法的设计思路。(图的覆盖可以参见)
分割图
分割图的⼀些说明
⼀个node 属于且仅属于同⼀层的唯⼀⼀个cell;
每⼀层cell 中的node数⼩于设定的参数U(每层不⼀样);
对于⼀个cell 来说其对应的⾼层的cell记为supercell,其对应的低层的cell记为subcell;
处于cell边界的所有node记为boundary vertex,相同level连接不同cell的边记为boundary arc;
对于cell中每两个boundary vertex在当前cell内计算最短路径,这些最短路径记为shortcut或clique;
可以证明,level-l中的所有boundary arc以及所有clique是level-(l-1)的覆盖图;
Holzer et al在⽂献中证明覆盖图可以保证搜索的正确性。
个体工商户登记管理办法
对分割图剪枝
婴儿配方奶粉
reduction: 针对每两个boundary vertex在本层graph 上进⾏dijkstra搜索,把之前计算的不是shortcut 的边删除;
skeleton graph:针对每个boundary vertex计算到当前cell内其他boundary vertex的最短路径树,最后对所有的最短路径树求并集构造为 skeleton graph。
针对转向的建模
fully expanded:对交叉路⼝的每个⼊⼝出⼝添加node,可能的转向⽅向添加edge;
arc-bad:只添加每个可能⽅向出⼝的节点;
compact:构建⼀个p*q的turn table(p 代表的交叉路⼝的⼊⼝,q 代表交叉路⼝的出⼝),由于交叉路⼝的类型有限,所有对于每个交叉路⼝节点存储⼀个指向turn table的指针。
基于多层overlay graph 的路径规划
Partition
crp 提出基于多层overlay graph 的路径规划算法性能依赖于每层中boundary arc的数⽬。
Partition 阶段的⽬标是使得 oveylay graph 中boundary arc的数⽬尽量少。这⾥crp 算法使⽤的partition算法是PUNCH,参见。PUNCH算法的原理是利⽤路⽹中⾃然分割(河流,⼭川,⾼速公路)作为启发因⼦进⾏分割。
PUNCH算法相⽐其他图分割算法性能有两倍提升,但是算法运⾏时间相⽐其他算法运⾏时间较长,这点⽆伤⼤雅,因为partition过程的过程属于离线流程,不会经常运⾏。
Overlay 拓扑
我们在partition的过程中进⾏的是nested partition,因此对于在overlay graph 中任意⼀个node都存在于低level的overlay graph 中,因此我们只需要存储⼀份node的集合,每个node都有⼀个标记来标记对于某个level来说,其是不是⼀个bourdary vertex。
对于每⼀个cell来说,其有p个⼊⼝节点,q个出⼝节点,我们使⽤⼀个p*q的矩阵W来存储所有shortcut,也就是计算前⾯提到的clique。需要注意的是,W的内容在partition阶段不进⾏计算,具体数值在customization阶段结算;且每⼀个metric 对应着⼀个W。
Customization
Customization 阶段会在query的同时进⾏,因此Customization阶段需要⾜够快,Customization的过程实际上就是计算上⾯提到的W。
我们采⽤⾃底向上的⽅式针对每个cell计算W。
加速Customization计算
Impoving Locality
在计算level i 的Cell C 的时候,我们需要的计算过程是在整个相应的overlay graph 中限制在Cell C的
范围内搜索,相当于在dijkstra 搜索的过程中,每探测到⼀个node,都需要判断是不是在Cell C的范围内。因此,在搜索之前我们把Cell C 在overlay graph 中相应部分复制⼀份,在复制的这份中进⾏搜索。
对搜索图进⾏剪枝
在对搜索图搜索之前,合并图中所有出度为1的内部节点合并,可以缩减图的搜索范围。这个⽅法是基于boundary arc⼤多数都是出度为1的边这⼀事实。
唐僧泡妞使⽤其他搜索算法
使⽤Bellman-Ford算法进⾏最短路径搜索,此算法在较⼩的graph中的搜索性能相⽐Dijkstra优秀,crp中分割的每个cell属于较⼩的graph,适应于Bellman-Ford算法。
Multiple-source executions
将多个source的Dijkstra算法合并成⼀个执⾏过程可以优化算法执⾏时间。
并⾏计算
难忘的一件事作文
multipe-source execution的特征符合SIMD(single instruction,multiple data)指令,利⽤SSE寄存器可以实现指令级别的并⾏运算;除此之外,我们可以把每个cell的搜索分配到不同的核上进⾏并⾏计算。
Phantom Levels
因为customization的过程在处理较⼩的图的时候性能较好,因此使⽤更多的level 可以加速customization。过多level的坏处是带来更⾼的空间复杂度,因此我们引⼊⼀个phantom level,此level只是在customization的时候使⽤,在query的时候不使⽤。
使⽤定制化的ch算法加速
ch 在进⾏contraction 之前需要确定contraction order,找到⼀个完美的contraction order是⼀个NP-hard问题,crp算法为了使contraction order 做到对所有的metric都适⽤,采⽤基于edge-difference计算contraction order。由于这个contraction order和metric相互独⽴,所以contracion order 在partition部分计算。
除此之外,为了加速contraction,crp在⼯程实现时候利⽤microinstructions加速计算。
胃痛定胶囊增量更新
在更新实时路况时,crp算法可以做到只更新对应level 的overlay graph。其他没被影响的cell的customization不⽤计算。
Query
⾸先介绍query level 的概念:对于任何⼀个node v ,query level 代表和{s,t}没有交集的最⼤level。为了加速查找query level,crp 针对每⼀个node,将表⽰node所在的level以及对应的cell num编码到⼀个64位整形中。
query level 这个概念的含义如下,对于multipel-level overlay graph 来说,越⾼level的图越稀疏,搜索效率越⾼,但是当level⾼到同时包括s,t,v三个node时,图的粒度太⼤,⽆法找到最优路径。换句话说,crp 算法加速搜索的原理是,当搜索到不包含s或者t的cell的时候,我们不需要搜索其cell内部的路径只需要使⽤customization 过程中计算的shortcut 代替即可。
Unpack Path
同ch 算法不同,crp 为了节省内存,没有存储shortcut 对应的原始路径,⽽是在还原道路时候对于每个shortcut 使⽤双向dijkstra 算法计算出最短路径。这种做法会牺牲⼀些响应时间,crp 算法利⽤⼀个lru cache在内存占⽤和响应时间之间取折中。