首页 > 编程语言 >【学习笔记】Matlab和python双语言的学习(图论最短路径)

【学习笔记】Matlab和python双语言的学习(图论最短路径)

时间:2024-08-11 17:24:37浏览次数:8  
标签:nx python 路径 学习 Matlab path 顶点 图形 节点

文章目录


前言

通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6

一、图论

图论(Graph Theory)是数学和计算机科学中的一个重要分支,专门研究图(graphs)的性质及其应用。图是一种抽象的数据结构,用于表示对象及其相互关系。

基本概念

  1. 图(Graph)
    一个图由一组顶点(或称为节点)和一组边(连接这些顶点的线)组成。形式上,一个图 ( G ) 可以表示为 ( G = (V, E) ),其中 ( V ) 是顶点集合,( E ) 是边集合。

  2. 顶点(Vertex)
    图中的一个基本单位,代表某个对象。顶点的集合通常用 ( V ) 表示。

  3. 边(Edge)
    顶点之间的连接。边的集合通常用 ( E ) 表示。边可以是有向的(directed)或无向的(undirected)。

  4. 有向图(Directed Graph or Digraph)
    边有方向的图,即边表示从一个顶点指向另一个顶点的箭头。

  5. 无向图(Undirected Graph)
    边没有方向的图,即边仅表示顶点之间的连接,没有方向性。

  6. 权重(Weight)
    在一些图中,边可以附带一个数值,称为权重(weight),表示顶点之间的距离、成本或其他度量。

  7. 路径(Path)
    从一个顶点到另一个顶点经过的一系列边和顶点。路径的长度通常表示为路径上所有边的权重之和。

示例

在这里插入图片描述

  • 求 0 到 8 的最短距离。

二、代码实现----Matlab

在MATLAB中,shortestpath 函数用于计算图中两个节点之间的最短路径。

shortestpath 函数的基本语法如下:

[P, d] = shortestpath(G, s, t)
  • G:一个图对象,通常使用 graphdigraph 函数创建。
  • s:起始节点。
  • t:目标节点。
  • P:返回的最短路径上的节点序列。
  • d:返回的最短路径的长度(或权重和)。
% 定义图的边和权重
s = [9 9 1 1 3 3 3 2 2 5 5 7 7 8]; % 起始节点编号
t = [1 2 2 3 4 6 7 4 5 4 7 6 8 6]; % 终止节点编号
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9]; % 边的权重

% 创建一个图形对象 G
G = graph(s,t,w);

% 绘制图形 G,并将边的权重添加到图形上
% G.Edges.Weight 表示图形对象 G 中所有边的权重值,'EdgeLabel' 表示在图形上显示这些权重值
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2)
% 隐藏图形的坐标轴
set( gca, 'XTick', [], 'YTick', [] );

% shortestpath 函数计算从节点 9 到节点 8 的最短路径和路径长度,并将路径和路径长度分别存储在 P 和 d 中
[P,d] = shortestpath(G, 9, 8);
% 在图形 G 中高亮显示最短路径
% highlight 函数高亮图形对象 myplot 中的路径 P,'EdgeColor', 'r' 表示将路径颜色设置为红色。
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);
highlight(myplot, P, 'EdgeColor', 'r')

运行结果:
在这里插入图片描述

三、代码实现----python

在 Python 中,可以使用 NetworkX 库和 Matplotlib 库来实现带有权重的无向图的创建和绘制。

import networkx as nx
import matplotlib.pyplot as plt

# 定义图的边和权重
edges = [(9, 1, 4), (9, 2, 8), (1, 2, 3), (1, 3, 8), 
        (3, 4, 2), (3, 6, 7), (3, 7, 4), (2, 4, 1), 
        (2, 5, 6), (5, 4, 6), (5, 7, 2), (7, 6, 14), 
        (7, 8, 10), (8, 6, 9)]

# 创建一个有加权边的图形对象 G
G = nx.Graph()  
G.add_weighted_edges_from(edges)

# 计算从节点 9 到节点 8 的最短路径和路径长度
path = nx.shortest_path(G, source=9, target=8, weight='weight')
path_length = nx.shortest_path_length(G, source=9, target=8, weight='weight')

# 绘制图形 G,并将边的权重添加到图形上
pos = nx.spring_layout(G)  # 计算节点位置
nx.draw(G, pos, with_labels=True, node_color='lightblue', edge_color='gray', node_size=500, font_size=10, width=2)
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

# 在图形 G 中高亮显示最短路径
path_edges = list(zip(path, path[1:]))
nx.draw_networkx_edges(G, pos, edgelist=path_edges, edge_color='r', width=2)

# 隐藏图形的坐标轴
plt.gca().set_xticks([])
plt.gca().set_yticks([])

# 显示结果
print('最短路径:', path)
print('最短路径长度:', path_length)

plt.show()

运行结果:
在这里插入图片描述
在这里插入图片描述

总结

本文介绍了使用图论求最短路径,并通过典型示例建立模型,分别使用Matlab和python进行代码编写。

标签:nx,python,路径,学习,Matlab,path,顶点,图形,节点
From: https://blog.csdn.net/m0_65032457/article/details/141107610

相关文章

  • 21:Python函数全局变量和局部变量
    #全局变量与局部变量,全局变量大写,局部变量小写NAME='ladfs'#定义全局变量,全局作用域顶格defchange_name():print('change_name',NAME)#调用全局变量change_name()#全局变量与局部变量NAME='ladfs'#定义全局变量defchange_name():......
  • 用电量预测 | 基于BiLSTM双向长短期记忆神经网络算法的用电量预测附matlab完整代码
    用电量预测|基于BiLSTM双向长短期记忆神经网络算法的用电量预测附matlab完整代码数据收集:收集历史用电量数据,包括时间戳和相应的用电量值。选择模型:选择合适的模型进行预测,可以根据数据特点和需求选择合适的模型。训练模型:使用历史数据训练模型,并根据评估指标来调整......
  • 【C++学习笔记 16】构造函数初始化列表
    当编写类并向其中添加成员时,通常需要某种方式对这些成员进行初始化。常见的方法,如写一个构造函数赋初值classEntity{private: std::stringm_Name;public: Entity(){ m_Name="UnKnow"; } Entity(conststd::string&name){ m_Name=name; } constst......
  • 【WSN覆盖优化】基于鱼鹰优化算法OOA求解无线传感器节点2D覆盖优化问题附Matlab代码
    鱼鹰优化算法(OspreyOptimizationAlgorithm,OOA)是一种基于鱼鹰捕鱼行为的启发式优化算法,可用于解决优化问题。在无线传感器网络(WSN)中,覆盖优化是一个关键问题,涉及到最大化网络覆盖范围并减少节点数量。以下是一个简单的示例框架,展示如何基于OOA算法求解无线传感器节点的二......
  • 系规学习第8天
    2、信息系统项目生命周期中,内容最多、最繁杂的阶段是()A、立项B、消亡C、实施D、运维[答案]D[解析]本题考察的是运维的特点,建议掌握。运维是信息系统全生命周期中的重要阶段,也是内容最多、最繁杂的部分5、运营管理指对生产和提供公司的产品和服务的系统进行设计、运......
  • 指针学习(1)(1)
    目录1.指针变量和地址1.1取地址操作符(&)1.2指针变量1.3拆解指针 1.4解引用操作符(*)1.5指针类型的大小1.6void*指针 2.const修饰指针2.1const修饰变量2.2const修饰指针变量2.2.1const在*左边2.2.2const在*右边  2.2.3const在*两侧 结论: 1.指针变量和地......
  • STM32学习记录(九):RTC
    RTC框图实时时钟(Real-timeclock:RTC)是一个独立的计时器。RTC提供一组连续运行的计数器,可以与合适的软件一起使用,以提供时钟日历功能。可以写入计数器值以设置系统的当前时间/日期。可以选择以下三种作为RTC时钟源:HSE时钟进行128分频LSE振荡器时钟LSI振荡器时钟有关时......
  • 程序员的学习方法
    很多程序员想提升自己,但不知道应该怎么做才能事半功倍。这篇文章给你答案。首先你得知道你的动机是什么?动机从总体上分为以下三类:A.为了生存。比如:想要通过面试,找到程序员的工作。想要通过面试,进入更高级别的岗位,然后有更高的收入。B.为了梦想。比如:工作中老碰到问题,对......
  • 一文搞定Ubuntu服务器深度学习环境配置(超详细包括换源)
    1.首先配置zshZsh(Zshell)是一种功能强大的命令行解释器,较Bash(BourneAgainShell)有以下优势:强大的自动补全:Zsh不仅支持命令和文件的自动补全,还支持参数、路径以及Git命令的补全,使操作更高效。灵活的定制:Zsh允许用户灵活自定义提示符,显示如时间、Git状态等信息。使用O......
  • 【Ansible 学习之旅】Ansible核心工具介绍
    系列文章Ansible介绍和架构Ansible安装和入门配置控制机器和受控机器Inventory文件介绍目录系列文章利用ansible实现管理的主要方式ansible-docansibleansible-playbookansible-vaultansible-consoleansible-galaxy利用ansible实现管理的主要方式Ad-Hoc即......