利用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 分钟前
B+树(B+TREE)索引
数据结构·算法
代码雕刻家35 分钟前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
梦想科研社41 分钟前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
Milo_K43 分钟前
今日 leetCode 15.三数之和
算法·leetcode
Darling_001 小时前
LeetCode_sql_day28(1767.寻找没有被执行的任务对)
sql·算法·leetcode
AlexMercer10121 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
Greyplayground1 小时前
【算法基础实验】图论-BellmanFord最短路径
算法·图论·最短路径
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
源代码:趴菜1 小时前
LeetCode63:不同路径II
算法·leetcode·职场和发展
儿创社ErChaungClub1 小时前
解锁编程新境界:GitHub Copilot 让效率翻倍
人工智能·算法