基于时段的热点路径的特征识别与快速搜索方法\n技术领域\n[0001] 本发明涉及一种网络路径搜索的方法,尤其涉及利用历史轨迹大数据在路网中进行热点路径识别和搜索的方法。\n背景技术\n[0002] 在网络路径搜索中,最优路径通常是指从出发地到目的地的所有路径中,带权路径长度最短的一条。根据道路网络中路段权值含义的不同,最优路径查询可演化为路径长度最短、行使时间最少、收费价格最优,以及能源消耗最低等路径的计算。在较为复杂的应用中,最优路径还可以是多权值(如同时考虑行使时间和收费价格)综合考虑后的最佳结果。\n[0003] 然而,在许多应用场景中,这些基于权值最优的路径查询技术无法满足用户的出行需求。例如,人们在一个陌生的城市旅行时,往往会综合考虑诸多因素,如道路关闭与否、路况复杂程度、路面质量好坏、行车安全与否,以及沿途风景如何等等。这些条件不仅繁杂,而且随时间变化不定,很难作为具体的寻路标准。此时,选择从出发地到目的地,最常被用户使用的路径,即热点路径,是较传统寻路方法更好的选择。除了在路径推荐中的应用,热点路径也是城市规划、时空数据挖掘,以及各类位置服务等重要应用的关键技术。例如,我们可以通过检查在不同时段内,相同源点和目的地之间热点路径的相同与否,来分析人们在不同时期(如工作日和周末)的出行习惯是否发生变化,以及辅助探测异常及重大事件的发生。\n[0004] 近年来,随着位置获取技术(如Global Positioning System: GPS)的快速发展,人们开始收集并处理越来越多的有关车辆、人、动物等物体的历史运动轨迹信息。例如,从\n2007年至2012年,北京市收集车辆GPS位置记录已达1000亿条左右。海量轨迹数据的出现,为热点路径的识别与查询提供了可能。\n[0005] 简而言之,热点路径是指从源点到目的地的所有路径中,最常被使用的路径。此概念容易理解,其主要特征却很难提取。专利文献1(专利申请号201110357525.7)提出的常用路径和热点路径含义类似。具体的说,常用路径是指从源点到目的地的所有路径中,经过历史轨迹数大于某个预设值的路径。该方法的主要问题在于,由此得到的最优路径不具备后缀子路径最优的特性。该特性是指,假设路径P = v1 → v2 → … → vn是从源点v1到目的地vn的热点路径,vi (1 ≤ i ≤ n)是路网中的结点,那么P的后缀子路径vi → … → vn也应该是vi到vn的热点路径。否则,在实际导航中,用户每到一个十字路口(即vi),就需要重新查询剩下旅程的热点路径,这显然不满足实际应用的需求。其次,轨迹数据具备时空多维性,现有的大数据处理技术无法支持轨迹大数据的有效存储和快速检索。该方法并没有给出有效存储和查询轨迹大数据的解决方案。最后,受交通流量、天气情况、道路建设、异常事件等动态因素的影响,热点路径具备较强的时效性。但是该方法并不允许用户在查询时,选择感兴趣的时段,热点路径的计算是基于所有的历史轨迹完成的。由于时段的任意性和不可预知性,很多复杂的操作(如轨迹数据查询)必须在线完成,这为路径的快速查询提出了巨大挑战。\n[0006] 澳大利亚昆士兰大学的科研人员提出了另外一种定义热点路径的方法。他们设计了一个新型的热度函数,用于评估从给定源点到目的地之间每条路径的热度,并选择热度最高的路径作为热点路径。一条路径的热度值,等于该路径上所有路段到达目的地的概率值的乘积。因此,路段数越多,路径的热度值越低。这显然不利于那些途经较多交叉路口且使用频率很高的道路(如途经市区的路线)。还有,该方法找出的道路可能包含很少被使用的路段,这样的热点路径是没有实际意义的。此外,该方法也不允许用户选择感兴趣的时段,没有提出在线查询(如轨迹数据在线查询)的解决方案。\n[0007] 综上所述,热点路径的有效识别与快速搜索是一个亟待解决的问题。。\n发明内容\n[0008] 为了解决现有技术的不足, 本发明提供了一种热点路径的新型特征识别策略,一种基于时段的热点路径高效搜索方法。其目的有两点:1) 设计合理的热点路径识别机制,尽量准确的反映大众的寻径经验;2) 设计高效的轨迹数据存储与检索方法,实现对基于时段的热点路径的快速搜索。\n[0009] 为了实现上述目的,本发明提供了一套热点路径的核心识别特征。假设P = v1 → v2 → … → vn是从v1到vn的热点路径,vi (1 ≤ i ≤ n)是路网中的结点,那么P应具备如下核心特征:\n[0010] 特征一:后缀路径最优,即P的任意后缀子路径也应该是一条热点路径;\n[0011] 特征二:道路长度无关,即P的热度只和它曾被使用的次数有关,而不由其长度决定;\n[0012] 特征三:不含瓶颈路段,即P不应包含可以被避免使用的低热度路段。\n[0013] 特征一中,P的后缀子路径是指,对于P中任意结点vi,从vi到vn的子路径。该子路径应该是从vi到vn的热点路径。\n[0014] 特征二中,路径长度既指路径的实际长度,也指路径包含路段(边)的数量。另外,路径的热度是反映路径被使用次数的函数,路径被使用的越频繁,其热度越高。\n[0015] 特征三中,瓶颈路段是指从v1到vn的可以被避免使用的低热度路段。另外,路段的热度是反映为了到达目的地,该路段被使用次数的函数。路段被使用的越频繁,其热度越高。路段的热度必须基于给定的目的地vn。只有为了达到vn而选择该路段的轨迹,才对该路段的热度有贡献。\n[0016] 本发明还提供了一种基于时段的热点路径的特征识别方法。包括以下几个步骤:\n[0017] 步骤1,轨迹的标识与过滤,每条轨迹都代表一次有意义的旅行。以出租车为例,一条轨迹包含了乘客从上车到下车的运动记录。一条典型的轨迹可标识为Y = ((v1, t1), …, (vn, tn)),其中,(v1, …, vn)是路网中的一条路径,ti (1 ≤ i ≤ n)是Y到达结点vi的时间。给定用户感兴趣的时段T = [ts, te],则每条轨迹不在T时段内生成的部分将被过滤掉。具体而言,假设Y’ = ((vk, tk), …, (vh, th))是轨迹Y被T过滤后的结果(Y的子轨迹),那么:\n[0018] ·ts ≤ tk,th ≤ te;\n[0019] ·如果k > 1,则tk-1 < ts;\n[0020] ·如果h < n,则th+1 > te。\n[0021] 步骤2,路段热度的量度,具体而言,路段e的热度是指途经e到达目的地vn的轨迹数。此处每条轨迹均已被T过滤。注意目的地不一定是轨迹的终点,只要轨迹在到达目的地之前经过了e即可。\n[0022] 步骤3,路径热度的矢量标示,即采用矢量来标示从出发地到目的地的路径的热度。具体而言,路径P的热度F(P) = (f1, f2, …, fk)就是将P(包含k个路段)中所有路段的热度由低到高排序后生成的序列。其中fi (1 ≤ i ≤ k)就是热度排在倒数第i名的路段的热度。\n[0023] 步骤4,路径热度的排名,该排名基于一种新型的热度关系运算。给定两条路径P和P’及它们的热度F(P) = (f1, f2, …, fm)和F(P’) = (f1’, f2’, …, fn’),如果以下任意两个条件满足一个,我们认为P的热度不小于P’。如果F(P)和F(P’)的值不同,我们说P的热度大于P’:\n[0024] 条件1:F(P)是F(P’)的前缀;\n[0025] 条件2:存在q属于集合{1, …, min(m,n)},使得:1) 对于集合{1, …, q-1}中的任意元素i,均有fi = fi’,2) fq > fq’。\n[0026] 使用该关系运算,可对路径的热度进行全排序,排在第一的即是热点路径。注意可能有多条路径的热度都是最高的,这时选择其中任意一条即可。\n[0027] 本发明还提供了一种轨迹数据索引机制CFMI(Containment-Based Footmark Index),用于检索在规定时段T内到达某结点vd的所有历史轨迹,并截取它们到达vd前,且在T内的部分。利用该索引可以计算路段的热度,但该索引的功能具备通用性,并不受限于热点路径查询。该索引机制的特征是能过滤所有不在T内到达vd的轨迹。由于每读取一条轨迹,就会产生一次磁盘随机读取的开销,为了减少I/O操作,该索引机制的基本思想是只从磁盘读取主导轨迹,并通过记录其他轨迹在主导轨迹中的起始位置,还原其他(满足查询条件的)轨迹的行走路线。假设轨迹Y途经结点vi,用Y(*,vi)标示轨迹Y到达vi之前(包括vi)的子轨迹,用Path(Y(*,vi))标示Y(*,vi)经过的路径。对于其他任意一条途经vi的轨迹Y’,如果要么Path(Y(*,vi))和Path(Y’(*,vi))相同,要么Path(Y(*,vi))不是Path(Y’(*,vi))的后缀,我们称Y为结点vi的主导轨迹。通过对真实轨迹大数据的分析与研究,我们发现到目的地(尤其是城市中的热点)的轨迹数量远远大于到该地的主导轨迹数量。如果轨迹Y’’通过vi,且Path(Y’’(*,vi))是Path(Y(*,vi))的后缀(换句话说,Y’’到达vi的路线被Y到达vi的路线覆盖),那么我们称Y是Y’’关于结点vi的主导轨迹,我们可以通过只读取Y来还原Y’’。这样做的依据,是因为时段T(如几天、几个星期、几个月)往往远远大于一条轨迹的时间(如几十分钟、几个小时。我们认为一条轨迹是一次有意义的出行,例如出租车从上客到下客的轨迹)。因此对于大部分轨迹,只要它们到达目的地的时间在T内,其起始时间自然也包含在T内。我们只对极少数其时间跨越T边界的轨迹做单独的读取。\n[0028] 在索引CFMI中,我们为路网中的每个结点vi创建一棵B+树BTvi。BTvi索引了轨迹到达vi的时间,并存放了该轨迹的轨迹号。每个BTvi的叶结点包含五个域:\n[0029] \n[0030] 其中tid是轨迹的唯一标示;tstart是轨迹tid的起始时间;tarrive是轨迹到达vi的时间;did是轨迹tid所属主导轨迹的tid号;sloc是轨迹tid在轨迹did中的起始位置。\n其次,我们为每个BTvi维护了一张表vi-Dom,表中记录了顶点vi的每条主导轨迹在到达vi之前经过的顶点个数。另外,我们维护了一张表格Table,用于将每个结点映射到其对应的B+树上。\n[0031] 本发明还提供了一种基于时段的热点路径的快速查询方法。给定道路网络G=(V, E),出发地vs,目的地vd,感兴趣时段T,该方法包括两个步骤:1) 生成基于(vd, T)的热度图Gf=(Vf, Ef)。Gf是G的带权子图,Vf包含了在时间T内,为了到达vd,历史轨迹所经过的顶点集合。Ef热度不为零的边(路段)的集合。2) 查找热点路径,即在Gf中查询从vs到vd的热点路径。如果vs不在Gf中,或者Gf为空,则返回空值,说明从vs到vd没有热点路径存在;否则返回查找结果。\n[0032] 所述生成热度图Gf的具体实现步骤如下:\n[0033] 步骤1,用邻接矩阵FG表示基于(vs, vd, T)的热度图Gf,FG中所有元素初始化为\n0;\n[0034] 步骤2,查找索引CFMI并返回两个集合:轨迹记录集合TR和主导轨迹记录集合DOM。其中,集合TR存放了所有经过(vd, T)过滤后子轨迹不为空(即该轨迹经过了vd,并且在到达vd之前有一段时间在T内)的轨迹信息,包括(tid, tstart, did, sloc),注意tid是轨迹的唯一标示;集合DOM存放了集合TR中所有轨迹的主导轨迹的信息,包括(did, len),其中did是主导轨迹的唯一标示,len是主导轨迹到达vd时已经经过的结点数(包括vd);\n[0035] 步骤3,初始化一个包含数组的集合DA为空,对于DOM中的每条记录(did, len),创建一个长度为len的数组DA.did,并初始化其所有元素为0。然后将数据DA.did并入集合DA中;\n[0036] 步骤4,对于TR中的每条记录(tid, tstart, did, sloc),检查tstart是否在时段T内,如果不在,则按照轨迹不在T中的方式修改热度图矩阵FG;如果在,将数组DA.did的第sloc个元素的值加1;\n[0037] 步骤5,按照轨迹在T中的方式修改热度图矩阵FG;\n[0038] 步骤6,返回热度图矩阵FG,其中FG[i, j]表示路网中从vi到vj有路段相连,热度为FG[i, j]。热度图Gf则包含了所有热度不为0的路段,以及它们相连接的结点。注意如果路网G中与结点v相连的所有路段的热度均为0,则v不会出现在热度图Gf中。\n[0039] 在生成热度图的步骤2中,查找索引CFMI的具体步骤如下:\n[0040] 1)初始状态,集合TR和集合DOM均为空;\n[0041] 2)在表格Table中找到B+树BTvd根结点的存放位置;\n[0042] 3)从BTvd根结点出发,找到在叶结点中,大于时段T=[ts, te]中ts的最小tarrive所在的元素(tid, tstart, tarrive, did, sloc),将元素(tid, tstart, did, sloc)插入集合TR,并在表vi-Dom中找到轨迹did对应的值(到达vd经过的结点数)len,如果(did, len)不在集合DOM中存在,则插入;\n[0043] 4)沿着BTvd树中叶结点之间的指针,从元素(tid, tstart, tarrive, did, sloc)出发,按tstart增大的顺序,向右逐个取出下一个元素(tid’, t’start, t’arrive, did’, sloc’),如果t’arrive在T内,则重复步骤3)中的操作。\n[0044] 在生成热度图的步骤4中,如果轨迹tid的出发时间tstart不在时段T内,修改热度图矩阵FG的具体步骤为:\n[0045] 1)从磁盘读取轨迹tid,取出轨迹tid的第一个元素(vid1, t1);\n[0046] 2)如果t1不在T内,则继续取其后继元素,直到取出第一个到达时间在T内的元素(vidi, ti);\n[0047] 3)取出元素(vidi, ti)的下一个元素元素(vidi+1, ti+1)(注意该元素是一定存在的,因为索引CFMI只会返回有关(vd, T)子轨迹不为空的轨迹),并将矩阵元素FG[vidi][vidi+1]的值加1;\n[0048] 4)重复3),直到取到目的地vd所在的元素为止。这样,轨迹tid中从(vidi, ti)到(vd, tvd)的每个路段的热度都在FG被加1。\n[0049] 在生成热度图的步骤5中,如果轨迹tid的出发时间tstart在时段T内,修改热度图矩阵FG的具体步骤为:\n[0050] 1)将数组DA.did的第sloc个元素的值加1;\n[0051] 2)对于集合DOM中的每一个元素(did, len),做如下操作:\n[0052] a)从磁盘中取出主导轨迹did,并取出轨迹did经过的第一个结点vid1;\n[0053] b)初始化两个变量k = 1,w = 0;\n[0054] c)如果vid1不是vd,则取出轨迹tid的经过的下一个结点vid2;\n[0055] d)如果DA.did[k]不为0或者w不为0,则将w的值增加DA.did[k],并将FG[vid1][vid2]的值增加w;\n[0056] e)将k的值加1;\n[0057] f)重复c),直到取出目的地结点vd为止。\n[0058] 所述查找热点路径操作的输入为出发点vs和基于(vd, T)的热度图Gf,具体步骤如下:\n[0059] 步骤1,如果热度图Gf为空,说明没有轨迹在时段T内到达过vd,返回从vs到vd的热点路径为空;\n[0060] 步骤2,将热度图Gf调入内存。如果出发地vs不在Gf中,说明没有轨迹曾经从vs到vd,返回热点路径为空;否则,继续执行以下步骤。\n[0061] 步骤3,用F*(vs, i)表示在最多允许i条边的前提下,从vs到vd的热点路径。对于Gf中的每个结点u,用u.£表示到目前为止找到的F*(u, i)的热度,用u.suc表示F*(u, i)中结点u的直接后继结点。初始状态下,如果u不等于vd,设置u.£ = #(说明热点路径不存在),u.suc = null;否则设置u.£为空Ø(说明u到u的热点路径不包含任何路段)。\n这意味着除非u就是vd,否则从u到vd包含0条边的热点路径是不存在的。\n[0062] 步骤4,对Gf中的每条边(u, v),用w(u, v)表示(u, v)的热度,并做如下操作:\n如果(w(u, v) ‖ v.£) > u.£,说明F*(u, i)的热度,没有从u经过边(u, v),再经过F*(v, i)的路径的热度高,因此需要修改F*(u, i),令\n[0063] u.£ = w(u, v) ‖ v.£;\n[0064] u.suc = v;\n[0065] 步骤5,重复步骤4总共|Vf| - 1次,|Vf|是热度图Gf中顶点的总数;\n[0066] 步骤6,从vs出发,沿着suc指针到vd的路径,即是vs到vd的热点路径。\n[0067] 在查找热点路径的步骤4中,有两种路径的热度:一种是空路径的热度Ø,一种是不存在路径的热度#。在所有的路径热度中,Ø的热度是最高的,#的热度是最低的。\n[0068] 在查找热点路径的步骤4中,操作“‖”的定义如下:\n[0069] 1)如果两个输入均是由正整数组成的非递减序列,“‖”将这两个序列合并成一个非递减序列。例如:(20) ‖ (5, 20) = (5, 20, 20);\n[0070] 2)如果其中一个输入为空序列Ø,那么另一个输入将作为结果返回。如果两个输入都是空序列Ø,则Ø作为结果返回。例如:Ø ‖ (5, 20) = (5, 20);\n[0071] 3)如果其中一个输入为#,则返回#。例如:# + (5, 20) = #。\n[0072] 与现有技术相比,本发明具有如下优点:\n[0073] 1)本发明提出了一种新的路径搜索方法:基于时段的热点路径搜索。本发明允许用户在查找热点路径时,选择感兴趣的时段。这非常符合热点路径随时间动态变化的特性。\n不仅能为地图导航提供能精确的结果;也能通过分析和比较不同时段热点路径的变化,为城市规划、时空数据挖掘等复杂应用提供核心技术支持;\n[0074] 2)本发明设计了一种基于时段的热点路径识别方法。利用该方法找到的热点路径,满足后缀子路径最优、与路径长度无关、不含瓶颈路段等良好的特性,符合人们对热点路径的直观理解,能更好的反映过去人们的寻径经验;\n[0075] 3)本发明设计了一种简单、高效的轨迹数据索引机制,不仅能过滤所有与结果无关的轨迹数据,还能通过仅读取主导轨迹的方式,还原主导轨迹及其包含在内的其他大量轨迹,能有效的减少磁盘的随机读取次数,具有很好的可扩展性,其空间占用也很低。其次,该索引也具备很好的通用性,可加快“在指定时段内到达任意指定地点的轨迹”的查询、分割与获取,并不局限于热点路径的搜索;\n[0076] 4)本发明设计了一种简单、高效的热点路径搜索算法。能提供快速的热点路径在线查询。利用一千多万条上海市历史出租车数据,在单台服务器上运行该方法,在最坏情况下(即到达的目的地为热点,有很多轨迹经过;时间为整个历史时间),热点路径的查找时间不超过1分钟。因此该发明非常适合基于历史轨迹大数据的热点路径查询。\n附图说明\n[0077] 下面结合附图和实施例对本发明进一步说明。\n[0078] 图1是本发明的第一个实施例的热点路径特征识别流程图。\n[0079] 图2是本发明的第一个实施例的轨迹过滤方法示意图。\n[0080] 图3是本发明的第一个实施例的路径热度关系比较流程图。\n[0081] 图4是本发明的第二个实施例的主导轨迹结构示意图。\n[0082] 图5是本发明的第二个实施例的索引CFMI逻辑结构图。\n[0083] 图6是本发明的第三个实施例的热度图创建流程图。\n[0084] 图7是本发明的第三个实施例在CFMI中的查找流程图\n[0085] 图8是本发明的第三个实施例中轨迹出发时间不在T内的处理流程图\n[0086] 图9是本发明的第三个实施例中轨迹出发时间在T内的处理流程图\n[0087] 图10是本发明的第四个实施例的热点路径在热度图上的搜索流程图。\n具体实施方式\n[0088] 以下结合附图,详细说明本发明的热点路径识别方法与快速搜索机制的实施方式。所列附图仅供说明用,不是对本发明的限制。\n[0089] 实施例一\n[0090] 本发明实施例提供热点路径的一种特征识别方法,如图1所示。输入参数包括:道路网络G,历史轨迹集合,出发地vs,目的地vd,和感兴趣的时段T。具体包括如下步骤:\n[0091] a1.对于每条历史轨迹,只保留其在到达目的地vd之前(包括vd),且在T内的部分。\n[0092] a2.计算每条路段的热度为经过该路段到达vd的(过滤后)历史轨迹数;\n[0093] a3.对于每条从vs到vd的路径,计算其热度为其所经路段的热度的非递减排列;\n[0094] a4.将所有从vs到vd的路径按照它们的热度进行全排序,热度最高的就是时段T内,从vs到vd的热点路径。\n[0095] 历史轨迹根据(vd, T)过滤的方法如图2所示。一条典型的轨迹可标识为Y=((v1, t1), …, (vn, tn)),其中,(v1, …, vn)是路网中的一条路径,ti(1≤i≤n)是Y到达结点vi的时间。给定用户感兴趣的时段T=[ts, te],则每条轨迹不在T时段内生成的部分将被过滤掉。具体而言,假设Y’=((vk, tk), …, (vh, th))是轨迹Y被T过滤后的结果(Y的子轨迹),那么:\n[0096] ·ts ≤ tk,th ≤ te;\n[0097] ·如果k > 1,则tk-1 < ts;\n[0098] ·如果h < n,则th+1 > te。\n[0099] 进一步地,我们只保存Y’中到达vd(包括vd)之前的部分。如果Y’不经过vd,则过滤后Y’为空。注意,由于我们假设每条轨迹都是一次有意义的旅行,因此我们有理由认为每条轨迹不会重复经过同一个地点(结点),所以我们不考虑到达目的地后的轨迹部分。具体的,图2中有6条轨迹Y1到Y6。它们过滤后的结果分别为:\n[0100] ·Y1所经过的路径为(v1→v2→v7→vd→v5),由于v1不在T内,v5在vd之后,因此过滤后的结果为(v2→v7→vd);\n[0101] ·Y2所经过的路径为(v1→v2→v7→vd),且整个Y2都在T内,所以Y2在过滤后保持不变。Y3和Y4的情况和Y2一样,过滤后整个轨迹也保持不变;\n[0102] ·Y5所经过的路径为(v1→v2→v6→vd),但是v1不在T内,因此过滤后的结果为(v2→v6→vd);\n[0103] ·Y6所经过的路径为(v7→v6→v5),虽然整个Y6都在T内,但是由于Y6不经过vd,所以过滤后的结果为空。\n[0104] 路径热度的比较方法如图3所示,考虑路径P1和P2的热度:\n[0105] F(P1) = (f11, f12, …, f1n)\n[0106] F(P2) = (f21, f22, …, f1m)\n[0107] 基于本发明提供的热度关系运算的比较过程具体如下:\n[0108] b1.初始化计数器i等于1;\n[0109] b2.如果i ≤ min(m, n),转步骤b3,否则转步骤b5;\n[0110] b3.如果f1i = f2i,将i加1,并转步骤b2,否则转步骤b4;\n[0111] b4.如果f1i < f2i,则输出F(P1) < F(P2),及P1的热度低于P2,否则转步骤b5;\n[0112] b5.输出F(P1) ≥ F(P2),即P1的热度不低于P2。\n[0113] 实施例二\n[0114] 本发明实施例提供了索引CFMI的基本原理和逻辑结构。CFMI的基本原理是通过读取少量的主导轨迹来恢复大量的轨迹,如图4所示。假设轨迹Y途经结点vi,用Y(*,vi)标示轨迹Y到达vi之前(包括vi)的子轨迹,用Path(Y(*,vi))标示Y(*,vi)经过的路径。对于其他任意一条途经vi的轨迹Y’,如果要么Path(Y(*,vi))和Path(Y’(*,vi))相同,要么Path(Y(*,vi))不是Path(Y’(*,vi))的后缀,我们称Y为结点vi的主导轨迹。在图4中,vi为道路网中的黑色结点。一共有六条轨迹(Y1至Y6)到达该结点。注意轨迹Y2和Y3所经过的路径被包含在轨迹Y1中,轨迹Y4和Y5所经过的路径被包含在轨迹Y6中,并且Y1和Y6在到达黑色结点之前所经过的路径,不被任何其他轨迹所经路径包含,因此Y1和Y6是黑色结点的主导轨迹。\n[0115] 图5描述了CFMI的逻辑结构。在索引CFMI中,我们为路网中的每个结点vi创建一棵B+树BTvi。BTvi索引了轨迹到达vi的时间,并存放了该轨迹的轨迹号。每个BTvi的叶结点包含五个域:\n[0116] \n[0117] 其中tid是轨迹的唯一标示;tstart是轨迹tid的起始时间;tarrive是轨迹到达vi的时间;did是轨迹tid所属主导轨迹的tid号;sloc是轨迹tid在轨迹did中的起始位置。\n其次,我们为每个BTvi维护了一张表vi-Dom,表中记录了顶点vi的每条主导轨迹在到达vi之前经过的顶点个数。另外,我们维护了一张表格Table,用于将每个结点映射到其对应的B+树上。\n[0118] 图5的左上角是一个路网示例。我们标示出了八个结点(v1至v8)。通过该路网的历史轨迹共有4条,具体如下:\n[0119] ·Y1到达v2前的部分为:((v6, tY1-v6), (v7, tY1-v7), (v3, tY1-v3), (v4, tY1-v4), (v2, tY1-v2));\n[0120] ·Y2到达v1前的部分为:((v3, tY2-v3), (v4, tY2-v4), (v2, tY2-v2), (v5, tY2-v5), (v1, tY2-v1));\n[0121] ·Y3到达v1前的部分为:((v5, tY3-v5), (v1, tY3-v1));\n[0122] ·Y4到达v1前的部分为:((v8, tY4-v8), (v1, tY4-v1));\n[0123] 其中,tYi-vj表示轨迹Yi到达结点vj的时间,并且:\n[0124] tY1-v2 < tY2-v2 < tY4-v1 < tY2-v1 < tY3-v1\n[0125] 以BTv1为例,其叶结点部分索引了Y2,Y3和Y4到达结点v1的时间,并按照到达时间对它们进行了非递减排列,由于tY4-v1 < tY2-v1 < tY3-v1,因此结点(Y4, tY4-v8, tY4-v1, Y4, \n1)排在最左边,其次是结点(Y2, tY2-v3, tY2-v1, Y2, 1),最右边的是结点(Y3, tY3-v5, tY3-v1, Y2, 1)。以结点(Y4, tY4-v8, tY4-v1, Y4, 1)为例,轨迹tid = Y4,tstart = tY4-v8说明Y4的起始时间是经过v8的时间,tarrive = tY4-v1标示了Y4到达v1的时间,did = Y4说明包含Y4的主导轨迹就是Y4自己,sloc = 1说明Y4在其所属主导轨迹中的起始位置为1,即Y4所属的主导轨迹即是Y4自己。注意Y3所属的主导轨迹是Y2,因为它在到达v1前做经过的路径包含在Y2内。另外,表v1-Dom包含了两条记录,说明到达v1的主导轨迹有两条,即Y2和Y4。以Y2为例,它在到达v1之前所经过的结点数为5,即v3,v4,v2,v5和v1。\n[0126] 实施例三\n[0127] 本发明实施例提供了热度图的创建方法与流程,如图6所示。输入道路网络G(V, E),目的地vd以及感兴趣的时段T,热度图Gf创建的具体步骤如下:\n[0128] c1.用邻接矩阵FG表示基于(vs, vd, T)的热度图Gf,FG中所有元素初始化为0;\n[0129] c2.查找索引CFMI并返回两个集合:轨迹记录集合TR和主导轨迹记录集合DOM。\n其中,集合TR存放了所有经过(vd, T)过滤后不为空(即该轨迹在T内经过了vd)的轨迹信息,包括(tid, tstart, did, sloc),注意tid是轨迹的唯一标示;集合DOM存放了集合TR中所有轨迹的主导轨迹的信息,包括(did, len),其中did是主导轨迹的唯一标示,len是主导轨迹到达vd时已经经过的结点数(包括vd);\n[0130] c3.创建一个包含数组的集合DA,DA中的每个元素为一个数组DA.did,对应DOM中的一条记录(did, len)。DA.did的长度为len,初始状态下,DA.did的所有元素均为0;\n[0131] c4.判断集合TR是否为空,如果是,则转步骤c8,否则转步骤c5;\n[0132] c5.取出TR的一个元素(tid, tstart, did, sloc),并判断tstart是否在时段T内。\n如果在,转步骤c6,否则转步骤c7;\n[0133] c6.将数组元素DA.did[sloc]的值加1,转步骤c4;\n[0134] c7.按照tstart不在时段T内的方式修改邻接矩阵FG,转步骤c4;\n[0135] c8.按照tstart在时段T内的方式修改邻接矩阵FG;\n[0136] c9.输出邻接矩阵FG,其中FG[i, j]表示路网中从vi到vj有路段相连,热度为FG[i, j]。\n[0137] 热度图Gf包含了所有热度不为0的路段,以及它们相连接的结点。注意如果路网G中与结点v相连的所有路段的热度均为0,则v不会出现在热度图Gf中。\n[0138] 图7给出了步骤c2中在索引CFMI查找的流程,给定输入vd和T=[ts, te],具体步骤如下:\n[0139] d1.初始化集合TR和集合DOM均为空;\n[0140] d2.在表格Table中找到B+树BTvd根结点的存放位置;\n[0141] d3.从BTvd根结点出发,找到在叶结点中,大于ts的最小tarrive所在的元素(tid, tstart, tarrive, did, sloc);\n[0142] d4.将其中的(tid, tstart, did, sloc)插入集合TR,并在表vi-Dom中查找轨迹did及其对应的值(到达vd经过的结点数)len,如果(did, len)不在集合DOM中存在,则插入;\n[0143] d5.沿着BTvd树中叶结点之间的指针,取出(tid, tstart, tarrive, did, sloc)的下一个结点;\n[0144] d6.如果该结点存在且tstart在T内,转步骤d4,否则转步骤d7;\n[0145] d7.输出集合TR和集合DOM。\n[0146] 图9给出了步骤c7中轨迹出发时间tstart不在T内时,修改邻接矩阵FG的流程。\n输入元素(tid, tstart, did, sloc),时段T和FG,具体步骤如下:\n[0147] e1.从磁盘读取轨迹tid,取出轨迹tid的第一个元素(vid1, t1);\n[0148] e2.如果t1不在T内,则继续读取下一个元素(vidi, ti),直到ti在T内为止;\n[0149] e3.如果vidi =vd,则转步骤e6,否则转步骤e4;\n[0150] e4.取出元素(vidi, ti)的下一个元素元素(vidi+1, ti+1);\n[0151] e5.并将矩阵元素FG[vidi][vidi+1]的值加1,并转步骤e3;\n[0152] e6.输出邻接矩阵FG。\n[0153] 图8给出了步骤c8中轨迹出发时间tstart在T内时,修改邻接矩阵FG的流程。输入集合DOM和FG,具体步骤如下:\n[0154] f1.初始化变量k = 1,w = 0;\n[0155] f2.取出集合DOM的下一个元素(did, len);\n[0156] f3.如果该元素(did, len)不存在,则转步骤f11;否则转步骤f4;\n[0157] f4.从磁盘中取出did对应的主导轨迹,并取出轨迹did经过的第一个结点vid1;\n[0158] f5.如果vid1是vd,则转步骤f2;否则转步骤f6;\n[0159] f6.取出轨迹tid的经过的下一个结点vid2;\n[0160] f7.如果DA.did[k]不为0或者w不为0,则转步骤f8,否则转步骤f10;\n[0161] f8.将w的值增加DA.did[k];\n[0162] f9.并将FG[vid1][vid2]的值增加w;\n[0163] f10.将k的值加1,并将vid2的值赋给vid1,并转步骤f5;\n[0164] f11.输出邻接矩阵FG。\n[0165] 实施例四\n[0166] 本发明实施例提供了热点路径在热度图上的搜索流程,如图10所示。输入为出发点vs和基于(vd, T)的热度图Gf = (Vf, Ef),具体步骤如下:\n[0167] g1.如果Gf为空,说明没有轨迹在时段T内到达过vd,操作结束;否则转步骤g2;\n[0168] g2.将热度图Gf调入内存,如果出发地vs不在Gf中,说明没有轨迹曾经从vs到vd,热点路径为空,操作结束,否则转步骤g3;\n[0169] g3.用F*(vs, i)表示在最多允许i条边的前提下,从vs到vd的热点路径。对于Gf中的每个结点u,用u.£表示到目前为止找到的F*(u, i)的热度,用u.suc表示F*(u, i)中结点u的直接后继结点。初始状态下,如果u不等于vd,设置u.£ = #(说明热点路径不存在),u.suc = null;否则设置u.£为空Ø(说明u到u的热点路径不包含任何路段)。这意味着除非u就是vd,否则从u到vd包含0条边的热点路径是不存在的;\n[0170] g4.初始化计数器i为0;\n[0171] g5.将i的值加1。如果i的值已经大于大于Gf的总结点数|Vf|,则操作结束;否则转步骤g6;\n[0172] g6.初始化计数器j为0;\n[0173] g7.将j的值加1,如果j的值大于Gf的总边数|Ef|,则转步骤g5;否则转步骤g8;\n[0174] g8.取出Gf的第j条边(u, v),用w(u, v)表示(u, v)的热度;\n[0175] g9.如果(w(u, v) ‖ v.£) > u.£,说明F*(u, i)的热度,没有从u经过边(u, v),再经过F*(v, i)的路径的热度高,因此需要修改F*(u, i),令u.£ = w(u, v) ‖ v.£,u.suc = v,然后转步骤g7;否则直接转步骤g7。\n[0176] 从vs出发,沿着suc指针到vd的路径,即是vs到vd的热点路径。\n[0177] 在查找热点路径的步骤g3中,有两种路径的热度:一种是空路径的热度Ø,一种是不存在路径的热度#。在所有的路径热度中,Ø的热度是最高的,#的热度是最低的。\n[0178] 在查找热点路径的步骤g9中,操作“‖”的定义如下:\n[0179] 1)如果两个输入均是由正整数组成的非递减序列,“‖”将这两个序列合并成一个非递减序列;\n[0180] 2)如果其中一个输入为空序列Ø,那么另一个输入将作为结果返回。如果两个输入都是空序列Ø,则Ø作为结果返回;\n[0181] 如果其中一个输入为#,则返回#。