无向图
在司守奎老师都书中,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
,即保留自环。