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

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如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit