前言
本章重点学习单一两个点的最短距离。这里用到的是shortestpath函数。
p = shortestpath(G,s,t); %计算从源节点s处开始到目标节点t处结束的最短路径。
输入参数解析:
G:输入图,指定为graph和digraph对象。
举例:G = graph(1,2)
举例:G = graph([1 2], [2 3])
指定节点之间的最短路径
创建并绘制一个有向图
例子1:
matlab代码:
>> s = [1 1 2 3 3 4 4 6 6 7 8 7 5];
>> t = [2 3 4 4 5 5 6 1 8 1 3 2 8];
>> G = digraph(s,t);
>> plot(G)
运行结果:
计算节点7和8之间的最短路径
添加代码[p,d] = shortestpath(G,7,8)即可,matlab运行如下:
>> s = [1 1 2 3 3 4 4 6 6 7 8 7 5];
>> t = [2 3 4 4 5 5 6 1 8 1 3 2 8];
>> G = digraph(s,t);
>> plot(G);
>> [p,d] = shortestpath(G,7,8)
p =
7 1 3 5 8
d =
4
p-节点之间的最短路径,P = 7 1 3 5 8 表示从7到8的最短路径为7-1-3-5-8;
d - 最短路径距离:最短路径距离,以数值标量形式返回。
加权图中的最短路径
创建并绘制一个具有加权边的图
matlab代码运行如下:
>> s = [1 1 1 2 2 6 6 7 7 3 3 9 9 4 4 11 11 8];
>> t = [2 3 4 5 6 7 8 5 8 9 10 5 10 11 12 10 12 12];
>> weights = [10 10 10 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1];
>> G = graph(s,t,weights);
>> plot(G,"Edgelabel",G.Edges.Weight)
返回结果如下:
求节点3和节点8之间的最短路径,并指定两个输出同时返回该路径的长度。
[p,d] = shortestpath(G,3,8) 跟上述步骤一样。从直观感受上,我们也能找出最短的路径和最短的距离。
matlab运算如下:
>> s = [1 1 1 2 2 6 6 7 7 3 3 9 9 4 4 11 11 8];
>> t = [2 3 4 5 6 7 8 5 8 9 10 5 10 11 12 10 12 12];
>> weights = [10 10 10 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1];
>> G = graph(s,t,weights);
>> plot(G,"Edgelabel",G.Edges.Weight)
>> [p,d] = shortestpath(G,3,8)
p =
3 9 5 7 8
d =
4
忽略边权重的最短路径——最后一部分
使用自定义节点坐标创建并绘制一个具有加权边的图
matlab代码如下:
>> s = [1 1 1 1 1 2 2 7 7 9 3 3 1 4 10 8 4 5 6 8];
>> t = [2 3 4 5 7 6 7 5 9 6 6 10 10 10 11 11 8 8 11 9];
>> weights = [1 1 1 1 3 3 2 4 1 6 2 8 8 9 3 2 10 12 15 16];
>> G = graph(s,t,weights);
>> x = [0 0.5 -0.5 -0.5 0.5 0 1.5 0 2 -1.5 -2];
>> y = [0 0.5 0.5 -0.5 -0.5 2 0 -2 0 0 0];
>> p = plot(G,"XData",x,"YData",y,"Edgelabel",G.Edges.Weight)
运算结果:
根据图边权重,求节点6和8之间的最短路径。以红色突显此路径。
>> [path2,d] = shortestpath(G,6,8);
>> highlight(p,path2,"EdgeColor","r")
将Method指定为unweighted以忽略边权重,转而将所有边的权重都视为1。此方法会在节点之间生成不同的路径,用绿色凸显出来。
>> [path1,d] = shortestpath(G,6,8,"method","unweighted");
>> highlight(p,path2,"EdgeColor","r")
总结
求解两个单点之间的最短路径问题,需要用到shortestpath来进行求解,如果路径有权重问题,学会利用Method和unweighted函数来分析