当前位置:文档之家› 图论及其算法

图论及其算法

《图论及其算法》--最短路问题学院:通信学院姓名:周旋学号: S110131133 指导老师:陈六新摘要图论是数学的一个分支,它以图为研究对象。

图论中的图是由若干给定的点及连接两点的线所构成的图形,这些图形通常用来描述某些事物之间的特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有的关系。

通过对《图论及其应用》中最短路问题的深入学习,本文利用Dijkstra算法来解决日常生活中寻找最短路的问题。

同时也是对本学期学习知识的巩固。

关键词:最短路径 Dijkstra算法迭代AbstractGraph theory is a branch of mathematics, it studies the object of picture. Graph theory graph is given by the number of points and lines connecting the two points of the graphic form. These graphics are often used to describe a specific relationship between certain things. And with the point on behalf of things, with the line connecting the two points that have a corresponding relationship between two things. Through the "Graph Theory and Its Applications," in-depth study of the shortest path problem.In this paper, we use The Dijkstra's algorithm not only to solve everyday life to find the shortest path problem, but also for the consolidation of the semester to learn the knowledge.Keyword: shortest path Dijkstra's algorithm Iteration引言边上有数的图成为加权图(weighted graph)。

若边e标记数k,称边e的权(weight)为k。

在加权图中,链(迹、路)的长度为链(迹、路)上所有边的权值的和。

在加权图中,我们经常需要找出两个指定点之间的最短路(如有最小长度的路),通常称其为最短路问题(shortest path problem),解决最短路问题存在几个不同的算法。

我们要介绍的是迪克斯拉屈算法,这是荷兰计算机科学教授Edsger W.Dijkstra(1930- )在1959年发现的一个算法。

他在1972年获得美国计算机协会授予的图灵奖,这是计算机科学中最具声望的奖项之一。

第一章迪克斯屈拉算法1.1算法介绍Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。

主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

注意该算法要求图中不存在负权边。

Procedure Dijkstra(G:所有权都为正数的加权连通简单图){G带有定点a=v0, v1 ……,v n=z和权w(v i , v j),若{ v i, v j }不是G中的边,则w(v i, v j)=∞}For i:=1 to nL(vi):=∞L(a): =0S:=φ{初始化标记,a的标记为0,其余结点标记为∞,S是空集}While z Sbeginu:=不属于S的L(u)最小的一个顶点S:=S{u}for 所有不属于S的顶点vif L(u)+w(u,v) < L(v)then L(v):=L(u)+w(u,v){这样就给S中添加带最小标记的顶点并且更新不在S中的顶点标记}end {L(z)=从a到z的最短路的长度}1.2 根据Dijkstra 算法给出的定理定理 1 迪克斯屈拉算法求出连通简单无向加权图中的两个顶点之间最短路的长度。

迪克斯屈拉算法通过一步一步的迭代求出最短路径,假设在第k 次迭代中。

在s 中的顶点v 的标记L(v)是从a 到这个顶点v 的最短路的长度。

不在s 中的顶点的标记是(除了这个顶点自身之外)只经过s 中顶点的从a 到这个顶点的最短路的长度。

设u 是第k 次迭代结束时带最小标记的不在s 中的顶点(若该顶点不唯一,可采用带最小标记的任意顶点)。

在第k+1次迭代中,u 是添加到s 中的顶点,则在第k+1次迭代中,u 的标记必须是a 到u 的最短路的长度。

否则,k 次迭代后,从结点a 到某个结点l 的路,其路得长度小于Lk (v )。

定理2 迪克斯屈拉算法使用O (n2)次运算(加法和比较)来求出n 阶连通简单无向加权图中两个顶点之间最短路的长度求加权无向图中最短路的Dijkstra 算法可以推广到求加权有向图中最短有向路。

定理3 设有向图G 中不含长度非正的有向圈,并且从点1到其余各点都有有限长的有向路。

定理4 设Sj 是加权有向图G 中自结点1到结点j 的最短有向路的长度,并且对所有的j=1,2,3,……,n ,Sj 为有限值。

若图G 中除结点1外的其余各点能重新编写成如下的序号2,3,……,n 使得对所有i<j ,成立S S £且w(j,i)或者i S S ³且w<j,i>=,即<j,i>E (G ),则定理5 设G=<V,E>是一个边权为正值的有向图,其中V={1,2,3……,n}。

则在G 中,任意一条最短有向路得长都大于它的真子有向路的长。

Dijkstra 算法求出了图中一个特定顶点到其他各定点的最短路,可以利用Dijkstra 算法解决实际生活中的一些问题。

