毕设第五周(阅读论文:The optimal sequenced route query)

来源:互联网 发布:viscosity mac 怎么用 编辑:程序博客网 时间:2024/06/05 19:17

问题引入

Optimal Sequenced Route(OSR) query是Nearest Neighbor的一个特殊类型,是说,从一个source出发,要经过依次经过给定类型的点,最后到达目的地,求最短路径。

对应到现实生活,比如,有一天你从家出发,事先的路径规划是依次经过购物中心,饭店,最后到电影院。如果沿途经过哪家购物中心、哪家饭店、哪家电影院对你来说并不重要,你只是想找到最短的总路程,那么,这就是一个OSR问题。

数学符号可以很清晰的表现这个过程。
首先,我们有一个目的地pUi(1in)代表沿途的各种类型的点集,M代表事先给定的Sequence,M的展开式写做(M1,M2,M3,...,Mm), 每一个Mi代表刚刚提到的点集的标号。事实是,我们依次经过的点集为(UM1,UM2,UM3,...,UMm),每两点间的距离定义为D(.,.),沿途选择的点,定义为Pi(1im)
最后目标函数为

L(p,R)=D(p,P1)+i=1r1D(Pi,Pi+1)

Paper中展示了解决OSR的几种算法,分别是:

  • 基于Dijkstra的算法,以及Enhanced Dijkstra’s algorithm(EDJ)
  • 向量空间里的Light optimal route discoverer(LORD)算法
  • 向量空间里的R-tree-based LORD算法
  • 矩阵空间里的progressive neighbor exploration(PNE)算法

下面将分别阐述这几种算法。
Paper中的每个算法都用到了剪枝来进行优化,用贪心法求得的路径是一个不错的剪枝标准,先记做Rg(p,M)

基于Dijkstra的算法,以及Enhanced Dijkstra’s algorithm(EDJ)

这种算法的核心思想是利用Dijkstra来求最短路径,为了能用上Dijkstra,首先需要构造有向图。有向图的构造过程十分简单:p点连UM1中的点,UM1中的每个点,连UM2中的每个点,以此类推。

这种算法有两个弊端,首先,总的边数

|E|=|UM1|+i=1m1|UMi|×|UMi+1|
需要的存储量太大。

再者,经典Dijkstra的算法复杂度为O(|E|log|V|),在OSR中,因为目的地有UMm个,因此,算法复杂度为O(|UMm||E|log|V|)

不过这种算法还有优化的空间,注意到一个事实,任何到p的距离大于Rg(p,M)的点,都不可能在最短路径上,因此在构造有向图的时候,可以忽略这些点。这就是EDJ。

向量空间里的Light optimal route discoverer(LORD)算法

LORD算法从点集UMm出发,维护一组partial sequenced routes,这些routes采用倒序的形式进行更新,即从UMm出发,不断向后扩展,直到达到起始点p。
有两个剪枝指标,TvTc,其中Tv是一个变量,在算法的迭代过程中不断更新,Tc是一个常量,代表贪心算法求得的路径长度。
在介绍算法之前,首先引入一条定理,
定理一:如果Q(p,M)=(P1,...,Pi,Pi+1,...,Pm)那么对于任何点PiM=(Mi+1,...,Mm)来说,Q(Pi,M)=(Pi+1,...,Pm)定理的证明很显然,利用的是最短路径的最优子结构性质,参考Dijkstra的证明过程即可。

由这条定理可以知道,如果我们想求从p出发的最优有序路径,我们可以依次求出从pUm中每一个点的最短路径,然后从中取一条最小的作为最终结果。事实是,这就是迭代的第一步。虽然在迭代的初始状态时,我们并不知道哪一条路径最短,不过这问题不大——把不可能的路径剪掉,剩下的都保留就好了。
假设第一次迭代以后,我们得到了若干partial routes的集合,记为S,在迭代的第二步,我们考察Um1中的每个点,首先用某个Threshold Tv筛选掉那些不可能的点。之后让通过筛选的每个点,为了方便起见,记做q,与S中的每个路径进行拼接,拼接之后的结果再用另一个ThresholdTc进行筛选。这样我们就得到了从q出发到点集Um的一系列候选路径S′′,由定理一,如果q在Q(p,M)上,那么,最短路径中,从q出发的到Um的那部分,也一定是最优的,因此,我们对于Um1中每个点p我们只需要保留S′′中最短的那一条路径即可。将这些路径集合起来,就是第二次迭代的结果——延伸后的S
第三次迭代。。。
第四次迭代。。。
。。。
第m次迭代。。。
以此类推,可以得到问题的解。
Paper中给的算法伪代码如下:
LORD算法伪代码

