评分模型在路网通勤习惯分析中的应用——启发式搜索(2)

接上文《评分模型在路网通勤习惯分析中的应用——提出问题(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,那么如何确认最可能的路径呢?后续文章将进行说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql(MGR)和ProxySQL搭建部署-Kubernetes版本

一、Mysql(MGR) 1.1 statefulSet.yaml apiVersion: apps/v1 kind: StatefulSet metadata:labels:app: mysqlname: mysqlnamespace: yihuazt spec:replicas: 3serviceName: mysql-headlessselector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:affinity:p…

【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[3]--realloc

C语言中的realloc函数用于重新分配先前分配的内存块的大小,并可能更改其位置。然而,realloc函数的使用也存在一些陷阱与缺陷。 一、功能与常见用法 realloc 函数用于调整之前通过 malloc 或 calloc 分配的内存块的大小。它既可以增加也可以减少内存的大小,具体取决于请求的…

Lecture 17

10’s Complement Representation 主要内容: 1. 10’s 补码表示: • 10’s 补码表示法需要指定表示的数字位数(用 n 表示)。 • 表示的数字取决于 n 的位数,这会影响具体数值的解释。 2. 举例: • 如果采用 3 位补码&…

【Hackthebox 中英 Write-Up】Web Request | 分析 HTTP 请求和响应

欢迎来到我的writeup分享!我希望大家不要只关注结果或答案,而是通过耐心阅读,尝试逆向工程理解背后的运作原理。在这里,你不仅能找到解题的思路,还能学到更多与Hack The Box等平台相关的技术和技巧,期待与你…

linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置

inux USB声卡或耳机 基本配置 工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍 linux下alsa声音原件 工具使用方法,包括设备查询、声卡基本配置、录音放音等。 保证 alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视频 采集及推拉流功能的基础…

《优势谈判》——阅读笔记

投入 思想准备:一个谈判是要双赢的,至少需要让对手这么认为;进行一场谈判,需要看到对面是否真的愿意和你谈判 谈判技巧 永远不要接受首次报份;如果对方临时变更了要求,则可以通过立刻要求对方做补偿等方…

PPT画图——如何设置导致图片为600dpi

winr,输入regedit打开注册表 按路径找,HKEY_CURRENT_USER\Software\Microsoft\Office\XX.0\PowerPoint\Options(xx为版本号,16.0 or 15.0或则其他)。名称命名:ExportBitmapResolution 保存即可,…

高性能网络框架--fstack

【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 Fstack 是一个高性能的网络框架,主要用于构建高性能的网络应用程序,特别是在处理大量并发连接时。它基于 Linux 的 epoll 机制,使用了多线程和事件驱动的编程模型。以下是对 …

电商项目-数据同步解决方案(三)商品上架同步更新ES索引库

一、 需求分析和业务逻辑 主要应用技术有:Feign远程调用, 消息队列-RabbitMQ ,分布式搜索引擎-ElasticSearch,Eureka,Canal 商品上架将商品的sku列表导入或者更新索引库。 数据监控微服务需要定义canal监听器&#x…

Unity游戏环境交互系统

概述 交互功能使用同一个按钮或按钮列表,在不同情况下显示不同的内容,按下执行不同的操作。 按选项个数分类 环境交互系统可分为两种,单选项交互,一般使用射线检测;多选项交互,一般使用范围检测。第一人…

前端正在被“锈”化

jeff Atwood 在 2007 年说:"any application that can be writen in JavaScript , willeventually be written in JavaScript",翻译过来就是:“任何可以使用 JavaScript 来编写的应用,并最终也会由 JavaScript 编写”&a…

穷举vs暴搜vs深搜vs回溯vs剪枝_全排列_子集

46. 全排列 递归解决:一开始选一个数,递归进入下一层再选一个新的数,直到到最后一个数。反会上一层遍历其它数。 每次递归到叶子节点就找到了一种组合,思路有了具体怎么实现? 1.怎么记录每条路径? 定义一个…

【openGauss】正则表达式次数符号“{}“在ORACLE和openGauss中的差异

一、前言 正则作为一种常用的字符串处理方式,在各种开发语言,甚至数据库中,都有自带的正则函数。但是正则函数有很多标准,不同标准对正则表达式的解析方式不一样,本次在迁移一个ORACLE数据库到openGauss时发现了一个关…

【代码随想录|完全背包问题】

518.零钱兑换|| 题目链接:518. 零钱兑换 II - 力扣(LeetCode) 这里求的是组合数,就是不强调元素排列的顺序,211和121是同一个数那种,要先遍历物品,这样的话我算出来的每个值才是按顺序121&…

go语言的成神之路-筑基篇-gin常用功能

第一节-gin参数绑定 目录 第一节-?gin参数绑定 ShouldBind简要概述 功能: 使用场景: 可能的错误: 实例代码 效果展示 第二节-gin文件上传 选择要上传的文件 选择要上传的文件。 效果展示? 代码部分 第三节-gin请求重定向 第…

Qt 12.28 day3

作业: 1】 思维导图 2】 在登录界面的登录取消按钮进行以下设置: 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&a…

mybatis-plus 用法总结

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,旨在简化开发者的 CRUD 操作。它在 MyBatis 的基础上提供了更多的功能和便利性,如代码生成器、分页插件、性能分析插件等,使开发者能够更高效地进行数据库操作。MyBatis-P…

Rust: enum 和 i32 的区别和互换

在Rust编程语言中,enum(枚举)和i32是两种不同类型的数据结构,它们各自有不同的用途和特性。 i32 i32是一个32位的有符号整数类型。它用于存储整数值,范围从-2,147,483,648到2,147,483,647。i32是Rust中的基本数据类型…

迁移学习 详解及应用示例

简介: 迁移学习是一种机器学习技术,其核心思想是利用在一个任务上已经学到的知识(源任务:任务已经有一个训练好的模型,然后我们将这个模型的某些部分或知识迁移到一个新的但相关的“目标任务”上。)来帮助解…

【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点

etcd 是一个高可用的分布式键值存储,广泛应用于存储服务发现、配置管理等场景。为了确保集群的稳定性和可扩展性,管理成员节点的添加、删除和更新变得尤为重要。本文将指导您如何在etcd集群中处理成员管理,帮助您高效地维护集群节点。 目录 …