图论模型(最优连线问题、最短路问题)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
七桥问题
著名数学家欧拉
无向图 1 定义:由顶点和边组成的图形称为图。 有向图 赋权图 2 边e与顶点u、v相关联。顶点u与v相邻。
e u v
图的基本概念
边e1与e2相邻。 u=v时,边e称为环。
e1
e2
3度
定义:与顶点v关联的边的数目称为顶点v的度数, 记为d(v)。(注:环算2度。)
注:inf指 无穷大。
s(1)=1; u=s(1); k=1; l; z; while k<n for i=1:n for j=1:k if i~=s(j) if l(i)>l(u)+w(u,i) l(i)=l(u)+w(u,i); z(i)=u; end end end end l; z;
ll=l; for i=1:n for j=1:k if i~=s(j) ll(i)=ll(i); else ll(i)=inf; end end end lv=inf; for i=1:n if ll(i)<lv lv=ll(i); v=i; end end
(其思想是:在剩余点集中找连接到U中顶点的最小权重的边,添加到生成树中。
(显然不会产生回路)。仍然是以局部的最优谋求全局的最优。)
上例中,采用Prim算法最小生成树的生 长过程:
A 8 5 B
7 E
6 水厂
1
3
10
D
9
C
例:如何设计海底管道网。( Prim 算法)
1 2 6 8 7 1 9 1 3 7 6 4 4 2 9 2
u2
2
1
u5
2
7 5
3
3 9
u1
u3
u6
1
10 2
0
8
6
5 5 6
u8
1
u4
1
10
u7
第五步:min{8,11,11,9,8,12,7,11,11},u3。
u2
2
1
u5
2
7 5
3
3 9
u1
u3
u6
0
8
7
10
1
2
6
5 5 6
u8
1
u4
1
10
u7
第六步:min{11,12,11,11,9},u7。
u2
0
8
u8
1
u4
1
10
u7
第三步:在其余点中找从u1直接到达或从u1经u4 到达或从u1经u2到达的的距离最近的点u5, min{8,11,11,3,9}。
u2
2 7 5 3 9 1
u5
2
3
u1
u3
u6
1
5 10 2 5 6
0
8
u8
1
u4
1
10
u7
第四步:min{8,11,11,9,8,6,12},u6。
u5
u1
u3
u6
1 5 10 2 5 6
0
8
u8
1
u4
1
10
u7
第二步:在其余点中找从u1直接到达或从u1经u4 到达的距离最近的点u2,min{2,8,11,11}。将这个 距离写进u2的圈中,将u1到u2的边描红,u2成为 永久的标志的点;
u2
2 7 5 3 9 1
u5
2
u1
u3
u6
1
5 10 2 5 6
u6
5 5
u8
6
2
u4
10
u7
解:算法原理为蚂蚁算法(探索算法),每次新连 接一个点。所有新到一个点最短路程中最短的那个 店,作为新增点。 第一步:找从u1出发到达的距离最近的点u4, min{2,8,1},将这个距离写进u4的圈中。将从u1到 u4的边描成红色,u4成为永久标记的点;
u2
2 7 5 3 9 1
%road2.m (floyd算法程序) a=[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(a)
最后输出的矩阵D中元素aij即为ui和uj之间的最 短距离。
查找最短路径的方法: Floyd算法程序在上述各步中还输出一个路径矩 阵 点。
(其思想是:在剩余边集中找边权最小的边添加到生成树中,同时又 不能产生回路即以局部的最优谋求全局的最优。)
上述的描述实际上是最小生成树的逐 步生长过程,上例的最小生成树如下:
A 8 5 B
7 E
6 水厂
1
3
10
D
9
C
Prim算法: 1) 在图G=(V, E) (V表示顶点 ,E表示边)中,从集合 V中任取一个顶点(例如取顶点v0)放入集合 U中,这 时 U={v0},集合T(E)为空。 2) 从v0出发寻找与U中顶点相邻(另一顶点在V中)权 值最小的边的另一顶点v1,并使v1加入U。即 U={v0,v1 },同时将该边加入集合T(E)中。 3) 重复(2),直到U = V为止。 这时T(E)中有n-1条边,T = (U, T(E))就是一棵最小生 成树。
2 Floyd算法
Dijkstra算法的缺点是只能求起点到其它个顶点的 最短路径,不能求出任意两点之间的路径, Floyd算法可 解决该问题。 Floyd算法简介:
D(0) (dij (0) )nn W 将加权矩阵W作为距离矩阵的初值 dij (0) 和ui经过u1到 第1步:比较ui和uj之间直达的距离 di1(0) d1 j (0) ,最小值作为第一步的 达uj的路径距离 (1) (0) (0) (0) dij (1)是从ui到uj的只允许 值dij min{dij , di1 d1 j } , 以u1作为可行中间点的路径中最短路的长度。得距离矩 阵 D(1) (dij (1) )nn ;
lv; v; s(k+1)=v; k=k+1; u=s(k); end l z 输出结果为: l=0 2 1 7 3 6 9 12 z=1 1 1 6 2 5 4 5
注:l输出的是u1到u1、u2、…、u8各个顶点的 最短路径距离。 z输出的是最短路径中u1、u2、…、u8的父节点。
%求从u0到uj0的最短路径 disp('起点为u1.'); j=input('输入终点u'); disp('下面求从起点u1到终点'); j, disp('的最短路径。'); lj=[]; while j~=1 lj=[[j],lj]; j=z(j); end lj=[[1],lj]; lj 例如求u1到u8的最短路径,程序执行后输出为:1 2 5 6 8 各位有兴趣还可以考虑将图可视化,点击屏幕输入终点以及 在图形上输出显示最短路径。
1, vi 是e j的起点 mij 1, vi 是e j的终点 0, vi与e j 不关联
例1
v1 e1 v2
e2 e5
v4
1 e4 1 M 0 0
v3
0 1 0 1
0 0 1 1
0 1 1 0
1 0 0 1
e3
② 邻接矩阵
无向图G,邻接矩阵A=(aij) 1, vi与v j 相邻(即vi与v j 之间有边) aij 0, vi与v j 不相邻 有向图G,邻接矩阵A=(aij)
dij (2) min{dij (1) , di 2(1) d2 j (1)} , D(2) (dij (2) )nn , 第2步: dij (2) 是从ui到uj的只允许以u1、u2作为可行中间点
的路径中最短路的长度;
…… dij (n) min{dij (n1) , di 2(n1) d2 j (n1)} , D(n ) (dij (n ) )nn , 第n步: dij ( n)是从ui到uj的只允许以u1、u2、……、un作为 可行中间点的路径中最短路的长度; 则最后输出的矩阵D中元素aij即为ui和uj之间的最短 距离。
v3
8.1 最优连线问题(最小生成树)
例1 现需从自来水厂接自来水管道到各个城镇,自 来水厂到各城镇之间铺设自来水管道价格如下,问 如何铺设最经济。
A 8 B
5
E 1
7 6
水厂
3 10
D 9
C
分析: ①显然铺设的自来水管道要连通各个顶点; ②铺设的管道中如果有回路,则去掉一条边,仍可 行。 故所铺设的管道是连通各个顶点且没有回路的 图形,称为图G的生成树。 我们的目标是寻找一颗图G的生成树,其各条 边的权之和最小,称为最小生成树。 1956年,Kruskal给出了一种求最小生成树的 算法,称为避圈法。
ch8 图论模型
图论是离散数学的重要分支,在物理学、化学、 系统工程、电力通讯、编码理论、可靠性理论、科 学管理、电子计算机等各个领域又具有极其广泛的 应用。 图论的历史可以追朔到1736年,这一年29岁的 瑞士大数学家Euler发表了图论的第一篇论文,解决 了著名的哥尼斯堡七桥问题。
现实Leabharlann Baidu活中的公路交通网、铁路交通网、灌溉 网、自来水(石油、天然气)管道网、电话线网计 算机通讯网、输电线网等,都可以用上述图的方式 来描述和分析解决问题。
e2 e5
e4
M
v2
v3
v4
v4
0 0 0 1
1 0 1 0
0 0 0 1
0 1 0 0
e3
v3
例3
v1 2 v2
v1 v1 v2 v3 v4
3 7
8
M
v2
v3
v4
v4
0 7
2 0 8
0 5
3 0
5
1
有兴趣可以用Kruskal算法计算一下,看是否有区别。
8.2 最短通路问题
1 Dijkstra算法
在各种网络的铺设、网络的输送、线路的安排等问 题中,经常涉及确定一条最短路。1959年,荷兰数 学家E.W.Dijkstra给出了该问题的一个解法。
u2
2 7 5 3 9 1
u5
u1
8
u3
1 10 1
1, 从vi到v j 有有向边 aij 0, 从vi到v j 无有向边 有向赋权图G,邻接矩阵A=(aij)
wij , 从vi到v j 有有向边,且wij 为其权 aij 0, 若i j , 从v 到v 无有向边 i j
例2
v1 e1 v2
v1 v1 v2 v3 v4
Floyd算法程序:
%floyd.m(Floyd程序 for k=1:n 需要调用子函数) for i=1:n function [D,R]=floyd(a) for j=1:n n=size(a,1); if D(i,k)+D(k,j)<D(i,j) D=a; D(i,j)=D(i,k)+D(k,j); for i=1:n R(i,j)=R(i,k); for j=1:n end R(i,j)=j; end end end end k R D R end
rij ( n) p1 ,则点p1是点i到点j最短路的中间点, 若 R(k ) (rij (k ) )nn ,(k 1,2,..., n) rij ( k ) 的意思是从ui到uj的最短路要经过点号为 rij ( k ) 的
然后用同样的方法再分头查找:
rip1 (n) p2 , rip2 (n) p3 ,..., ripk (n) pk ①向点i追溯得: rp1 j (n) q1, rq1 j (n) q2 ,,..., rqm j (n) j ②向点j追溯得:
算法如下:
(1)选择边 e1 ,使得
w(e1 ) 最小; (2)若已经选定边 e1 , e2 ,..., ei ,则从剩余边集 E \{e1 , e2 ,..., ei }中选取 ei 1 ,使①新选边与之前选
择的边组成图为无圈图,②新选边是满足①的尽可能 小的权。 (3)当(2)不能继续执行时停止。
对于有向图的顶点的度数,还可分为出度 d (v) 和 入度 d (v) 。 定理:
d (v ) 2 m
i 1 i
n
4 图的矩阵表示 ① 关联矩阵 无向图G,关联矩阵M=(mij)
1, vi与e j 关联 mij 0, vi与e j 不关联
有向图G,关联矩阵M=(mij)
2
1
u5
2
7 5
3
3 9
u1
u3
u6
0
8
7
10
1
2
6
5 5 6
u8
1
u4
1
10
9
u7
第七步:min{12,11,15},u8。
u2
2
1
u5
2
7 5
3
3 9
u1
u3
u6
0
8
7
10
1
2
6
5 5 6
11 u8
1
u4
1
10
9
u7
%road1.m (dijkstra算法程序)
w=[0 2 1 8 inf inf inf inf; 2 0 inf 6 1 inf inf inf; 1 inf 0 7 inf inf 9 inf; 8 6 7 0 5 1 2 inf; inf 1 inf 5 0 3 inf 9; inf inf inf 1 3 0 4 6; inf inf 9 2 inf 4 0 3; inf inf inf inf 9 6 3 0]; n=size(w,1); w1=w(1,:); for i=1:n l(i)=w1(i); z(i)=1; end s=[];