一、图的基本概念
- 图的数学语言描述
G(V(G),E(G))
。- V(vertex)指图的顶点集
- E(edge)指图的边集。
- 图的分类:根据边是否有方向,分为有向图和无向图。
- 无向图属于特殊的有向图(一个无向边可看作两个有向边)
- 边若有权值:有权图
二、作图
2.1 在线网站(节点少时使用)
- 在线做图网址
- 界面介绍:
2.2 Matlab作图(节点多时使用)
-
△注意:
- Matlab只能从1开始编号,若强制从0开始,会报错
- 该函数在2015b之后的版本才支持,如果运行出错请下载新版本Matlab。
-
具体看第八节代码文件
code_graph.m
-
制图
- 无向图:
% 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图 G1 = graph(s1, t1); plot(G1) % 函数graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图 G2 = graph(s2, t2); plot(G2, 'linewidth', 2) % 设置线的宽度 % 下面的命令是在画图后不显示坐标 set( gca, 'XTick', [], 'YTick', [] );
- 有向图:只需将
graph
改为digraph
即可。
- 无向图:
三、权重邻接矩阵
1. 无向图的权重邻接矩阵
- 结论:
- (1)无向图对应的权重邻接矩阵D是一个对称矩阵;
- (2)其主对角线上元素为0.
- (3)Dij表示第i个节点到第j个节点的权重
2. 有向图的权重邻接矩阵
- 结论:
- (1)有向图对应的权重邻接矩阵D是一般不再是对称矩阵
- (2)其主对角线上元素为0.
- (3)Dij表示第i个节点到第j个节点的权重
四、迪杰斯特拉
- 用途:求解最短路径(有向图和无向图均可处理,但实际问题中无向图更常见)
- 缺点:无法处理负权重的图
- 能处理负权重的算法:贝尔曼-福特算法
- 贝尔曼-福特算法和dj算法区别:不再将节点区分为是否已访问的状态,因为贝尔曼‐福特模型是利用循环来进行更新权重的,且每循环一次,贝尔曼福特算法都会更新所有的节点的信息。
- 贝尔曼‐福特算法实际上处理的是具有负权重的有向图。(且该有向图也不能含有负权回路)
- 缺点:贝尔曼‐福特算法不支持含有负权回路的图。(Floyd弗洛伊德算法也不可以)
4.1 负权回路
- 图中存在绕一圈权值之和为负数的回路
- 含有负权重的无向图都是负权回路,如下图中(可以在2和3之间无限循环)
- 不必太担心算法求解不出的问题:因为含有负权重的图特别少见,且一旦出现负权重,也往往是在有向图中。
4.2 Matlab计算最短路径
4.2.1 返回起点到终点的最短距离
-
代码:
[P,d] = shortestpath(G,start,end [,'Method',algorithm] )
-
注意:该函数matlab2015b之后才有
-
功能:返回图G中start节点到end节点的最短路径
-
输入参数:
扫描二维码关注公众号,回复: 17258218 查看本文章- ① G ‐ 输入图(graph 对象 | digraph 对象)
- ② start 起始的节点
- ③ end 目标的节点
- ④ [,‘Method’,algorithm]是可选的参数,表示计算最短路径的算法。一般不用手动设置,默认使用的是“auto”, 具体可设置的参数如下图。
-
输出参数:
- ① P – 最短路径经过的节点
- ② d – 最短距离
-
-
Matlab演示
- 具体代码部分见第八节代码文件
code.m
- △注意:
- Matlab中的图节点要从1开始编号,故上图中把0全部改为了9
- 编号最好是从1开始连续编号,不要随便定义编号
- 具体代码部分见第八节代码文件
-
Matlab返回起点至终点最短路径结果:
4.2.2 Matlab返回任意两点间最短路径
- 代码:
d = distances(G [,'Method',algorithm])
4.2.3 找给定范围内所有的点
- 代码:
[nodeIDs,dist] = nearest(G,s,d [,'Method',algorithm])
- 返回图形 G 中与节点 s 的距离在 d 之内的所有节点。
- nodeIDs是符合条件的节点
- Dist是这些节点与s的距离
五、课后论文作业
附言
- 参考课程可见 B站清风数模,如上仅作个人学习后笔记整理。