文章目录
- 前言
- 一、图论
- 基本概念
- 示例
- 二、代码实现----Matlab
- 三、代码实现----python
- 总结
前言
通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6
一、图论
图论(Graph Theory)是数学和计算机科学中的一个重要分支,专门研究图(graphs)的性质及其应用。图是一种抽象的数据结构,用于表示对象及其相互关系。
基本概念
-
图(Graph):
一个图由一组顶点(或称为节点)和一组边(连接这些顶点的线)组成。形式上,一个图 ( G ) 可以表示为 ( G = (V, E) ),其中 ( V ) 是顶点集合,( E ) 是边集合。 -
顶点(Vertex):
图中的一个基本单位,代表某个对象。顶点的集合通常用 ( V ) 表示。 -
边(Edge):
顶点之间的连接。边的集合通常用 ( E ) 表示。边可以是有向的(directed)或无向的(undirected)。 -
有向图(Directed Graph or Digraph):
边有方向的图,即边表示从一个顶点指向另一个顶点的箭头。 -
无向图(Undirected Graph):
边没有方向的图,即边仅表示顶点之间的连接,没有方向性。 -
权重(Weight):
在一些图中,边可以附带一个数值,称为权重(weight),表示顶点之间的距离、成本或其他度量。 -
路径(Path):
从一个顶点到另一个顶点经过的一系列边和顶点。路径的长度通常表示为路径上所有边的权重之和。
示例
- 求 0 到 8 的最短距离。
二、代码实现----Matlab
在MATLAB中,shortestpath
函数用于计算图中两个节点之间的最短路径。
shortestpath
函数的基本语法如下:
[P, d] = shortestpath(G, s, t)
G
:一个图对象,通常使用graph
或digraph
函数创建。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进行代码编写。