shortestpath
两个单节点之间的最短路径
语法
描述
例子
指定的节点之间的最短路径
创建和策划一个有向图。
s = [1 1 2 3 3 4 4 6 6 7 8 7 5];t = [4 2 3 4 5 5 6 8 1 3 2 8];G =有向图(s, t);情节(G)
计算节点之间的最短路径7和8。
P = shortestpath (G, 7, 8)
P =1×57 1 3 5 8
加权图的最短路径
创建和情节与加权边缘图。
s = [1 1 1 2 2 6 6 7 8 7 3 3 9 9 4 4 11 11);t = [2 3 4 5 6 7 8 5 8 9 10 5 10 11 12 10 12 12];重量= [10 10 10 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1];图G = (s t重量);情节(G,“EdgeLabel”G.Edges.Weight)
找到节点之间的最短路径3和8,并指定两个输出也返回路径的长度。
[P、d] = shortestpath (G, 3, 8)
P =1×53 9 5 7 8
d = 4
自边缘在图像的中心大重量、节点之间的最短路径3和8绕的边界图的边的权值都是最小的。这条道路总长度为4。
最短路径忽略边
创建和加权边缘画一个图,使用自定义节点坐标。
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 6 7 7 5 9 6 6 10 10 10 11 11 8 8 11 9];重量= [1 1 1 1 2 3 3 1 2 4 6 8 8 9 3 2 10 12 15 16);图G = (s t重量);x = [0 0.5 -0.5 -0.5 -1.5 0.5 1.5 0 0 2 2];y = [0 0.5 0.5 -0.5 -0.5 - 2 0 2 0 0 0);p =情节(G,“XData”,x,“YData”,y,“EdgeLabel”,G.Edges.Weight);
找到最短路径节点之间基于图6和8边。用绿色突出显示这条道路。
[path1 d] = shortestpath (G 6 8)
path1 =1×56 3 1 4 8
d = 14
突出(p path1“EdgeColor”,‘g’)
指定方法
作为未加权的
忽略了边的权值,而不是把所有边缘,如果他们有一个重量的1所示。这种方法会产生一个不同的节点之间的路径,一个以前太大的路径长度最短路径。突出这条道路为红色。
[path2 d] = shortestpath (8 G, 6日,“方法”,“减重”)
path2 =1×36 9 8
d = 2
突出(p path2“EdgeColor”,“r”)
在多重图最短路径
图中两个节点之间的最短路径遍历油印,强调特定的边缘。
创建一个加权多重图有5个节点。几个成对的节点有一个以上的边缘。绘制图供参考。
图G = ([1 1 1 1 1 2 2 3 3 3 4 4], [2 2 2 2 4 2 3 4 5 5 5 2], [2 4 6 8 10 5 3 1 5 6 8 9]);p =情节(G,“EdgeLabel”,G.Edges.Weight);
找到5节点1和节点之间的最短路径。以来的几个节点对它们之间有一个以上的边缘,指定三个输出shortestpath
返回特定的边缘,最短路径遍历。
[P d edgepath] = shortestpath (G, 1, 5)
P =1×51 2 3 4 5
d = 11
edgepath =1×41 7 9 10
结果表明,最短路径总长度为11和遵循的边缘G.Edges (edgepath:)
。
G.Edges (edgepath:)
ans =4×2表EndNodes重量________ ________ 1 2 2 2 4 3 3 4 1 3 5 5
强调通过使用这条边路径突出
函数与“边缘”
名称-值对指定边缘的指数遍历。
突出(p,“边缘”edgepath)
最短路径节点坐标
找到最短路径图中节点之间使用节点之间的距离作为边的权值。
创建一个与10节点图。
s = [1 1 2 2 3 4 4 4 5 6 5 6 7 8 9];t = [2 3 4 5 6 7 5 7 9 6 7 8 9 10 10];图G = (s, t);
创建x -和y -坐标图的节点。然后画出图使用指定的节点坐标“XData”
和“YData”
名称-值对。
2.5 x = [1 2 3 2 4 5 3 5];y = [1 3 4 1 2 1 3 0 3.5 1.5);情节(G,“XData”,x,“YData”,y)
边的权值添加到图通过计算节点之间的欧几里得距离图。的距离计算节点坐标 为:
计算
和
,第一次使用findedges
获取向量sn
和tn
描述了源和目标节点图的每条边。然后使用sn
和tn
索引到x- - -y坐标向量和计算
和
。的函数的
函数计算平方和的squareroot,所以指定
和
作为输入参数来计算每条边的长度。
(sn, tn) = findedge (G);dx = x (sn) - x (tn);dy = y (sn) - y (tn);D =函数(dx, dy);
添加的距离图的边的权值和改建的图边缘标记。
G.Edges。重量=D'; p = plot(G,“XData”,x,“YData”,y,“EdgeLabel”,G.Edges.Weight);
计算节点1和节点之间的最短路径10并指定两个输出也返回路径长度。对于加权图,shortestpath
自动使用“积极”
方法考虑了边。
[路径,len] = shortestpath (G, 1, 10)
路径=1×41 4 9 10
len = 6.1503
使用突出
函数显示的路径图。
突出(p,路径,“EdgeColor”,“r”,“线宽”,2)
输入参数
s t
- - - - - -源和目标节点id(作为单独的参数)
节点索引|节点名
源和目标节点id指定为单独的节点指标或参数节点的名称。
价值 | 例子 |
---|---|
标量节点索引 | 1 |
特征向量节点名 | “一个” |
字符串标量节点名 | “一个” |
例子:shortestpath (G, 2、5)
计算节点2和节点之间的最短路径5。
例子:shortestpath (G, node1, node2)
计算指定的节点之间的最短路径node1
和node2
。
算法
- - - - - -最短路径算法
“汽车”
(默认)|“减重”
|“积极”
|“混合”
|“单极”
最短路径算法,表中指定的选项。
选项 | 描述 |
---|---|
“汽车” (默认) |
的
|
“减重” |
广度优先对待所有边的权值的计算 |
“积极” |
迪杰斯特拉算法,要求所有边的权值是负的。 |
“混合” (仅供有向图 ) |
bellman指示图,需要图形算法没有负面循环。 而 |
“单极” (仅供有向图 ) |
算法设计为指导改善性能,非循环图(无进取心的人)和加权边缘。 使用 |
请注意
对于大多数图形,“减重”
是最快的算法,其次是吗“单极”
,“积极”
,“混合”
。
例子:shortestpath (G s t,“方法”,“单极”)
输出参数
P
节点之间的最短路径
节点指标|节点名称
节点之间的最短路径,作为一个向量返回节点索引或一组节点的名称。P
是空的,{}
,如果没有节点之间的路径。
如果
年代
和t
包含数字节点指标P
是一个数值向量的节点指标。如果
年代
和t
包含节点名P
是一个单元数组或字符串数组包含节点名称。
如果有多个之间的最短路径年代
和t
,然后P
只包含一个路径。返回的路径可以改变这取决于算法方法
指定。
d
- - - - - -最短路径距离
标量
最短路径距离,作为数字返回标量。d
是连续的节点之间的边的权值的总和P
。如果没有节点之间的路径,然后d
是正
。
edgepath
——边缘最短路径
向量的边缘指数
边缘最短路径,作为一个向量返回边缘指数。油印,输出显示这两个节点之间的边的路径。这个输出兼容“边缘”
名称-值对的突出
,例如:突出(p,‘边缘’,edgepath)
。
提示
的
shortestpath
,shortestpathtree
,距离
功能不支持与负边的无向图,或更一般万博1manbetx的任何包含消极的循环图,由于这些原因:一个消极的循环是一个路径,从一个节点本身,与路径上的边的权值之和是负的。如果一个消极的周期在两个节点之间的路径,节点之间的最短路径不存在,因为总能找到更短的路径遍历负面循环。
一个负缘体重在一个无向图创建一个负面循环。
扩展功能
C / c++代码生成
生成C和c++代码使用MATLAB®编码器™。
名值参数必须是常数。
只有
“积极”
,“减重”
和“汽车”
支持方法。万博1manbetx当没有指定的节点之间的路径,输出
P
和edgepath
有大小1
——- - - - - -0
而不是0
——- - - - - -0
。
版本历史
介绍了R2015b
另请参阅
MATLAB命令
你点击一个链接对应MATLAB命令:
运行该命令通过输入MATLAB命令窗口。Web浏览器不支持MATLAB命令。万博1manbetx
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。