利用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创建图,有任何问题和补充欢迎大家留言

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

相关推荐
超级大咸鱼3 小时前
verilog利用线性插值实现正弦波生成器(dds)
matlab·fpga·dds·线性插值
算AI14 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程55514 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
owde15 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头15 小时前
分享宝藏之List转Markdown
数据结构·list
hyshhhh16 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
码农幻想梦16 小时前
第八章 图论
图论
鹭天16 小时前
【网络流 && 图论建模 && 最大权闭合子图】 [六省联考 2017] 寿司餐厅
图论
蒙奇D索大16 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西16 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea