【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题
文章目录
- 1 前言
- 2 导包+导入数据集
- 3 创建多路图,导入节点和边信息
- 3 绘制线路图
- 4 计算最短路径
1 前言
最近正在学习图神经网络,先pick up了一些最基础的图论知识并学习了一些好玩的应用。
本文启发于B站视频(BV1LY411R7HJ),其对于上海地铁站点图使用了无向图也就是nx.Graph()进行建模的(Python的NetworkX库)。但是由于上海地铁存在两个站点之间可有多条线路相通的情况(如3号线和4号线共享了“虹桥路 ”、“延安西路”、“中山公园”、“金沙江路”、“曹杨路”等多个站点),所以单纯的无向图严格来说不能充分解决该问题。
所以准确来讲,应该建立一个多路图(multigraph),即节点与节点之间应可以创建多条边。下图是多路图(左)与普通图(右)之间的区别。

在NetworkX库中,nx.Graph()的add_edges_from()方法是无法添加多条边的,文档里是这样记载的:
Notes-----Adding the same edge twice has no effect but any edge datawill be updated when each duplicate edge is added.
下面解决这个问题:
2 导包+导入数据集
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
%matplotlib inlineplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号# 上海地铁站点连接表
df = pd.read_csv('shanghai_subway.csv')
df.head()

3 创建多路图,导入节点和边信息
# 创建多路图
G = nx.MultiGraph()for idx, row in df.iterrows(): # 遍历表格的每一行,添加节点G.add_edges_from([(row['前一站'], row['后一站'])], line=row['地铁线'], time=row['时间(分钟)'])print(f'节点个数:{len(G)},连接个数:{len(G.edges)}')# 查看连接属性特征
print(G.edges(data=True))# 查看连接属性特征(multigraph)
# 最后一个维度为边的index,可能为 0,1,2...
print(G.edges[('同济大学', '四平路', 0)])# 查看两个节点之间的边
print(G['上海火车站']['中潭路'])

可以看到查看 G[‘上海火车站’][‘中潭路’] 可以看到所有连接两节点之间的边信息
3 绘制线路图
# 节点排版布局-默认弹簧布局
pos = nx.spring_layout(G, seed=123)# 设置其它可视化样式
options = {"font_size": 6,"node_size": 300,"node_color": "white","edgecolors": "black","linewidths": 1, # 节点线宽"width": 2, # edge线宽
}
plt.figure(figsize=(15,15))
nx.draw_networkx(G, pos, **options)

4 计算最短路径
下面计算昌吉东路到同济大学的最短路径
# 任意两节点之间是否存在路径
print(nx.has_path(G, source='昌吉东路', target='同济大学'))# 任意两节点之间的最短路径
print(nx.shortest_path(G, source='昌吉东路', target='同济大学', weight='time'))# 任意两节点之间的最短路径长度
print(nx.shortest_path_length(G, source='昌吉东路', target='同济大学', weight='time'))

# 指定起始站和终点站
A_station = '昌吉东路'
B_station = '同济大学'# 计算最短路径的节点序列
shortest_path = nx.shortest_path(G, source=A_station, target=B_station, weight='time')# 计算最短路径长度
shortest_path_length = nx.shortest_path_length(G, source=A_station, target=B_station, weight='time')# 找出最短路径经过的边
edges_in_path = []
for i in range(len(shortest_path) - 1):u = shortest_path[i]v = shortest_path[i + 1]# 找到具有最小权重的边min_weight = float('inf')min_edge = Nonefor key, data in G[u][v].items():if data['time'] < min_weight:min_weight = data['time']line_id = data['line'] # 地铁线编号min_edge = (u, v, line_id, data['time'])edges_in_path.append(min_edge)print(f"Shortest path from {A_station} to {B_station}: {shortest_path}")
print(f"Shortest path length from {A_station} to {B_station}: {shortest_path_length}")

print('Edges in the shortest path: ')
for i in edges_in_path:print(f"{i[0]}--->{i[1]} {i[2]}号线 {i[3]}分钟")

