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


前言

通过模型算法,熟练对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进行代码编写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值