求连通图最短距离矩阵的算法及其matlab程序详解
#################本文为学习《图论算法及其MATLAB实现》的学习笔记#################
求最短路径矩阵的算法,不仅可直接应用到运输网络的分析中,而且在图上最优选址类问题中应用也很重要。
- 算法用途
连通赋权图最短距离矩阵的求法
- 算法思想
首先,输入该赋权图的权值矩阵
W
=
(
d
i
j
)
n
×
n
W=(d_{ij})_{n×n}
W=(dij)n×n
,然后,为了求出两点间的最短距离,可按照Dijkstra方法,只要反复使用迭代公式
d
i
j
k
=
min
i
,
j
,
k
∈
{
1
,
2
,
⋅
⋅
⋅
,
n
}
{
d
i
j
(
k
−
1
)
,
d
i
k
(
k
−
1
)
+
d
k
j
(
k
−
1
)
}
d_{ij}^{k}=\mathop{\min}_{i,j,k\in\{1,2,···,n\}} \{d^{(k-1)}_{ij},d^{(k-1)}_{ik}+d^{(k-1)}_{kj}\}
dijk=mini,j,k∈{1,2,⋅⋅⋅,n}{dij(k−1),dik(k−1)+dkj(k−1)}
就可以得到结果,记为
D
(
n
)
=
[
d
11
(
k
)
⋯
d
1
n
(
n
)
d
21
(
n
)
⋯
d
2
n
(
n
)
⋮
⋮
d
n
1
(
n
)
⋯
d
n
n
(
n
)
]
D^{(n)}= \begin{bmatrix} d^{(k)}_{11} & \cdots & d^{(n)}_{1n} \\ d^{(n)}_{21} & \cdots & d^{(n)}_{2n} \\ \vdots & & \vdots \\ d^{(n)}_{n1} & \cdots & d^{(n)}_{nn} \end{bmatrix}
D(n)=
d11(k)d21(n)⋮dn1(n)⋯⋯⋯d1n(n)d2n(n)⋮dnn(n)
其中
d
i
j
(
n
)
d^{(n)}_{ij}
dij(n) 为从顶点
v
i
v_{i}
vi 到顶点
v
j
v_{j}
vj 的最短距离的计算结果,称
D
(
n
)
D^{(n)}
D(n) 为最短距离矩阵。
- 程序参数说明
W: 图的权值矩阵
D: 图的最短距离矩阵
- 算法的matlab程序详解
function [ D ] = shortdf( W )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%% 连通图最短距离矩阵的算法 %%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% 输入: W: 图的权值矩阵;
%%%%%%%%% 输出: D: 图的最短距离矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%连接图中各顶点最短距离计算,i.e.最短距离矩阵(无向图)
%两顶点间若不存在弧,为inf
n = length(W); % 返回 W 的行数,即顶点数
D = W;
m = 1;
while m <= n
for i = 1:n
for j = 1:n
if D(i,j) > D(i,m) + D(m,j)
D(i,j) = D(i,m) + D(m,j); % 距离更新,取迭代公式中的最小值
end
end
end
m = m+1;
end
D;