目录
前言
本文将讲解如何使用matlab中的函数实现最短路径算法,所提供代码仅供参考,严禁用于数模比赛中使用!
一、图论是什么?
在学习最短路径算法前,我们先了解一个基本概念------【图论】
1.基本概念
图论 ( Graph Theory )是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形 ,这种图形通常用来描述某些事物之间的某种特定关系 ,用点代表
事物 ,用连接两点的线表示相应两个事物间具有这种关系。
-
在图论中,每个节点称为顶点,如图中的1,2,3···; 连线称为边,边上标出的数字为边的权重(权重和线段的长度无关)。这里的图是我们从实际问题中抽象出来的模型,图上画的直线是为了简化问题,如果是表示两点间的道路的话,实际上可能是弯曲的
-
顶点我们常用点集V表示,边用边集E表示,权重(点i和点j之间)---wij,图用顶点和边的集合G=(V,E)表示
-
图中的边如果是单向箭头,表示有方向,构成的图称为有向图,如示例中的城市路线,是有方向的
-
如果图里的边没有箭头,只有线,表示双向,构成的图称为无向图,比如通信光缆之类
-
注意:权重不仅可以表示长度之类的,也可以表示时间、费用等概念
2.表达形式
我们通常使用邻接矩阵来表示顶点间的关系
邻接矩阵𝑊中第𝑖行第𝑗列的元素𝑤𝑖j :元素的下标表示顶点i--->j之间的关系,大小表示这两个点之间连线的权重。
二、使用matlab作图
1.作无向图
利用graph函数
Matlab
%%matlab作无向图
clear,clc
%(1)无权重,(每条边的权重默认为1)
%函数graph(s,t);可在s和t中的对应节点之间创建边,并且生成一个图
%s 和 t都必须具有相同的元素数:这些节点必须都是从1开始的正整数,或都是字符串元胞数组
%编号最后从1开始,不要瞎编
s1=[1,2,3,4];
t1 = [2,3,1,1];
G1 = graph(s1,t1);
plot(G1)
% 下面的命令是在画图后不显示坐标
set(gca,'XTick',[],'YTick',[]);
如果我们想用文字描述顶点的话,可以使用元胞数组
Matlab
%注意字符串元胞数组是用大括号包起来的
s2={'学校','电影院','网吧','酒店'};
t2={'电影院','酒店','酒店','KTV'};
如果我们想设置每条边上的权重,可以直接加上权重向量即可或者使用邻接矩阵 a
Matlab
w = [3,8,9,2];
G = graph(s,t,w);
%G.Edges.weight 表示图形对象G中所有边的权重值,'EdgeLabel'表示在图形上显示这些权重值
plot(G,'EdgeLabel',G.Edges.Weight,'LineWidth',2);
Matlab
%有权重利用邻接矩阵绘图
% a=[0,3,9,2;
% 3,0,8,0;
% 9,8,0,0;
% 2,0,0,0];
%因为无向边两条边不管哪个点在前边上的权重都是一样的
a=[0,3,9,2;
0,0,8,0;
0,0,0,0;
0,0,0,0];
%'upper'仅使用上三角矩阵来构造图
G = graph(a,'upper');
注意:这里每个顶点之间的边和权重都要一一对应!
2.作有向图
利用digraph函数
有向图和无向图的作法几乎相同,只不过是用digraph函数代替了graph函数
Matlab
%%Matlab作有向图
%无权图 digraph(s,t)
s3=[1,2,3,4,1];
t3=[2,3,1,1,4];
G = digraph(s3,t3);
plot(G);
set(gca,'XTick',[],'YTick',[]);
%有权图 digraph(s,t,w)
w3=[2,4,5,10,5];
G = digraph(s3,t3,w3);
plot(G,'EdgeLabel',G.Edges.Weight,'LineWidth',2);
set(gca,'XTick',[],'YTick',[]);
%利用邻接矩阵a digraph(a)
a = [0,3,0,0;
0,0,8,0;
9,0,0,0;
2,0,0,0];
%给每个顶点标注名称,int2str([1:4]')将整数1到4四个数转化为字符
s=cellstr(strcat('顶点',int2str((1:4)')));
%strcat把字符串水平串联起来
%strcat('顶点',int2str((1:4)'))把顶点和字符1到4拼起来
G = digraph(a,s);
plot(G,'EdgeLabel',G.Edges.Weight,'LineWidth',2);
set(gca,'XTick',[],'YTick',[]);
总结
完结撒花🎇🎇🎆🎆👍
本文讲解了什么是图论以及如何利用Matlab创建图,有任何问题和补充欢迎大家留言
如果对你有帮助的话记得点赞,收藏,关注哟!