利用Matlab实现【图论】中的图

目录

前言

一、图论是什么?

1.基本概念

2.表达形式

二、使用matlab作图

1.作无向图

2.作有向图

总结



前言

本文将讲解如何使用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创建图,有任何问题和补充欢迎大家留言

如果对你有帮助的话记得点赞,收藏,关注哟!

相关推荐
偷吃的耗子6 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强1 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发1 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
wWYy.1 小时前
数组快排 链表归并
数据结构·链表
张登杰踩1 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0072 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零2 小时前
变点检测算法PELT
算法