Matlab图论工具箱中shortestpath和graphshortestpath

文章介绍了在MATLAB中使用graphshortestpath函数处理无向图的最短路径问题,当graphshortestpath不可用时,转向使用shortestpath函数,并展示了如何处理有向图的情况,包括自环的处理。
摘要由CSDN通过智能技术生成

无向图 

在司守奎老师都书中,matlab图论工具箱中求最短路径及长度中提到了graphshortestpath函数,但是在某些matlab版本中graphshortestpath函数无法正常使用,原代码是:

clc, clear
a(1,2)=2;a(1,3)=8;a(1,4)=1;
a(2,3)=1;a(2,3)=6;a(2,5)=1;
a(3,4)=7;a(3,5)=5;a(3,6)=1;a(3,7)=2;
a(4,7)=9;
a(5,6)=3;a(5,8)=2;a(5,9)=9;
a(6,7)=4;a(6,9)=6;
a(7,9)=3;a(7,10)=1;
a(8,9)=7;a(8,11)=9;
a(9,10)=1;a(9,11)=2;
a(10,11)=4;
a=a';   %matlab工具箱要求数据是下三角矩阵
[i,j,v]=find(a);
b=sparse(i,j,v,11,11) %构造稀疏矩阵
[x,y,z]=graphshortestpath(b,1,11,'Directed',false) % Directed是标志图为有向或无向的属性,该图是无向图,对应的属性值为false,或0。

运行结果:

 所以我们可以使用shortestpath函数代替

%使用shortestpath函数,你可以计算从一个节点到另一个节点的最短路径。下面是该函数的使用示例:

G = graph(b,'lower'); % 将稀疏矩阵b转换为图对象G
[dist, path] = shortestpath(G, 1, 11); % 计算从节点1到节点11的最短路径

使用lower是因为在前部分操作中将a转换为下三角矩阵,你可以使用graph函数将稀疏矩阵b转换为图对象G。这个函数创建一个无向图,其中节点由稀疏矩阵的行和列索引表示,边由非零元素的位置表示。

 完整代码:

clc, clear
a(1,2)=2;a(1,3)=8;a(1,4)=1;
a(2,3)=1;a(2,3)=6;a(2,5)=1;
a(3,4)=7;a(3,5)=5;a(3,6)=1;a(3,7)=2;
a(4,7)=9;
a(5,6)=3;a(5,8)=2;a(5,9)=9;
a(6,7)=4;a(6,9)=6;
a(7,9)=3;a(7,10)=1;
a(8,9)=7;a(8,11)=9;
a(9,10)=1;a(9,11)=2;
a(10,11)=4;
a=a'   %matlab工具箱要求数据是下三角矩阵
[i,j,v]=find(a);
b=sparse(i,j,v,11,11) %构造稀疏矩阵
G = graph(b,'lower'); % 将稀疏矩阵b转换为图对象G
plot(G);
[dist, path] = shortestpath(G, 1, 11); % 计算从节点1到节点11的最短路径
disp("最短路径:");
disp(path);
disp("路径总权重:");
disp(dist);

运行结果:


最短路径:
    13

路径总权重:
     1     2     5     6     3     7    10     9    11

另外用其他方法可参考另一篇文章https://blog.csdn.net/zhounei/article/details/132044487 

有向图 

 对于有向图,求vs到vt的最短距离,我们可以用digraph函数

clc, clear
a=zeros(7);
a(1,2)=4; a(1,3)=2;
a(2,3)=3; a(2,4)=2; a(2,5)=6;
a(3,4)=5; a(3,6)=4;
a(4,5)=2; a(4,6)=7;
a(5,6)=4; a(5,7)=8;
a(6,7)=3;
b=sparse(a); %构造稀疏矩阵,这里给出构造稀疏矩阵的另一种方法
G = digraph(b,'omitselfloops');
plot(G)
[dist, path] = shortestpath(G, 1, 7); 
disp("最短路径:");
disp(path);
disp("路径总权重:");
disp(dist);

omitselfloops是MATLAB中digraph函数的一个可选参数,用于创建有向图对象时忽略自环(self-loops)。自环是指起点和终点相同的边,即一个节点指向自身的边。

通过在digraph函数中设置'omitselfloops'参数为true,可以在创建有向图对象时忽略自环。默认情况下,该参数为false,即保留自环。

 

 

