数学建模floyd算法最短路算法详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

若d
(k ij
1)

d (k 1) ik

d
(k kj
1)
否则
即当vk被插入任何两点间的最短路 径时,被记录在R(k)中,依次求 R() 时求得 D(,) 可由R() 来查找任何点对 之间最短路的路径.
算法原理—— 查找最短路路径的方法
若 rij( ) p1,则点 p1 是点 i 到点 j 的最短路的中间点.
r51 =4.由 v4 向 v5 追朔:r54 3, r53 3 ; 由 v4 向 v1 追朔:r41 1 所以从 v5 到 v1 的最短路径为:5 3 4 1.
选址问题--中心问题
例 2 某城市要建立一个消防站,为该市所属的七个区服务, 如图所示.问应设在那个区,才能使它至最远区的路径最短.

7
4
6
8.5 5.5 1.5
0

S(v1)=10, S(v2)=7, S(v3)=6, S(v4)=8.5, S(v5)=7, S(v6)=7, S(v7)=8.5
S(v3)=6,故应将消防站设在v3处。
选址问题--重心问题
例 3 某矿区有七个矿点,如图所示.已知各矿点每天的产矿量
q(v j )(标在图的各顶点上).现要从这七个矿点选一个来建造矿厂.问
m1=0; for j=1:7
m1=m1+q(j)*d(i,j); end m(i)=m1; end m min(m)
d = 0 3.0000 5.0000 8.0000 7.0000 7.0000 8.5000 3.0000 0 2.0000 5.0000 4.0000 4.0000 5.5000 5.0000 2.0000 0 3.0000 2.0000 6.0000 7.5000 8.0000 5.0000 3.0000 0 1.0000 5.0000 6.5000 7.0000 4.0000 2.0000 1.0000 0 4.0000 5.5000 7.0000 4.0000 6.0000 5.0000 4.0000 0 1.5000 8.5000 5.5000 7.5000 6.5000 5.5000 1.5000 0
对所有 i,j,若 d(i,k)+d(k,j)<d(i,j),则 d(i,j) d(i,k)+d(k,j), r(i,j) k
(3) 若 k= ,停止.否则 k k+1,转(2).
function [d,r]=floyd(w) n=length(w); for i=1:n
for j=1:n d(i,j)=w(i,j); r(i,j)=j;
w=[0,3,inf,inf,inf,inf,inf;3,0,2,inf,1.8,2.5,inf;inf,2,0,6,2,inf,inf;inf,inf,
6,0,3,inf,inf;inf,1.8,2,3,0,4,inf;inf,2.5,inf,inf,4,0,1.5;inf,inf,inf,inf,inf,1
然后用同样的方法再分头查找.若:
(1)向点 i 追朔得:rip(1 )

p2
r,
( ) ip 2

p3 ,…,rip(k )

pk
(2) 向点
ቤተ መጻሕፍቲ ባይዱ
j
追朔得:
r ( ) p1 j

q1
r,
( ) q1 j
q2
,…,
r ( qm
) j

j
则由点i到j的最短路的路径为: i, pk ,, p2 , p1,q1, q2 ,, qm , j
在建立距离矩阵的同时可建立路径矩阵R.
R= (rij ) , rij 的含义是从 vi 到 vj 的最短路要经过点号为 rij 的点.
R(0) (rij(0) ) ,
r (0) ij

j
每求得一个 D(k)时,按下列方式产生相应的新的 R(k)
r (k) ij

k rij(k 1)
(1)用 Floyd 算法求出距离矩阵 D= (dij ) .
(2) 计算在各点vi 设立服务设施的
最大服务距离S (vi ) .
S (vi
)

max{d
1 j
ij
}
i 1,2,
(3)求出顶点vk
,使 S(vk
)

min{S
1i
(vi
)}
则vk 就是要求的建立消防站的地点.此点称为图的中心点. clear;
0 7 5 3 9 7 0 2 4 6
1 4 4 4 4 4 2 3 3 3
D


5
2
0
2
4 ,
R


4
2
3
4
5

3 4 2 0 6
1 3 3 4 3

9
6
4
6
0


4
3
3
3
5

d51 9 ,故从 v5 到 v1 的最短路为9.
最短路算法
任意一对顶点之间的最短路算法:Floyd算法
(一)算法的基本思想
(二)算法原理 1、求距离矩阵的方法 2、求路径矩阵的方法 3、查找最短路路径的方法
(三)算法步骤
算法的基本思想
直接在图的带权邻接矩阵中用插入顶点的方法
依次构造出 个矩阵 最后得到的矩阵 D(
D(1)、 D(2)、… 、D( ),使
)}
,v则k
就是选矿厂应设之矿
点.此点称为图 G 的重心或中位点.
clear; w=[0,3,inf,inf,inf,inf,inf;3,0,2,inf,inf,4,inf;inf,2,0,6,2,inf,inf;inf,inf, 6,0,1,inf,inf;inf,inf,2,1,0,4,inf;inf,4,inf,inf,4,0,1.5;inf,inf,inf,inf,inf, 1.5,0]; [d,r]=floyd(w) q=[3,2,7,1,6,1,4]; for i=1:7
i
pk
p3 p2 p1
q1
q2
qm
j
算法步骤
Floyd 算法:求任意两点间的最短路.
D(i,j):i 到 j 的距离. R(i,j):i 到 j 之间的插入点. 输入: 带权邻接矩阵 w(i,j)
(1) 赋初值:
对所有 i,j, d(i,j) w(i,j), r(i,j) j, k 1
(2) 更新 d(i,j), r(i,j)
应选在哪个矿点,才能使各矿点所产的矿运到选矿厂所在地的总运力 (千吨公里)最小.
(1)求距离阵 D= (dij ) .
(2) 计算各顶点作为选矿厂的总运力m(vi )

