文档帮助中心文档
两个单节点之间的最短路径
P =最短路径(G,s,t)
P =最短路径(G,s,t,'方法',算法)
[P,d] = shortestpath(___)
[P,d,edgepath] = shortestpath(___)
例子
P= shortestpath (G,s t)计算从源节点开始的最短路径年代并在目标节点结束t。如果图是加权的(即,G.Edges包含一个变量重量),然后这些权重被用作图中沿边缘的距离。否则,取所有的边距为1。
P= shortestpath (G,s t)
P
G
s t
年代
t
G.Edges
重量
1
P= shortestpath (G,s t“方法”,算法)可选地指定用于计算最短路径的算法。例如,如果G是加权图吗shortestpath (G s t,“方法”,“减重”)忽略其中的边权值G而把所有边权值都看成1。
P= shortestpath (G,s t“方法”,算法)
算法
shortestpath (G s t,“方法”,“减重”)
(P,d= shortestpath(___)另外返回最短路径的长度,d,使用以前语法中的任何输入参数。
(P,d= shortestpath(___)
d
(P,d,edgepath= shortestpath(___)另外返回边缘索引edgepath从的最短路径上的所有边年代来t。
(P,d,edgepath= shortestpath(___)
edgepath
全部折叠
创建并绘制有向图。
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 =有向图(s,t);情节(G)
计算节点7和8之间的最短路径。
P =最短路径(G,7,8)
P =1×57 1 3 5 8
创建并绘制带有加权边的图形。
S = [1 11 2 2 6 6 7 7 3 9 9 4 4 11 11 8];T = [2 3 4 5 6 7 8 5 8 9 10 10 11 12 10 12 12];权重= [10 10 10 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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] =最短路径(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 7 6 7 5 9 6 6 10 10 11 11 8 8 11 9];权重= [1 1 1 1 3 3 2 4 16 2 8 8 9 3 2 10 12 15 16];G =图(s,t,权重);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之间的最短路径。用绿色突出显示此路径。
[path1,d] =最短路径(G,6,8)
path1 =1×56 3 1 4 8
D = 14
突出(p path1“EdgeColor”,‘g’)
指定方法作为未加权的要忽略边的权重,而是将所有边视为它们的权重为1。此方法在节点之间生成不同的路径,该路径之前的路径长度太大,不可能是最短路径。用红色突出显示此路径。
方法
未加权的
[path2,d] =最短路径(G,6,8,“方法”,“减重”)
path2 =1×36 9 8
D = 2
突出(p path2“EdgeColor”,“r”)
绘制多重图中两个节点之间的最短路径,并突出显示被遍历的特定边。
创建一个有五个节点的加权多重图。几对节点之间有多条边。画出图表供参考。
G =图([1 1 1 1 1 2 2 3 3 3 4 4],[2 2 2 2 2 2 3 4 4 5 5 5 5 2],[2 4 6 8 10 5 3 1 5 6 8 8 9]);p = plot(G,“EdgeLabel”, G.Edges.Weight);
求节点1到节点5之间的最短路径。由于几个节点对之间有多条边,因此指定三个输出到shortestpath返回最短路径遍历的特定边。
shortestpath
[P,d,edgepath] = shortestpath(G,1,5)
P =1×51 2 4 3 5
D = 11
edgepath =1×41 7 9 10
结果表明,最短路径的总长度为11,并且沿着所给出的边G.Edges (edgepath:)。
G.Edges (edgepath:)
ans =4×2表EndNodes Weight ________ ______ 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 5 6 6 7 8 9];T = [2 4 3 5 6 5 7 9 6 7 8 9 10 10];G =图(s,t);
创建x -和y -图节点的坐标。对象,然后使用节点坐标绘制图形“XData”和“YData”名称-值对。
“XData”
“YData”
X = [1 2 3 2 2.5 4 3 5 3 5];Y = [1 3 4 -1 2 3.5 1 3 0 1.5];情节(G,“XData”, x,“YData”, y)
通过计算图节点之间的欧氏距离来为图添加边权值。距离是从节点坐标开始计算的 ( x 我 , y 我 ) 为:
d = | Δ x | 2 + | Δ y | 2 = | x 年代 - x t | 2 + | y 年代 - y t | 2 。
计算 Δ x 和 Δ y ,首次使用findedges为了得到向量sn和tn描述图中每个边的源节点和目标节点。然后使用sn和tn索引到x- - -y-坐标向量并计算 Δ x = x 年代 - x t 和 Δ y = y 年代 - y t 。的函数的函数计算平方和的平方根,因此请指定 Δ x 和 Δ y 作为输入参数来计算每条边的长度。
findedges
sn
tn
函数的
[sn,tn] = findge (G);Dx = x(sn) - x(tn);Dy = y(sn) - y(tn);D = (dx,dy);
将距离作为边权值添加到图中,并用标记的边重新绘制图。
G.Edges.Weight = D';p = plot(G,“XData”, x,“YData”, y,“EdgeLabel”, G.Edges.Weight);
计算节点1和节点10之间的最短路径,并指定两个输出以返回路径长度。对于加权图,shortestpath自动使用“积极”方法,该方法考虑边权值。
“积极”
[path,len] = shortestpath(G,1,10)
路径=1×41 4 9 10
Len = 6.1503
使用突出函数在图中显示路径。
突出(p,路径,“EdgeColor”,“r”,“线宽”, 2)
图
有向图
输入图形,指定为a图或有向图对象。使用图创建无向图或有向图创建有向图。
例子:G =图(1,2)
G =图(1,2)
例子:G =有向图([1 2],[2 3])
G =有向图([1 2],[2 3])
源节点id和目标节点id,作为节点索引或节点名称的单独参数指定。
“一个”
例子:shortestpath (G, 2、5)计算节点2和节点5之间的最短路径。
shortestpath (G, 2、5)
例子:shortestpath (G, node1, node2)计算指定节点之间的最短路径node1和node2。
shortestpath (G, node1, node2)
node1
node2
“汽车”
“减重”
“混合”
“单极”
最短路径算法,指定为表中的选项之一。
的“汽车”选项自动选择算法:
“减重”用于图和有向图没有边权值的输入。
“积极”用于所有图有边权值的输入,并且要求权值是非负的。此选项也用于有向图具有非负边权值的输入。
“混合”用于有向图边权值包含一些负值的输入。这个图不可能有负循环。
宽度优先计算,将所有边权值处理为1。
Dijkstra算法,要求所有边权值为非负。
有向图的Bellman-Ford算法,它要求图没有负环。
而“混合”比“积极”对于同样的问题,“混合”更通用,因为它允许一些边权值为负。
为提高带加权边的有向无环图(dag)性能而设计的算法。
使用isdag确定一个有向图是否是无环的。
isdag
请注意
对于大多数图表,“减重”是最快的算法,其次是“单极”,“积极”,“混合”。
例子:shortestpath (G s t,“方法”,“单极”)
shortestpath (G s t,“方法”,“单极”)
节点之间的最短路径,返回为节点索引向量或节点名称数组。P是空的,{},如果节点之间没有路径。
{}
如果年代和t那么,包含数值节点索引P是节点索引的数值向量。
如果年代和t那么,请包含节点名称P包含节点名称的单元格数组或字符串数组。
如果有多条最短路径年代和t,然后P只包含其中一个路径。返回的路径可以根据算法的不同而改变方法指定。
最短路径距离,作为数字标量返回。d连续节点间边权值的总和在吗P。如果节点之间没有路径,那么d是正。
正
最短路径上的边,作为边索引向量返回。对于多重图,此输出指示两个节点之间的哪条边在路径上。该输出与“边缘”名称-值对突出,例如:突出(p,‘边缘’,edgepath)。
突出(p,‘边缘’,edgepath)
的shortestpath,shortestpathtree,距离函数不支持具有负边权值的无向图,或金宝app者更普遍的任何包含负循环的图,原因如下:
shortestpathtree
距离
一个消极的循环是从节点返回到自身的路径,该路径上的边权值之和为负。如果两个节点之间的路径上有一个负循环,那么节点之间不存在最短路径,因为通过遍历负循环总能找到更短的路径。
在无向图中,单个负边权值会产生一个负循环。
shortestpathtree|距离|最近的|图|有向图
最近的
您有这个示例的修改版本。要使用编辑打开此示例吗?
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
选择一个网站,在可用的地方获得翻译的内容,并查看当地的活动和优惠。根据您所在的位置,我们建议您选择:。
您也可以从以下列表中选择一个网站:
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。
联系当地办事处