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

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

相关文章

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公式(高精度,

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

JavaScript时间戳与时间的转化常用方法

《JavaScript时间戳与时间的转化常用方法》在JavaScript中,时间戳(Timestamp)通常指Unix时间戳,即从1970年1月1日00:00:00UTC到某个时间点经过的毫秒数,下面... 目录1. 获取当前时间戳2. 时间戳 → 时间对象3. 时间戳php → 格式化字符串4. 时间字符

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti