公交线网、地铁线网最短出行时间计算(考虑换乘耗时)

2024-02-11 07:50

本文主要是介绍公交线网、地铁线网最短出行时间计算(考虑换乘耗时),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.问题描述:

在乘坐公交或地铁时,从乘客角度出发,乘客们当然希望可以用时最短地到达目的地。出行用时不仅包括了在车时间,也包括了乘客用于换乘的时间——换乘耗时。仅将该问题视为最短路问题忽视了换乘对时间的影响,并不符合实际。因此,本文探讨在考虑换乘耗时情况下的公交、地铁线网最短出行时间、线路问题。

2.算法输入:

(1)各条线路的站点情况

(2)各站点间的用时

(3)每次换乘消耗的时间

3.算法思路:

3.1 线网重构

对线网进行重新构建,利用虚拟站点实现对换乘耗时的考虑。将换乘站点进行拆分,换乘站连接几条线路就将其拆分成几个虚拟站点,并将虚拟站点分配至对应线路上。由同一换乘站点拆分得来的虚拟站点间的用时为换乘时间。下文称重构所得线网为虚拟线网,重构后的站点称为虚拟站点,重构所得线路称为虚拟线路。

线网中的站点可以分为两类:普通站点和换乘站点

普通站点与虚拟站点一一对应,而换乘站点对应多个虚拟站点(对应数量=可换乘的线路数)

我们以一个供三条线路换乘的站点为例进行介绍,如图所示,不同颜色代表不同线路,换乘站连接了三条线路。

 如果只关注这一个站点,我们可以把三条线路“扭一下”,然后将换乘站拆开,三条线路通过虚拟线路进行连接换乘,也可以说虚拟线路是乘客在换乘过程中需要走动路,虚拟线路的长度(权重)即为换乘时间。

3.2 线网求解

利用Floyd法对虚拟线网进行求解,得到虚拟站点间最短距离和最短路径。

3.3 解码

将虚拟站点对应回原有的站点,获得原有站点间的最短距离和最短路径。由于虚拟线网的最短路是考虑换乘时间所得,因此对应回去后得到的最短距离已经考虑了换乘耗时。

4.具体代码示例

4.1定义一个Floyd法计算最短路的函数

    # 佛洛依德法计算最短路def floyd(adjacency_matrix):'''佛洛依德法计算最短路:param adjacency_matrix: 邻接矩阵:return: 最短距离矩阵,最短路径矩阵'''v_num = len(adjacency_matrix)shortest_dis_mat = [[x for x in row] for row in adjacency_matrix]  # 初始化最短路径矩阵# paths[i][j]记录了最短路径上节点i的后继节点编号paths = [[-1 if shortest_dis_mat[i][j] == math.inf else j for j in range(len(adjacency_matrix))]for i in range(len(adjacency_matrix))]for k in range(v_num):for i in range(v_num):for j in range(v_num):if shortest_dis_mat[i][j] > shortest_dis_mat[i][k] + shortest_dis_mat[k][j]:shortest_dis_mat[i][j] = shortest_dis_mat[i][k] + shortest_dis_mat[k][j]paths[i][j] = paths[i][k]return np.array(shortest_dis_mat), np.array(paths)

这篇关于公交线网、地铁线网最短出行时间计算(考虑换乘耗时)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699258

相关文章

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,