接上文《评分模型在路网通勤习惯分析中的应用——提出问题(1)》,本文内容主要针对上文提出的问题解决思路,详细讨论每一步骤中的具体处理措施。
4、问题的详细解决过程
4.1、对地图数据进行结构化
地图的本质是一种有向加权图结构,且权值会动态发生变化。对有向加权图的处理原则,是对图结构进行降维,将其变为二维矩阵或二维表(邻接表)结构——设计者结合业务情况选择的一种方便后续处理过程的结构化描述。另外,这种空间数据描述的有向加权图还有一个特点,就是A、B两点的有向连接会存在多个加权组。为什么会有多组加权组呢?主要是因为A点到B点的直接连线会有多条。如下图所示:
图中所示的主车道和辅道都可以从A点到达B点,但是两条道路的最高限速不一样、人车混用程度不一样、甚至动态的拥堵程度也不一样,所以对地图数据进行结构化时,A点到B点就应该有两组权重不一样的连接线。
(U、W两个节点有两条权重不一样的连线)
正式工作中,我们可以通过GeoServer 或类似空间服务共享、发布、编辑地图信息(包括路网信息),将其存储到PostgreSQL(PostGIS)数据库中。如果需要路网数据(结构化数据)参与流式分析过程,可以将PostgreSQL中的数据通过Fink-CDC同步(并清洗)到湖仓一体的存储方案中。
类似PostgreSQL(PostGIS)这样支持空间结构的数据库,一般会提供较丰富的图处理函数,例如求图结构上两个顶点最短距离的函数。但是本文讨论的这类可能性问题,是无法通过某个具体的函数解决的(至少都是一大段数据库脚本),所以还是建议先将路网数据结构化到某个应用或者处理框架中,再进行解决问题。
4.1.1、结构化后的空间地图数据
为了便于读者理解问题的核心处理过程,本文直接给出一种典型的邻接表结构,如下图所示:
邻接表由两类链表构成,第一类链表记录了当前地图上的所有顶点(可能是十字路口、丁字路口、匝道、隧道或高架入口,高速路出入口等),第二类链表记录了从某个顶点出发,能够直接到达的顶点信息。第二类的链表的连线记录了顶点到顶点路段情况,例如上图中,顶点D可以到达顶点B,路段状态就可以记录在连线(对象)上,包括道路等级、拥堵情况、人车分流情况等。
4.1.2、交通地图中权值要素及权重评定方式
邻接表中,顶点到顶点的连线带有权重值——既不同路段的权重值,参与权值评定的权重要素可以分为两类:
-
固定的权重值:诸如,路段级别(涉及最高车速)、车道数、路段人车分流程度、路段尽头是否有信号定、下穿路段、高架路段等。固定的权重值由于一般不会出现变化,可以作为路段的基础数据存在。
-
动态的权重值:诸如,路段拥堵程度、路段施工程度、 交通事故程度等。动态权重值一般通过外部系统临时传入或者本系统从外部系统主动获取。
无论固定权重还是动态权重,系统设计者都应该允许权重维度可以扩展。有了这些权重维度,就可以通过熵权法为路段求得一个比较科学的权重值,示例如下:
由于之前的内容已经详细讲解熵权法的计算过程和实现细节,这里就不再进行展开,如果读者需要了解细节,可以参考《利用熵权法进行数值评分计算——算法过程》。这样,我们就可以为邻接表的每一个路段标定权重值:
注意:以上给出的权重值,由于引入了动态要素,所以权重值的计算结果也会随时变化。
4.2、空间上两点/多点间行驶路径的分析方式
4.2.1、常规遍历算法的局限性
在一般的图结构上,如果图结构能够转换为一个非负权重的有向图,那么就可以通过DFS深度搜索算法或者BFS广度优先算法,在避免环状遍历的基础上,确认图上两点的多个联通路径,如下图所示:
地图空间数据的结构化表达是一张有向加权图,那么肯定就满足有向图的要求,也就肯定可以使用DFS或者BFS算法。有向图的DFS或者BFS算法,本文不会进行展开讨论,很多第三方资料上都有,也没有什么难度。我们就来说一下这个算法本身的问题:
-
难以找到最优解:由于是遍历性质的算法,所以很难在遍历开始时就找到起止点的最优解,只有在遍历完成后,才知晓所有可能性,才能从这些可能性中找出最优解。如果是一张非常庞大的地图,且这个地图上所有点都是联通的(实际情况也就是这样),那么遍历算法很可能都无法完成所有节点的遍历。
-
时间复杂度较高:由于遍历算法本质是将图结构中能联通的所有节点都遍历一次,所以就算在图中增加一个和起止点没有任何关联的新节点,遍历算法的时间复杂度也会增加。最坏情况下,DFS或者BFS的时间复杂度都会达到O(N)。这样的时间复杂度在一张大型地图的处理上是无法接受的。
-
剪枝效果不明显:剪枝效果虽然可能通过对遍历算法的细节进行优化来实现,但由于没有业务条件的配合,这些办法的优化效果很有限。
引起这些问题的原因,实际上并不是遍历算法本身导致的,而是遍历过程中没有业务特定进行后续处理的支持,所以遍历过程只能“看着来”。如果设计者能在处理问题时,给出一系列特定的业务领域特点,就非常有助于快速解决问题。这种在问题解决过程中,提供与问题相关的特定领域的特性来帮助减少搜索量的方法,称为启发式搜索。
4.2.2、利用启发信息加速找出两点间可能路径的最优解
我们来考虑这样一个问题,如果读者驾车从A点去B点,读者自己会怎么考虑规划驾驶路径。
-
首先会考虑大路而非小路,如果高速路段不会收费,那么可能会优先考虑走高速路。
-
其次如果驾驶者历史上有过从A点到B点的行驶经验,那么还会考虑经验上各条可选道路上拥堵情况。
-
另外,驾驶者会考虑各种道路上的信号灯数量,以及信号灯大致的等待时长。
-
从驾驶轨迹看,当驾车从A点去B点时,如果B点在A点的东南方向,那么驾驶轨迹一定是朝着东南方向去的,就算有一端道路向西行驶,也是出于迫不得已的情况:例如这段路只有向西行驶一段,才有路口;或者知道后续道路已经拥堵/施工,只有向反方向行驶绕开道路。
-
最后,由于卡点摄像头的数据是非常关键的数据,一旦一条道路的卡点在行驶时间段拍摄到了车辆,那么就代表遍历算法得到的结果中,一定需要包括这条道路(和道路直接连接的两个节点)。注意:这条启发信息如果反过来,则不成立:一条道路的卡口摄像头如果没有拍摄到车辆,并不代表车辆一定没有行驶过这条道路。
这些诸如道路级别、实时拥堵情况、道路长度、红绿灯数量等信息映射到结构化的地图时,都可以表现为线路的权重值,权重值越小,说明道路由于各种原因更“难走”。而行驶方向可以理解为在下一路段选择时,优先选择和目的地方向一致或大致一致的下一路段。
4.2.3、利用启发信息加速找出多点间的可能路径
以上带有启发信息的搜索算法,能显著增加图遍历过程中的剪枝效果,提高遍历性能。但是就本文需要解决的问题来说,以上算法过程还可以再进行优化:
由于卡口摄像信息时本业务的一个关键要素,一辆车在卡口被摄像就意味着这辆车在这个时间点,一定按照方向通过了这个卡口,到达了卡口前行后的第一个分叉点。所以我们设计的搜索算法需要解决的是多点间的搜索问题,而非两点间的搜索问题。
另外,如果将多点间的搜索问题简化为起到到最终终点间的搜索问题,很可能导致遍历算法出现计算时间浪费的现象。请看如下问题场景:
上图中,起点到终点的行车方向是不偏不倚的从南到北行驶,且起点的正北方也是一个权重较高的路段。如果只考虑起止两点的搜索,那么车辆可能的行驶轨迹应该直接向这个路段行驶。但是上图中,车辆被拍摄到的第一个卡口信息,却在起点的东北方向。那么,如果算法按照这样的搜索逻辑,并找到正确的路径会耗费不必要的时间。
为了解决这个问题,我们可以对上一小节对启发信息的利用,进行再优化:
-
以下一个目标节点(可能是卡口点也可能是终点)作为搜索目标,进行搜索
-
计算下一次搜索的各个可达节点和当前节点与目标连线的夹角,只有夹角不大于90,才作为下一次搜索的节点选项,其余节点作为备用选项。
-
只有当选择范围内的节点都已经搜索完成,且均不可达,才启用备用节点进行搜索。
-
将离目标节点直线距离的长短,作为动态维度,纳入到评分指标中:
4.2.4、带启发信息的搜索过程演练
现在我们将以上提到的启发性信息带入到问题解决过程,看一下带有启发性的深度搜索算法,如何进行工作。在演练前,我们先来概括总结一下,带有启发信息的路径搜索算法的整个工作过程:
-
1、确认是否到达目标点的阶段
- 如果当前搜索的节点直接连接了目标节点,或者当前节点就是目标节点,则本阶段搜索过程结束。输出遍历搜索的路段栈信息。
- 如果当前搜索的节点,(除去来源)只有一个输出节点Y,则直接压栈,后续处理过程,都已输出节点Y作为标准。
-
2、确认候选点的的阶段
- 以当前节点到目标节点做直线,只有与这条直线形成不大于90°的夹角的路段,才被作为候选路线(以及候选的下一个节点)。剩下大于90°夹角(可设定的阈值)的路段(和节点)将作为备用节点。
- 如果当前节点没有候选节点(这个没有包括两层意思,一层是没有候选节点,另一层是所有候选节点都已被遍历),则启用备选节点进行打分判定
- 对候选节点/备用节点采用熵权法机制(或满足业务场景的其它评分机制)进行权重打分,参与权重打分的可以是任意多的评价维度,但是下一节点据目标点的直线距离,一定纳入到评价维度中。
- 搜索过程将按照权重评价得分,由高到低进行搜索。
-
3、回溯阶段,回溯阶段分为两种情况:第一种情况是还没有找到任何可达路径的场景下进行的回溯:
- 断头路需要回溯,当然,这种情况在全连通图的场景下和少见。但也不是没有
- 如果当前节点和目标节点的相对方向已经发生了变化,例如起点和目标节点的相对方向是东南,而当前节点和目标节点的相对方向是东北方。且之前已经搜索过的节点,还存在候选节点或备用节点可用的情况。回溯后优先基于没有搜索过的候选节点进行评分和决策。
- 如果存在候选节点,则回溯到权重评分最高的候选节点位置;如果没有候选节点,则回溯到权重评分最高的备用节点的位置。
- 此时进行权重评分时,不能将据目标点的直线距离纳入评分维度,但需要将据目标节点的夹角,带入评分维度。
-
4、回溯的第二种情况,是已经找了至少一条可达路径,在这种情况下,增加1到2种(可设定的阈值)可能性的场景:
- 这种情况下的回溯,必须保证路径上存在候选节点
- 此时进行权重评分时,不能将据目标点的直线距离纳入评分维度,但需要将据目标节点的夹角,带入评分维度。
演练过程要解决的问题是:车辆从H驶向W,在开始行驶的“+15”分钟后,车辆被安装在Q->T方向的卡口摄像头拍摄到。最终,在车辆从H点出发后的第41分钟分钟,车辆被拍摄到到达了W节点。问题的分析结果,要求推测出车辆从H点到W点最可能的行驶轨迹。
上图示意了从H点出发,到Q点结束寻找最多两条最可能形式路径的过程。通过启发式信息,程序最中根据规则找到了H->H1->C->Q和
H->B->C->Q两条路径,接着程序将按照同样的启发式逻辑,寻找从T点出发到W点的可能路径。例如找到的路径是T->D->W以及T->Y->W,那么如何确认最可能的路径呢?后续文章将进行说明