【图论应用】使用多路图(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

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

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

相关文章

【Python深度学习】——交叉熵|KL散度|交叉熵损失函数

【Python深度学习】——交叉熵|KL散度|交叉熵损失函数 1. 交叉熵Cross Entropy1.1 交叉熵的含义1.2 交叉熵的公式1.3 交叉熵的特点 2. KL散度2.1 KL散度的含义2.2 KL散度的公式2.3 KL散度的性质2.4 KL散度的常用场景 3. 交叉熵损失函数3.1 交叉熵损失函数的定义与公式 1. 交叉熵…

【python】flask 框架

python flask 框架 flask是一个轻量级的python后端框架 (Django, tornado, flask) 官网&#xff1a;欢迎来到 Flask 的世界 — Flask中文文档(3.0.x) 安装&#xff1a;pip install Flask -i https://pypi.douban.com 常识&#xff1a; http,默认端口号为80; https,默认端口号…

国资e学快速学习实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

1.xshell传不了文件输出0000如何解决.....2.k8s中metalLB文件内容

xshell传不了文件输出0000如何解决 centos版本 1,因为没有工具下载即可 yum -y install lrzszk8s中metalLB文件内容 2.metalLB文件内容 cat metallb-native.yaml apiVersion: v1 kind: Namespace metadata:labels:pod-security.kubernetes.io/audit: privilegedpod-securit…

OSPF LSA头部详解

LSA概述 LSA是OSPF的本质 , 对于网工来说能否完成OSPF的排错就是基于OSPF的LSDB掌握程度 . 其中1/2类LAS是负责区域内部的 类似于设备的直连路由 . 加上对端的设备信息 3 类LSA是区域间的 指的是Area0和其他Area的区域间关系 , 设计多区域的初衷就是避免大型OSPF环境LSA太多…

Go模板页面浏览器显示HTML源码问题

<!--* Title: This is a file for ……* Author: JackieZheng* Date: 2024-06-09 17:00:01* LastEditTime: 2024-06-09 17:01:12* LastEditors: Please set LastEditors* Description:* FilePath: \\GoCode\\templates\\index.html --> <!DOCTYPE html> <html …

【RAG】浅尝基于多头注意力机制思想设计的Multi-Head RAG(多头RAG)

一、动机 现有RAG设计和评估方法&#xff0c;没有方案或评估方法明确针对具有多方面性的问题。下面解释一下多方面性的问题&#xff1a; "多方面性的问题"是指那些需要理解和整合多个不同领域或主题的知识和信息才能得到完整和准确回答的问题。这类问题的特点在于它…

Characters 2 01(卡通可爱人物动画模型)

● 包裹● - 26名男子; - 29个女孩。 ● 使用地点 ● - 游戏。针对游戏引擎优化的模型; -乘法; 广告和营销; - 虚拟现实/增强现实。 ● 特点 ● - 你可以很容易地改变物体的颜色 - 使用UV贴图; - 对象逻辑位置的枢轴; - 模型具有逻辑名称。 ● 几何学● 62个独特的资产(…

Objective-C 学习笔记 | Block 对象

Objective-C 学习笔记 | Block 对象 Objective-C 学习笔记 | Block 对象编写并使用 Block 对象Block 对象的返回值匿名 Block 对象外部变量在 Block 对象中使用 self在 Block 对象中无意使用 self修改外部变量 Objective-C 学习笔记 | Block 对象 Block 对象类似于匿名函数&am…

【代码随想录训练营】【Day 49】【动态规划-8】| Leetcode 139

【代码随想录训练营】【Day 49】【动态规划-8】| Leetcode 139 需强化知识点 多重背包&#xff1a;将其展开为01背包 题目 139. 单词拆分 注意 要保证 单词构成的有序性&#xff0c;先遍历背包&#xff0c;再遍历物品回溯法 class Solution:def wordBreak(self, s: str, …

面对层出不穷的大模型产品,该怎么选呢

层出不穷的大模型产品&#xff0c;你怎么选&#xff1f; 随着近日腾讯元宝APP的正式上线&#xff0c;国内大模型产品又添一员。关于接连出现的“全能“大模型AIGC产品&#xff0c;你都用过哪些呢&#xff1f;不妨来分享一下你的使用体验吧&#xff01;在这些大模型产品中&…

xLua(一) 环境安装笔记

为了方便查阅记录一下xLua的安装地址及方法 1.登录地址下载: https://github.com/Tencent/xLua 2.解压文件 将文件中的这些内容拷贝到项目中的Asset文件夹中 注意 : 工程项目路径不得含有中文 3.将Tools复制到Asset同级目录下 4.导入后会发现有Bug,需要导入工程 5.还有另…

Java:九九乘法表,打印三角形

文章目录 九九乘法表打印三角形改进:控制行数的三角形有空格的三角形 九九乘法表 package com.zhang; /* 打印九九乘法表*/ public class Test8 {public static void main(String[] args) {//i是竖着的 j是横着的for (int i 1; i < 9; i) {for(int j 1; j < 9; j) {i…

IP协议(二)

TOC 一: 网段划分 同一个局域网的主机,要按一定的规则分配IP地址 把一个IP地址分为两部分: 前半部分 ,网络号 >用来表示局域网后半部分,主机号 > 用来区分同一个局域网中的不同主机 同一个局域网内部&#xff0c;主机之间的IP &#xff0c; 网络号相同&#xff0c;主…

JS笔记(自用)

1、js输出&#xff1a;console.log("hellowworld"); 2、变量定义&#xff1a;var&#xff0c;变量名区分大小写 3、数据类型&#xff1a; 基本数据类型&#xff1a;number&#xff08;整数浮点数&#xff0c;NaN非数&#xff0c;正负无穷大&#xff09;。boolean。…

Python 虚拟环境 + 嵌入式 + 编译pyd 部署方案

Python 虚拟环境 嵌入式 编译pyd 部署方案 开发阶段 - 直接发源码版本1. 在虚拟环境下开发 Python 项目 部署阶段1. 创建项目文件夹2. 准备嵌入器 Python 解释器3. 处理第三方库4. 修改 ._pth 文件添加 Python 运行环境5. 添加启动 bat 脚本 目录结构开发阶段 - 编译 pyd 再发…

vue-router的导入和使用

关于如何在 Vue.js 中导入和使用 vue-router 的基本例子。 首先&#xff0c;确保你已经安装了 vue-router。你可以通过 npm 或 yarn 来安装&#xff1a; npm install vue-router # 或者 yarn add vue-router 然后&#xff0c;在你的 Vue 项目中&#xff0c;你可以按照以下…

FuTalk设计周刊-Vol.039

&#x1f525;AI漫谈 热点捕手 1、AI视频生成工具大PK | Runway Gen-2、Pika、Moonvalley和W.A.L.T的文字生视频对比评测 AI届的学术大牛李飞飞最近推出了用于生成逼真视频的扩散模型W.A.L.T。效果很不错&#xff0c;不过目前还未开放公网的访问。于是我萌生了一个想法&#…

气体流量的换算

测量气体流量时&#xff0c;往往需要进行温压补偿。我们可以选择Nm:/h和m3/h作为测量单位&#xff0c;二者之间如何换算呢?在标准状态下&#xff0c;即温度为0℃℃(273.15K)和压力为1个标准大气压(101.325kPa)时&#xff0c;气体的体积被称为Nm3(标方)&#xff0c;N代表标准条…

音视频主要概念

文章目录 常用的一些概念主要概念1主要概念2I帧P帧B帧 常用视频压缩算法 小结 常用的一些概念 主要概念1 视频码率&#xff1a;kb/s&#xff0c;是指视频文件在单位时间内使用的数据流量&#xff0c;也叫码流率。码率越大&#xff0c;说明单位时间内取样率越大&#xff0c;数…