主要内容

shortestpath

两个单节点之间的最短路径

描述

例子

P= shortestpath (Gs t计算从源节点开始的最短路径年代并在目标节点结束t.如果图表是加权的(也就是说,G.Edges包含一个变量重量),然后使用这些权重作为图中沿边的距离。否则,所有的边距离都取为1

例子

P= shortestpath (Gs t“方法”,算法可选地指定用于计算最短路径的算法。例如,如果G是一个加权图吗shortestpath (G s t,“方法”,“减重”)忽略边的权值G所有边的权值都是1

例子

Pd) = shortestpath (___另外返回最短路径的长度,d,使用前面语法中的任何输入参数。

例子

Pdedgepath) = shortestpath (___另外,返回边缘索引edgepath最短路径上的所有边年代t

例子

全部折叠

创建并绘制有向图。

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)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

计算节点7和节点8之间的最短路径。

P = shortestpath (G, 7, 8)
P =1×57 1 3 5 8

创建并绘制带有加权边的图。

S = [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];权重= [10 10 10 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1];图G = (s t重量);情节(G,“EdgeLabel”G.Edges.Weight)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

找到节点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 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];权重= [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 =情节(G,“XData”, x,“YData”, y,“EdgeLabel”, G.Edges.Weight);

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

根据图边权值,求节点6到节点8之间的最短路径。用绿色标出这条路径。

[path1 d] = shortestpath (G 6 8)
path1 =1×58 .你的老板很好
d = 14
突出(p path1“EdgeColor”‘g’

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

指定方法作为未加权的忽略边的权值,将所有边视为权值为1。这种方法会在节点之间产生一条不同的路径,这条路径以前的路径长度太长而不能成为最短路径。用红色标出这条路径。

[path2 d] = shortestpath (8 G, 6日,“方法”“减重”
path2 =1×36 9 8
d = 2
突出(p path2“EdgeColor”“r”

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

在多重图中绘制两个节点之间的最短路径,并突出显示所遍历的特定边。

创建一个带有五个节点的加权多图。几对节点之间有一条以上的边。绘制图表以供参考。

G =图([1 1 1 1 1 2 2 3 3 4 4],[2 2 2 2 3 4 4 5 5 5 2],[2 4 6 8 10 5 3 1 5 6 8 9]);p =情节(G,“EdgeLabel”, G.Edges.Weight);

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

求节点1和节点5之间的最短路径。由于一些节点对之间有一条以上的边,指定三个输出shortestpath返回最短路径所经过的特定边。

[P d edgepath] = shortestpath (G, 1, 5)
P =1×51 2 4 3 5 5 5
d = 11
edgepath =1×41 7 9 10

结果表明,最短路径的总长度为11,并跟随给定的边G.Edges (edgepath:)

G.Edges (edgepath:)
ans =4×2表节点重量________ ______ 1 2 2 2 4 3 3 4 1 3 5 5

的方法突出显示此边缘路径突出函数与“边缘”以指定所遍历边的索引的名称-值对。

突出(p,“边缘”edgepath)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

利用节点之间的距离作为边的权值,求图中节点之间的最短路径。

创建一个包含10个节点的图。

S = [1 1 2 2 3 4 4 5 5 6 6 7 8 9];T = [2 4 3 5 6 5 7 9 6 7 7 8 9 10 10];图G = (s, t);

创建x -y -图节点的坐标。然后通过指定节点坐标来绘制图“XData”“YData”名称-值对。

X = [1 2 3 2 2.5 4 3 5 3 5 5];Y = [1 3 4 -1 2 3.5 1 3 0 1.5];情节(G,“XData”, x,“YData”, y)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

通过计算图节点之间的欧氏距离,为图添加边的权值。距离是从节点坐标计算的 x y 为:

d | Δ x | 2 + | Δ y | 2 | x 年代 - x t | 2 + | y 年代 - y t | 2

计算 Δ x Δ y ,第一次使用findedges获取向量sntn描述图中每条边的源节点和目标节点。然后使用sntn索引到x- - -y-坐标向量并计算 Δ x x 年代 - x t Δ y y 年代 - y t .的函数的函数计算平方和的平方根,因此指定 Δ x Δ y 作为计算每条边长度的输入参数。

(sn, tn) = findedge (G);Dx = x(sn) - x(tn)y(sn) - y(tn);D =函数(dx, dy);

将距离作为边的权值添加到图中,并用标记的边重新绘制图。

G.Edges.Weight = D ';p =情节(G,“XData”, x,“YData”, y,“EdgeLabel”, G.Edges.Weight);

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

计算节点1和节点10之间的最短路径,并指定两个输出来返回路径长度。对于加权图,shortestpath自动使用“积极”方法考虑边的权值。

[路径,len] = shortestpath (G, 1, 10)
路径=1×41 4 9 10
len = 6.1503

使用突出函数显示绘图中的路径。

突出(p,路径,“EdgeColor”“r”“线宽”, 2)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

输入参数

全部折叠

输入图形,指定为有向图对象。使用创建无向图或有向图创建有向图。

例子:图G =(1、2)

例子:G =有向图([1,2],[2 3])

源和目标节点id,作为节点索引或节点名称的单独参数指定。

价值 例子
标量节点索引 1
字符向量节点名 “一个”
字符串标量节点名 “一个”

例子:shortestpath (G, 2、5)计算节点2到节点5之间的最短路径。

例子:shortestpath (G, node1, node2)计算命名节点之间的最短路径node1node2

最短路径算法,指定为表中的选项之一。

选项 描述
“汽车”(默认)

“汽车”选项自动选择算法:

  • “减重”用于有向图没有边权的输入。

  • “积极”用于所有有边权的输入,并且要求权值是非负的。这个选项也用于有向图具有非负权边的输入。

  • “混合”用于有向图边权值为负值的输入。图不可能有负环。

“减重”

宽度优先计算,将所有边的权值视为1

“积极”

要求所有边的权值非负的Dijkstra算法。

“混合”(仅供有向图

有向图的Bellman-Ford算法,它要求图没有负环。

“混合”是低于“积极”对于同样的问题,“混合”更通用,因为它允许一些边的权值为负。

“单极”(仅供有向图

改进带加权边的有向无环图性能的算法。

使用isdag确认一个有向图是否是无圈图。

请注意

对于大多数图形,“减重”是最快的算法,其次是“单极”“积极”,“混合”

例子:shortestpath (G s t,“方法”,“单极”)

输出参数

全部折叠

节点之间的最短路径,以节点索引向量或节点名称数组的形式返回。P是空的,{},如果节点之间没有路径。

  • 如果年代t然后,包含数字节点索引P是节点索引的数值向量。

  • 如果年代t然后包含节点名称P包含节点名称的单元格数组或字符串数组。

如果之间有多条最短路径年代t,然后P只包含其中一条路径。返回的路径可能会根据算法而改变方法指定。

最短路径距离,作为数字标量返回。d是连续节点之间的边权之和吗P.如果节点之间没有路径,那么d

最短路径上的边,返回为边索引向量。对于多图,此输出指示路径上两个节点之间的哪条边。该输出与“边缘”名称-值对的突出,例如:突出(p,‘边缘’,edgepath)

提示

  • shortestpathshortestpathtree,距离函数不支持具有负边权的无向图,或者万博1manbetx更普遍地说,任何包含负环的图,原因如下:

    • 一个消极的循环是一条从节点返回到自身的路径,路径上各边的权值之和为负。如果在两个节点之间的路径上存在一个负环,则节点之间不存在最短路径,因为通过遍历负环总能找到更短的路径。

    • 在无向图中,单个负边权值会产生一个负循环。

介绍了R2015b