向量空间里的R-tree-based LORD算法

R-tree在这里用来进一步剪枝。注意到在LORD算法中,每次迭代需要对UMi中的点进行筛选,筛选的标准分别是TvTc,也就是说,只有在一定范围内的点才会被选择出来。Paper中展示了如何基于R-tree用single range来进行点的选择。

首先,筛选条件D(p,q)Tv(记为Range(Q1))确定的范围是一个圆,筛选条件D(p,q)+D(q,P1)+L(R)Tc确定的范围是一个椭圆,而每次迭代中需要依次对S中的partial sequenced route进行扩展,因此得出的query范围是一个一个椭圆的并(Union),记做Range(Q2)
用简单的数学计算可以推出Range(Q2)Range(Q1),我们只要选择Q2中的点即可。

下面说如何在算法中利用R-tree:
对于R-tree的一般应用,原理很简单——在R-tree上用一个广度优先搜索即可,在本篇Paper中,用法相似:
首先需要说明的是,因为Range(Q2)确定的范围是椭圆的并,并不是很容易确定是否与R-tree中的node intersect,所以Paper中采用了MBR(Q2)作为判断标准,不过因为MBR(Q2)不一定在Range(Q1)中,所以还需要用到Range(Q1)
在每次迭代中,首先检测R-tree中的node是否与Range(Q1)相交,如果相交,则判断是否与MBR(Q2)相交,如果仍然相交,该node进入广搜中的队列,否则剪枝。

矩阵空间里的progressive neighbor exploration(PNE)算法

在矩阵空间中,因为两点间的距离不再是欧氏距离,求两点间的最短路径的开销要变大,上述几种算法并不适用,为此Paper中提出了PNE算法。

首先算法用到了两个工具函数:

  • NN(point p, dataset Ui), 用来查找Ui中距离点p最近的那个点
  • NextNN(point p, point n, dataset Ui),用来查找Ui中除了点n之外,满足D(p,q)D(n,p)条件且距离点p最近的那个点。

PNE中解的构造是一个正向过程,即从起始点p出发,最终到达UMm。PNE算法与Dijkstra的核心思想类似,都是从源点出发,不断向外扩展。和LORD类似,算法的具体实现中,也是不断构造partial sequenced routes,然后扩展。
算法伪代码如下:
PNE伪代码

算法的精妙之处在于维护了一个最小堆,堆中的每个元素都是已经探索到的partial sequenced route,键值是route的长度;每次迭代都弹出堆顶元素PSR,并对PSR进行判断,只要PSR中的点数小于m,则说明还没有搜索到结果,需要继续搜索,在这次迭代的搜索中,只需要考察两种扩展方案(假设PSR中最后一个点是Pk):

  • 搜索Uk+1中距离Pk最近的点。搜到以后扩展路径,并加入堆中
  • PkPSR中去掉,然后在PSR尾部添加NextNN(Pk1, Pk, UMk),产生新的PSR并将其加入堆中

之后进行下一次迭代。直到堆顶元素PSR中的点数等于m
算法的正确性的证明由数学归纳法给出(只需证明所有可能的最短路径都被检测到了),对partial candidate routes的size n 进行归纳,n等于1的时候显然成立,假设PNE能够检测所有size为n的partial candidate routes,设有一个partial candidate route R=(P1,...,Pn+1)Pn+1Un+1中距离Pnk近的点),它之前的R′′=(P1,...Pn),由归纳假设,肯定能被检测到。一旦R′′到达堆顶,那么(P_1,…,P_n,P’)就会被加入堆中(PUn+1中距离Pn最近的点),之后的迭代会对可能产生partial candidate routes的,Un+1中距离Pn第二近,第三近。。。第k近的点依次进行检测。

从而由归纳法知,所有长度的partial candidate routes都会被检测到。

算法复杂度分析

之后用到的话再详细分析。

0 0
原创粉丝点击