第二章Dijkstra算法实际应用2.1 问题的提出在现实生活中,我们常常会遇到很多问题,都是要找到一个地方到另一个地方的最短路径,当然还要满足各方面的要求,包括可实现性、预算、带来的利益等各方面条件。

比如Dijkstra算法在城市交通中的应用,在铺设电线以及水管方面的应用。

通常我们解决的办法就是找到一条距离最短,又在现实可接受范围内的路径。

2.2 运用Dijkstra算法解决具体问题我们中国地形比较复杂,要想从一个城市修建到另一个城市的铁路,需要经过各方面精确的计算,考虑到各种地形、环境、气候因素,在两个城市间建设最短路程的铁路同时又要满足尽可能多的路过更多的城市,使交通更加方便,节约成本。

比如就以乌鲁木齐到上海的铁路修建为例,其间要经过很多城市,通过不同的地形,有山地、丘陵、高原、平原等。

考虑到尽可能多的路过城市,节约成本、环节交通压力,与此同时同样重要的是找到一条最短的路径,才能够节约材料、时间。

假设乌鲁木齐跟上海之间主要有这样几个城市:西宁、重庆、郑州、武汉、西安。

主要是分为北线和南线,北边是西宁、郑州;南边是重庆、武汉。

为了方便直观观察,根据这几个城市的地理位置,画一张简单的地理位置图。

图中字母分别表示A(乌鲁木齐),B(西宁),C(西安),D(重庆),E(武汉),F(上海)。

根据具体情况,以及两地间的距离,我们用1—10来表示两地之间的长度,即1表示最短,10表示最长,一共10个刻度,例如新疆到重庆就比新疆到西宁要远,而且穿越的山地较多,所以表示的刻度值也大。

相应的我们得出两个城市之间的长度(即权值),由于铁路设计涉及到要在可能的情况下经过更多的城市,所以有些直接到达的路径没有画出,例如从B(西宁)直接到F (上海)。

根据实际距离以及地形因素,在图中给出了相应比例的权值,如图所示。

下面通过Dijkstra算法,求出从A(乌鲁木齐)——F(上海)的最短铁路路径。

定义A点为L(A)=0,S为标记的集合。

第0次迭代:L(A)=0,所以L(B)= L(C)= L(D)= L(E)= L(F)=¥集合S={A}第1次迭代:其他结点到A的权值最小的一个w(a,b)=4, w(a,d)=8,其余为¥。

那么S={A,B}第2次迭代:从B点出发,找出剩下结点到B权值最小的w(b,c)=7, w(b,d)=6, w(b,e)=5,其余为¥。

S={A,B,E}第3次迭代:从E点出发,找出剩下点到E权值最小的w(e,c)=4, w(e,f)=3,其余为¥(由于不会倒回,所以只计算前面的结点)S={A,B,E,F}结论:根据Dijkstra 算法,可以求出从A 到F 的最短路径为{A,B,E,F},以上只是Dijkstra 算法在生活中的一个简单的应用,看上去并没有简单很多,但对于很复杂的图来说,用Dijkstra 算法来求最短路径就会节省很多时间。

2.3 用Dijkstra 算法解决比较复杂的问题要求找出从a 点到g 点的最短路径。

对于这种比较复杂的,用一般的观察就很难找出从a 点到g 点的最短路径,所以就必须利用比较简单的算法,根据Dijkstra 算法通过几次迭代可以很容易求出。

第0次迭代:L (a )=0,集合S={a}第1次迭代:w(a,b)=2, w(a,c)=4, w(a,c)=4 w(a,d)=1, w(a,e)=3S={a,d}第2次迭代:w(d,b)=2, w(d,f)=3, w(d,e)=3S={a,d,b}第3次迭代:w(b,c)=5, w(b,f)=2S={a,d,b,f}ag bd c e5第4次迭代:w(f,c)=1, w(f,e)=2, w(f,g)=6S={a,d,b,f,c}第5次迭代:w(c,e)=2, w(c,g)=4S={a,d,b,f,c,e}第6次迭代:w(e,g)=1S={a,d,b,f,c,e,g}结论:通过一系列迭代,可以找到a点到g点的最短路径,可以看见,对于这种比较复杂的图,通过直观的观察我们很难找到最短路径,所以通过《图论及其算法》中学过的Dijkstra算法可以大大简化,节约时间。

第三章结论通过本学期对《图论及其算法》的学习,使我深刻体会到了图论在实际生活中的广泛应用,也使从以前的定向思维上升了一个台阶,学会把抽象的变为具体,能用图、点、线来描述抽象的事物,把很多抽象的知识具体化,使得抽象的知识更容易理解、记忆。

相关主题