到此解决!
我们还可以看到这里算出的从昌吉东路到同济大学的所用时间为58分钟,但原视频是59分钟。这是因为从“上海火车站”到“宝山路”两个节点的两条边所用 time 不同:
所以如果直接使用Graph的add_edges_from方法,会把3号线的信息被覆盖成4号线,就会失去3号线那段共享路线的信息,导致路径计算出现差错。
本文代码:https://github.com/aquamarineaqua/D2L-My-Note/blob/main/Graph-Neural-Network/C5_topost.ipynb
相关文章:
【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题
文章目录 1 前言2 导包导入数据集3 创建多路图,导入节点和边信息3 绘制线路图4 计算最短路径 1 前言 最近正在学习图神经网络,先pick up了一些最基础的图论知识并学习了一些好玩的应用。 本文启发于B站视频(BV1LY411R7HJ)&#…...
RabbitMQ安装配置,封装工具类,发送消息及监听
1. Get-Started docker安装rabbitmq 拉取镜像 [rootheima ~]# docker pull rabbitmq:3.8-management 3.8-management: Pulling from library/rabbitmq 7b1a6ab2e44d: Pull complete 37f453d83d8f: Pull complete e64e769bc4fd: Pull complete c288a913222f: Pull complet…...
iOS接入Flutter
在现有的iOS项目上接入Flutter,参考链接 第一步:创建flutter项目,即 创建 Flutter module flutter create --template module my_flutter第二步:创建framework,这里选择的是B方式,即 选项 B - 在 Xcode 中…...
【ubuntu】用户添加root权限
添加root用户添加新用户并赋予权限 文件只读,无法更改 rootubuntu-server:/home/ubuntu# vi /etc/sudoers rootubuntu-server:/home/ubuntu# vi /etc/sudoers rootubuntu-server:/home/ubuntu# chmod -R 777 /etc/sudoers rootubuntu-server:/home/ubuntu# vi /et…...
设计通用灵活的LabVIEW自动测试系统
为了在不同客户案例中灵活使用不同设备(如采集卡、Modbus模块)且保持功能一致的LabVIEW自动测试系统,需要采用模块化的软件架构、配置文件管理、标准化接口和良好的升级维护策略。本文从软件架构、模块化设计、配置管理、升级维护、代码管理和…...
C# WinForm —— 35 StatusStrip 介绍
1. 简介 状态栏 StatusStrip,默认在软件的最下方,用于显示系统时间、版本、进度条、账号、角色信息、操作位置信息等 可以在状态栏中添加的控件类型有:StatusLabel、ProgressBar、DropDownButton、SplitButton 2. 属性 属性解释(Name)控…...
如何应对生活中的不确定性:仁者安仁,知者利仁。
有较高自尊水平的人,接近于孔子说的:仁者。 ——— 有着稳定的高自尊,无论外在环境如何变化,对其影响都不大,他能够愉快地生活。 相反:一个人处于低自尊状态,就会活得很痛苦,对自己…...
C#面:请解释C#接口的显式实现有什么意义
C#接口的显式实现是指在实现接口成员时,使用接口名称进行限定的方式。这种方式可以在一个类中实现多个接口,并且可以避免接口成员之间的命名冲突。显式实现接口的成员只能通过接口类型来访问,而不能通过类的实例来访问。 显式实现接口的主要…...
STM32项目分享:智能窗帘系统
目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…...
【算法-力扣】72. 编辑距离(动态规划)
目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1&#…...
Spring 系统架构图
Spring 系统架构图 Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基。 Spring Framework的发展也经历了很多版本的变更,每个版本都有相应的调整 Spring Framework的5版本目前没有最新的架构图,而最新的是4版本,…...
同三维T80005EHS-4K60 4K60 HDMI/SDI编码器
1路4K60 HDMI或12G SDI输入,2路3.5MM音频输入,对应HDMI或SDI,1个USB口和1个SD卡槽,可录像到U盘/移动硬盘/SSD硬盘/TF卡 产品简介: 同三维T80005EHS-4K60 4K60HDMI/SDI H.265编码器采用最新高效H.265高清数字视频压缩…...
React state(及组件) 的保留与重置
当在树中相同的位置渲染相同的组件时,React 会一直保留着组件的 state return (<div><Counter />{showB && <Counter />} </div> ) // 当 showB 为 false, 第二个计数器停止渲染,它的 state 完全消失了。这是因为 React…...
flask返回的数据怎么是转义后的字符串啊
Flask在返回JSON数据时,默认情况下会对特殊字符进行转义,以确保数据能安全地在HTML页面中展示,避免XSS(跨站脚本攻击)等安全问题。如果不希望Flask对JSON响应中的字符串自动转义,通常是因为你希望在前端直接使用这些数据(例如作为JavaScript的一部分),那么需要确保数据…...
C++17并行算法与HIPSTDPAR
C17 parallel algorithms and HIPSTDPAR — ROCm Blogs (amd.com) C17标准在原有的C标准库中引入了并行算法的概念。像std::transform这样的并行版本算法保持了与常规串行版本相同的签名,只是增加了一个额外的参数来指定使用的执行策略。这种灵活性使得已经使用C标准…...
【什么是几度cms,主要功能有什么】
几度CMS内容管理框架是基于 PHP 语言采用最新 Thinkphp 作为开发框架生产的网站 内容管理框架,提供“电脑网站 手机网站 多终端 APP 接口”一体化网站技术解 决方案。她拥有强大稳定底层框架,以灵活扩展为主的开发理念,二次开发方便且…...
组合和外观模式
文章目录 组合模式1.引出组合模式1.院系展示需求2.组合模式基本介绍3.组合模式原理类图4.解决的问题 2.组合模式解决院系展示1.类图2.代码实现1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法2.University.java 第一层,University 可以管理 Coll…...
设置服务器禁止和ip通信
要禁止服务器与特定 IP 地址的通信,可以使用防火墙来设置规则。在 Ubuntu 上,iptables 是一个常用的防火墙工具。以下是使用 iptables 设置禁止与特定 IP 通信的步骤: 阻止所有进出的通信 如果你想阻止服务器与特定 IP 地址的所有通信&…...
中文技术文档的写作规范(搬运)
阮一峰老师的《中文技术文档的写作规范》搬运。 链接指路: https://github.com/ruanyf/document-style-guide/tree/master 内容:对中文技术文档从标题、文本、段落、数值、标点符号、文档体系、参考链接等七大方面进行了简明扼要的介绍。...
「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(一)
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具,可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…...
从调参到调优:手把手教你用RFSoC API榨干DAC性能(插值、滤波器、数据路径全解析)
从调参到调优:手把手教你用RFSoC API榨干DAC性能(插值、滤波器、数据路径全解析) 在无线通信和雷达系统的原型开发中,RFSoC的DAC性能直接决定了整个系统的信号质量与效率。许多开发者虽然能够完成基础配置,但当面临&qu…...
ElevenLabs 2024定价突变预警(附迁移成本计算器):Voice Cloning商用授权条款升级对SaaS产品的3重合规冲击
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs定价策略分析 核心订阅层级与功能边界 ElevenLabs 当前采用三层订阅模型(Starter、Creator、Professional),各层级在语音生成时长、并发请求、自定义声音…...
深入解析 magic-cli:基于模板的自动化代码生成工具设计与实践
1. 项目概述:一个能“变魔术”的命令行工具最近在折腾一些自动化脚本和项目脚手架时,发现了一个挺有意思的开源项目,叫magic-cli。乍一看这个名字,你可能会觉得有点玄乎,命令行工具还能玩出什么“魔法”来?…...
别再用docker tag了!深入理解Containerd生态:crictl、ctr与nerdctl到底该怎么选?
深入解析Containerd生态:crictl、ctr与nerdctl的镜像管理实战指南 在容器技术快速发展的今天,越来越多的开发者正从Docker生态转向Containerd这一更轻量、更符合Kubernetes标准的运行时环境。但当我们真正开始使用Containerd时,往往会遇到一个…...
Windows热键侦探:快速定位热键冲突的终极解决方案
Windows热键侦探:快速定位热键冲突的终极解决方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾经遇…...
GD32C103RBT6 DAC 驱动库详细解析
本文基于GD32C10x 官方固件库 V1.0.0,深度解析 DAC 外设驱动库gd32c10x_dac.c,包含驱动概述、核心函数详解、可直接运行的工程例程,适合 GD32 单片机开发入门与实战。 一、DAC 外设概述 1.1 GD32C10x DAC 基本特性 双通道 12 位数字 / 模拟转换器(DAC0、DAC1) 输出电压范…...
阿里云百炼 + OpenClaw 打造超强自动化 AI
前置准备 已安装并可正常打开 OpenClaw Windows 版本 OpenClaw 部署包获取:https://xiake.yun/api/download/package/14?promoCodeIVD643FDE29AOpenClaw 顶部 Gateway 状态显示为在线准备好可正常登录的阿里云账号可正常访问阿里云百炼控制台地址确认账号已开通百…...
OpenAI 把 Codex 塞进手机端了
OpenAI 把 Codex 塞进手机端了 根据 OpenAI,TechCrunch 的最新报道和 Reddit 上的前瞻消息 —— ChatGPT Mobile,正在灰度测试 Codex 预览版。 这不止是个移动端 IDE。 从目前的用例来看,他们的核心意图是:用自然语言在移动端直接…...
企业如何保护内部数据安全,防止信息泄密?
很多企业一提数据防泄密,第一反应就是上 DLP、上加密、上审计。但真正做过项目的人都知道,事情没这么简单。数据泄露大多数时候不是发生在机房,也不是因为多高级的攻击,而是发生在员工每天最普通的操作里。客户资料发错了…...
国密SM2的P7格式签名,和PKCS#7到底有啥区别?一张图讲清楚
国密SM2的P7格式签名与PKCS#7核心差异解析:从结构到实战 在密码学应用开发中,数字签名格式的标准化是实现安全通信的基础。当开发者从国际通用的PKCS#7标准转向中国自主研发的国密SM2算法体系时,P7签名格式的差异往往成为第一个需要跨越的技术…...