GrTheory - Graph Theory Toolbox. 内含40个图论问题的matlab代码,包括最短径问题等。对数学建模,2012美赛ICM的帮助尤其大。欢迎下载。 Functions: grBase - find all bases of digraph; grCoBase - find all contrabases of digraph; grCoCycleBasis - find all independent cut-sets for a connected graph; grColEdge - solve the color problem for graph edges; grColVer - solve the color problem for graph vertexes; grComp - find all components of graph; grCycleBasis - find all independent cycles for a connected graph; grDecOrd - solve the problem about decomposition of the digraph to the sections with mutually accessed vertexes (strongly connected components); grDistances - find the distances between any vertexes of graph; grEccentricity - find the (weighted) eccentricity of all vertexes, radius, diameter, center vertexes and the periphery vertexes; grIsEulerian - find the Eulerian cycle of graph; grIsomorph - solve the problem about isomorphism for two graphs; grMaxComSu - solve the maximal complete sugraph problem for the graph; grMaxFlows - solve the maximal flow problem for the digraph; grMaxMatch - solve the maximal matching problem for the graph; grMaxStabSet - solve the maximal stable set problem for the graph; grMinAbsEdgeSet - solve the minimal absorbant set problem for the graph edges; grMinAbsVerSet - solve the minimal absorbant set problem for the graph vertexes; grMinCutSet - solve the minimal cut-set problem for the digraph; grMinEdgeCover - solve the minimal edge cover problem for the graph; grMinSpanTree - solve the minimal spanning tree problem for the graph; grMinVerCover - solve the minimal vertex cover problem for the graph; grPERT - solve the project evaluation research task; grPlot - draw the plot of the graph (digraph); grShortPath - solve the shortest path problem for the digraph; grShortVerPath - for digraph with weighted vertexes solve the problem about the path with minimal weight of verticies; grTranClos - built the transitive closure for the digraph; grTravSale - solve
### 回答1: graphshortestpath函数是MATLAB用于计算有向图或无向图最短路径的函数。该函数可以使用不同的算法来计算最短路径,包括Dijkstra算法、Bellman-Ford算法和Floyd算法等。用户可以通过指定不同的输入参数来选择使用不同的算法。该函数的输出结果包括最短路径的长度和路径上的节点序列。 ### 回答2: graphshortestpath函数是Matlab用于求取图最短路径的函数。该函数的调用格式为: [p,d] = graphshortestpath(G,s,t) 其,G表示图,s表示起点,t表示终点。p表示从起点到终点的最短路径上所经过的节点序列,d表示起点到终点的最短路径长度。 graphshortestpath函数采用的是迪杰斯特拉算法,该算法是基于贪心策略的一种经典的单源最短路径算法。具体实现过程如下: 1. 初始化:首先将起点s加入到已确定最短路径的集合S,将其余各点加入到待确定最短路径的集合Q,并将其距离初始化为无穷大即表示不可达。 2. 选择未确定最短路径点距离最小的点u,将其标记为已确定最短路径点,更新从起点s到其它点的距离,如果更新后的距离比原距离小,则更新最短距离值和最短路径。 3. 重复步骤2,直至所有点都被标记为已确定最短路径点或者不存在从起点s到终点t的路径。 通过迪杰斯特拉算法求解最短路径的时间复杂度为O(n^2),其n为节点数。在实际求解过程,由于Matlab使用了优化的内部数据结构来处理图的存储,因此运行效率较高,具有较好的实用性。 在使用graphshortestpath函数时,需要注意图G的存储形式,通常采用稀疏矩阵的形式表示。另外,该函数也支持加权有向图、无向图或带负边权的图的求解,具有较大的适用范围。 ### 回答3: graphshortestpath函数是MATLAB自带的一个函数,用于计算有向或无向图两个节点之间的最短路径及其长度。这个函数的基本用法如下: 1. 找到要计算最短路径的图的邻接矩阵或邻接列表。如果是邻接列表,需要转化成邻接矩阵。 2. 调用graphshortestpath函数,输入邻接矩阵或邻接列表、起点和终点。 3. 函数会返回最短路径的长度和路径节点的编号。 值得说明的是,如果该路径不存在,则函数会返回空向量或空矩阵。如果图存在负权边,则该函数要求图不能有负环(即一个环上所有边的权值和为负数),否则无法正确计算最短路径。此时可以使用graphshortestpath函数的增强版,graphshortestpath2函数,来应对这种情况。 除了起点和终点的节点编号,graphshortestpath函数还可以接受其他可选参数。其最重要的是第三个参数,即处理负权边的方式。默认情况下,该参数为auto,表示自动检测图是否存在负权边。如果存在,则使用Bellman-Ford算法来计算最短路径,否则使用Dijkstra算法。如果需要强制使用其一种算法,则将第三个参数设置为bellman-ford或dijkstra即可。 除此之外,graphshortestpath函数还可以接受一个名为“method”的参数,表示使用最短路径算法的方法。默认情况下,该参数为auto,表示自动选择算法。如果想要强制使用Dijkstra算法,则将该参数设置为dijkstra,如果想要强制使用Bellman-Ford算法,则将该参数设置为bellman-ford即可。 总之,graphshortestpath函数是MATLAB非常实用的一个函数,可以帮助用户计算最短路径,解决很多实际问题。但需要注意的是,该函数使用时需要注意处理负权边和负环的情况,否则可能会得到错误的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值