数学建模中的图论

一、图的分类

有向图:各个顶点之间的路径存在方向

无向图:各个顶点之间的路径不存在方向

带权图:各个顶点之间的边上有权值,这个权值可以是路径的长度,实际问题中可以是路的长度、走这条路花费的成本等。

二、一个在线作图的网站

https://csacademy.com/app/graph_editor/
三、带权图的权重邻接矩阵

若途中两点之间有边,则矩阵对应位置处的值为该边的权值。

注意:如果图是有向图,则要注意箭头的方向,这个时候,权重邻接矩阵就不是关于主对角线对称的了。

如果不带权重,这个时候,如果两点之间有边,则矩阵对应位置处填1,没边则填0。

总而言之,邻接矩阵研究的是顶点之间的关系,矩阵的行向量和列向量都是顶点。

四、图的关联矩阵

与邻接矩阵不同,图的关联矩阵研究的是边和顶点之间的关系。在图中,如果某条边和某两个点点是相邻的,则在矩阵的对应位置填入1,否则填入0。

在这里就要介绍一下边和顶点相邻的概念:如果一个顶点是某条边的两个端点中的一个,那么,这个顶点和这条边就称为相邻。

五、迪杰斯特拉算法

1、该算法的核心思想是将所有顶点分为两个集合,一个集合是已经遍历过的点,另一个集合是没有遍历过的点。通过不断地寻找路径的最小值,最终找到最短路径。具体理解看下面视频(前五分钟):https://www.bilibili.com/video/av54668527

2、该算法的一个显著缺点:如果图中出现了负权重,则不能用该算法来求解。

六、贝尔曼-福特算法

为了解决迪杰斯特拉算法不能处理负权重的缺点,可用贝尔曼-福特算法。

但是,贝尔曼-福特算法同样不能处理含有负权回路的图。

负权回路:如果在一个图中存在一个环,这个环的各权值加起来结果是小于零的,那么这个回路就称为负权回路。

注意:在无向图中,因为边不存在方向,因此一条边即可看成一条回路,所以,贝尔曼-福特算法不能处理带有负权权重的无向图。

具体理解看下面视频:https://www.bilibili.com/video/av43217121

六、图论问题的matlab实现

1、graph函数

graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图,例如:

s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
G = graph(s,t,w);

使用上述命令,即可生成图G,s和t中对应位置的两点之间就会生成一条边,边的权值就是w中对应位置出的数字。

为了方便理解,使用plot函数将上述图画出来,如下图:

 画图的命令为:

 plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 

画出的图中会有坐标轴,实际上,这个坐标轴并没有什么用处,我们可以使用如下命令将坐标轴去掉:

set( gca, 'XTick', [], 'YTick', [] );  

2、使用如下命令可以返回两点之间的最短路径:

[P,d] = shortestpath(G, 9, 4)

p返回的是最短路径经过的点,d返回的是最短路径的长度,9和4是两个参数,意思是9和4之间的最短路径。

以上面的图为例,使用上述命令:

3、在图中高亮我们的最短路径

% 在图中高亮我们的最短路径
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);  %首先将图赋给一个变量
highlight(myplot, P, 'EdgeColor', 'r')   %对这个变量即我们刚刚绘制的图形进行高亮处理(给边加上r红色)

4、使用如下命令可以返回图中任意两点之间的距离(结果是一个矩阵)

D = distances(G)

以上面的矩阵为例,生成的矩阵如下:

 5、出给定范围内的所有点

使用如下命令即可实现找出给定范围内的所有点:

[nodeIDs,dist] = nearest(G, 2, 10)

其中,2和10是两个参数,意思是找到以2这个点为中心,距离10以内的所有点。

返回的结果中,nodeIDs 是距离为10以内的点的标号,dist为对应的距离。

例如:

表示,以2这个点为中心,10以内的点有: 8        7        5        1        6        3        9

                         对应的距离是                     2        3        4        6        6        7        10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值