m(vi ) q(v j ) dij
i 1,2,
j 1
(3)
求vk
使 m(vk
)

min
1i
{m(vi
}
d (1) ij
是从
vi

vj
的只允许以
v1 作为中间点的路径中最短路的长度.
(2)D(2)=
(d
(2) ij
)
,其中
d
(2) ij

min{
d (1) ij
,
d
(1)
i2
d
(1) 2j
}
d (2) ij
是从
vi

vj
的只允许以
v1

v2
作为中间点的路径中最短路的长度.


)D(
)=
end end for k=1:n
for i=1:n for j=1:n if d(i,k)+d(k,j)<d(i,j) d(i,j)=d(i,k)+d(k,j); r(i,j)=k; end end
end end
自定义floyd函数
例 1 求下图中加权图的任意两点间的距离与路径.
clear; w=[0,9,inf,3,inf;9,0,2,inf,7;inf,2, 0,2,4;3,inf,2,0,inf;inf,7,4,inf,0]; [d,r]=floyd(w)
.5,0];
[d,r]=floyd(w) S=max(d’) %求矩阵各列的最大值
s=min(S)
0 3 5 10 7 5.5 7 3 0 2 7 4 2.5 4

5
2
0
5
2
4.5
6

D 10 7 5 0 3 7 8.5

7
4
2
3
0
4
5.5

5.5 2.5 4.5 7 4 0 1.5
m =132 78 70 92 70 106 130 ans =70
实验八、最佳灾情巡视路线(节选部分)
实验内容: 求出下图中O到其它各点的最短路线(要求求
出最短路线及其最短距离) (节选了教材上337面图中的16个点:即15、
16、17、18、20、21、22、23、25、26、I、K、M、 N、O、P等16个点)
)成为图的距离矩阵,同时也
求出插入点矩阵以便得到两点间的最短路径.
算法原理—— 求距离矩阵的方法
把带权邻接矩阵 W 作为距离矩阵的初值,即 D(0)=(di(j0) ) =W
(1)D(1)=
(d
(1) ij
)

,其中d
(1) ij

min{
d
(0) ij
,
d (0) i1

d (0) 1j
(d
( ij
)
)

,其中
d
( ij
)

min{
d
( ij
1)
,
d
( i
1)
d(j 1) }
d
( ij
)
是从
vi

vj
的只允许以
v1、v2、…、v
作为中间点的路径中最短路
的D(长)度即.是即距是离从矩阵vi 到. vj 中间可插入任何顶点的路径中最短路的长,因此
算法原理—— 求路径矩阵的方法
相关文档
最新文档