当前位置:文档之家› Dijkstra最短路径算法的优化和改进

Dijkstra最短路径算法的优化和改进

Dijkstra最短路径算法的优化和改进
Dijkstra最短路径算法的优化和改进

本科毕业设计(论文)Dijkstra最短路径算法的优化和改进

学生姓名:。

指导教师:屹

专业、班级:信息

院(系):理

2013 年 6 月吉林

摘要

随着计算机和地理信息科学的发展,GIS(地理信息系统)的应用领域越来越广.最短路径分析是GIS地理网络分析功能中的一个关键性的问题.计算最短路径的经典算法之一就是Dijkstra算法,许多工程中解决最短路径问题都是采用这种算法.然而,传统的Dijkstra算法在求解节点间最短路径时,对已标识节点外的大量节点进行了计算,从而影响了算法的速度.

该算法的主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍.本文在传统Dijkstra算法的基础上,对其进行了优化,此优化算法只对最短路径上节点的邻点做了一些处理,从而不涉及到其他的一些节点.提出的优化算法在更新最短路径值与选择最短路径值最小的节点时,仅仅涉及到节点的邻居集合及已标识集合中所有节点的邻居集合与已标识集合的差集,其运行时间取决于转接点的邻居集合的元素数量多少.通过减小算法中成功搜索的搜索范围和改进算法的存储结构这两个主要的研究方向使算法得到优化.因而,此优化算法在计算的节点数较传统算法大幅减少,提高了算法的速度.本文通过实验和实际应用对改进后的算法进行了简单的验证.之后将一些算法的改进和实际例子相结合,这样就能使文章中算法的优化更为理想.

关键词最短路径;Dijkstra;优化算法

Abstract

With the development of computer and geographic information science, the applications of GIS (Geographic Information System) are becoming more and more widely. However, shortest path analysis is the key problem of network analyses, Dijkstra algorithm is a classic arithmetic for the shortest path. It is the academic foundation that many engineerings were solved in the shortest path is use. When a shortest path between nodes is searched with Dijkstra algorithm, a lot of nodes away from lagged nodes are involved, so that the efficiency of Dijkstra algorithm is low.

Main features of the algorithm is the starting point as the center outward expansion layers until it extended to the end point. Dijkstra's algorithm is very representative of the shortest path algorithm, in many professional courses in the basic content as described in detail. The proposed algorithm updates the shortest path in the value of the minimum value of the shortest path to the node, only the set of neighbors of the node related to the identified set and a neighbor set of all nodes in the identified set with the set difference, its running time depends transfer the contact elements of the set of neighbors of quantity. Successful search algorithm by reducing the search range and improved algorithm storage structure of these two main research directions to optimize the algorithm. Therefore,the number of processed nodes is largely reduced in the optimization algorithm, and efficiency of the optimization algorithm is improved. The improved algorithm is proved to be correct and efficient by experiments and practical application. After some of the algorithm and the combination of practical examples, so you can make the article more ideal algorithm optimization.

Keywords The shortest path; Dijkstra; Optimization algorithm

目录

摘要................................................................................................................................. I Abstract ......................................................................................................................... II 目录.............................................................................................................................. III 第1章绪论. (1)

1.1国内外最短路径算法的发展及其概况 (1)

1.2传统Dijkstra算法仍然存在的一些问题 (1)

1.3本文工作 (2)

第2章Dijkstra经典算法 (3)

2.1引言 (3)

2.2原理及应用 (3)

2.2.1 原理 (3)

2.2.2应用 (5)

2.3Dijkstra算法与其他主流算法的比较 (6)

2.3.1 搜索速度比较 (6)

2.3.2 搜索成功率比较 (7)

2.3.3 Dijkstra算法的优缺点 (8)

第3章两点间最短路的改进的Dijkstra算法及其MATLAB实现 (9)

3.1 Dijkstra矩阵算法I (9)

3.2 Dijkstra矩阵算法II (9)

第4章基于Dijkstra算法的优化算法的研究 (13)

4.1 几种优化算法 (13)

4.1.1 减小算法中成功搜索的搜索范围 (13)

4.1.2 改进算法的存储结构 (13)

4.2 本文对Dijlstra优化算法研究 (14)

4.2.1 优化目标 (14)

4.2.2 优化思路 (14)

4.2.3 问题描述 (15)

4.2.4 算法特点 (19)

4.3 优化和改进的结论 (20)

第5章Dijkstra算法在物流上的应用 (21)

5.1 最优配送路线选择问题 (22)

5.2 改进的Dijkstra 算法在最优配送路线确定中的实例 (24)

5.2.1 路径优化结果 (26)

结论 (28)

参考文献 (29)

致谢 (30)

附录 (31)

第1章绪论

最短路径算法是计算机科学与地理信息科学等领域研究的热点,其算法有很多种,其中传统的Dijkstra算法一般用于计算一个源节点到所有其他节点的最小代价路径,并且能够适应网络拓扑的变化,性能稳定,因而可以在运输路线规划等领域都应用广泛]1[.

1.1 国内外最短路径算法的发展及其概况

最短路径在20世纪初开始受到人们的重视,关于它的求解方法,当时有很多科学家在研究.但给出求解的基本思想的人直到1959年才出现,是一位名叫Edsger Wybe Dijkstra(迪杰斯特拉)的荷兰计算机科学家,他不仅给出了求解的基本思想,还给出了算法.他给出的算法主要解决的问题是从某一个固定的点到其他各点的最短路径问题.后来这个算法被誉为一代经典,被称作Dijkstra算法.后来,人们逐渐从两个方面来研究最短路径,分为完全信息情况下和不确定情况下.确定情况下对最短路径的研究的过程中,发展出了很多高效的算法,其中1958年的Bellman算法、1959年的Dijkstra算法、1969年的Dreyfus算法已成为确定情况下的经典算法[1].而不确定情况下对最短问题的研究又分成了四个方面:研究路段长度随机变化的最短路径问题,以Frank和Mirchandani为代表;研究不同费用函数最短路径问题,以Loui、Muethy和Sarkar为代表;研究时间独立情况下的路段长度随机变化的最短路径问题,Hall、LiPing Fu、L.R.Rilett、Elise和Hani 为代表;研究路段长度为区间范围的最短路径问题,以Tomas和Rajeev为代表.其中,第二方面问题的研究得出的结论是“当目标是期望最短路径时问题转化为将边的权重用期望值表示的最短路径问题”.

1.2 传统Dijkstra算法仍然存在的一些问题

原始Dijkstra算法在存储图形数据和运算时,基于网络的权矩阵,需要根据其节点与距离之间的关系,形成关联矩阵、邻接矩阵与距离矩阵,需要定义N

N

的数组来存储数据,其中N为网络的节点数,当网络的节点数较大时,将占用大量的计算机内存.

原始Dijkstra算法在运行时一般将网络节点分为未标记节点、临时标记节点和永久标记节点3种类型.网络中所有节点首先初始化为未标记节点,在搜索过程中和最短路径节点相连通的节点为临时标记节点,每一次循环都是从临时标记节点中搜索距离原点路径长度最短的节点作为永久标记节点,直至找到目标节点或者所有节点都成为永久标记节点才结束算法]2[.根据算法的描述可知对临时标记节点的遍历成为Dijkstra算法的瓶颈,影响了算法的执行效率.

1.3 本文工作

随着社会的不断进步,最短路径算法在人们的日常生活显得越来越重要.每天开车去上班,应该选择哪条公路才能使自己到公司的费用最低、时间最少,这是最短路径的问题;在网络路由中,怎样选择最优的路由路径,这也是最短路径问题]3[;在交通旅游、城市规划以及电网架设中怎样使其耗费的资金最少,这还是最短路径问题.由此可见对最短路径问题的研究是非常有意义的.

第2章 Dijkstra 经典算法

2.1 引言

Dijkstra 算法是典型最短路算法,用于计算一个节点到其他所有节点的最短

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

算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低]4[.如

何改进这一经典算法,成为了实现图论中赋权图中解决实际问题的重要课题.

2.2 原理及应用

Dijkstra (迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点

到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩

展到终点为止.Dijkstra 算法是很有代表性的最短路径算法,在很多专业课程中

都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.Dijkstra 一般

的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE

表的方式,这里均采用永久和临时标号的方式.该算法要求图中不存在负权边.

2.2.1 原理

Dijkstra 算法是1959年由E .W .Dijkstra 提出的图论中求最短路径的一个著名

的算法,使用其可以求得图中一点到其他各顶点的最短路径.原始的Dijkstra 算

法将网络结点分成3部分:未标记结点、临时标记结点和永久标记结点.网络中

所有结点首先初始化为未标记结点,在搜索过程中和最短路径中的结点相连通的

结点为临时标记结点,每次循环都是从临时标记结点中搜索距源点路径长度最短

的结点作为永久标记结点,直至找到目标结点或者所有的结点都成为永久标记结

点来结束算法.

假设每个点都有一对标号(i w ,j p ),其中j w 是从起源点s 到点j 的最短路

径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);

j p 则是从s 到j 的最短路径中j 点的前一点.求解从起源点i 到点j 的最短路径

算法的基本过程如下:

(1)初始化.起源点设置为:①0=s w ,s p 为空;②所有其他点:i w ∞=,i p ?=;

③标记起源点s ,记k =s ,其他所有点设为未标记的.

(2)检验从所有已标记的点k 到其直接连接的未标记的点j 的距离,并设置:

{}kj k j j d w w w +=,min 式中,kj d 是从点k 到j 的直接连接距离.

(3)选取下一个点.从所有未标记的结点中,选取j w 中最小的一个i :

i w j w min =,(所有未标记的点j ),点i 就被选为最短路径中的一点,并设为

已标记的.

(4)找到点i 的前一点.从已标记的点中找到直接连接到点i 的点*j ,作为

前一点,设置:i =*j .

(5)标记点i .如果所有点已标记,则算法完全推出,否则,记k =i ,转到

(2)再继续.

图2-1 Dijkstra 算法最短路径应用演示图

表2-1 0节点到4节点的最短路径 循环

红点集S K }0{D }1{D }2{D }3{D }4{D 初始化

}0{ - 0 10 ∞ 30 100 1

}1,0{ 1 0 10 60 30 100 2

}3,1,0{ 3 0 10 50 30 90 3

}2,3,1,0{ 2 0 10 50 30 60 4 }4,2,3,1,0{ 4 0 10 50 30 60

2.2.2 应用

给定简单定简单无向图G ,指定一顶点i V 为起点,对于任意 j V ∈G 且i ≠j ,求i V 到j V 的最短路径的长度]5[.

例:某单位使用一台设备,在每年年初,企业部门领导都要决定是购置新设备代替原来的旧设备,还是继续使用旧设备.若购置新设备,需要支付一定的购置费用;若继续使用旧设备,需支付一定的维修费用.设该种设备在每年年初的价格(万元)见表2-2使用的不同时间(年)的设备所需要的维修费用(万元)见表2-3.问如何制定一个五年之内的设备更新计划,使总费用最少.

表2-2 价格表

第i 年

1 2 3 4 5 价格 11 12 13 12 13

表2-3 维修费用表

使用年数x

1≤x 21≤

图2-2 赋权有向网络图

用点Vi 表示“第i 年年初购进一台新设备”这种状态,i =1,2,…,5,用6V 表示第五年底的状态.对于每个i =1,2,…,5从i V 到1+i V ,…;6V 各画一条弧,弧(i V ,j V )表示在第i 年年初购进一台设备一直使用到第j 年年初(即第1-j 年底).每条弧的权可按已知的数据计算出来,例如(1V ,4V )表示第一年年初购进一台新设备,需支付11万元,一直使用到第三年年底,需维修费(5+6+8)万元=19万元,故其上的权为30.

这样就可以得到一个赋权有向网络,如图2-3所示,所求问题等价于需找从1V 到6V 的最短路问题.用Dijkstra 算法求解,最优解为(1V ,4V ,6V ),即分别在第1、4年年初购买一台新设备,总费用为53万元.上述为Dijkstra 最基本的求解路径的方法.

2.3 Dijkstra 算法与其他主流算法的比较

2.3.1 搜索速度比较

对5张图分别采用Dijkstra 算法、*A 算法、遗传算法进行路径规划,他们各自花费的时间如表2-4所示.

表2-4 算法速度对比图

搜索速度

节点数

Dijkstra算法遗传算法A*算法

16 1 2 1

<

32 4 4 2

43 7 6 3

62 15 9 5

78 25 12 7

由上表可以看出:当地图节点个数和弧的条数比较少时,三种算法所花费的时间差不多,当节点个数和弧的条数比较多时,A*算法最快,遗传算法其次,Dijkstra算法最慢,而且这种差距将随节点和弧数量的增加而变得更加明显.对于实际地图而言,由于节点与道路的数量一般都很的大,Dijkstra算法在搜索速度方面弱势明显.

2.3.2 搜索成功率比较

对于具有n个节点的地图,其待规划节点的个数为1

n(除起点节点外,其

-

他均可作为待规划节点),由于每个待规划节点对应于一条最短路径,所以对每张具有n个节点的地图而言,应该规划出1

n条最短路径.

-

对5张地图分别采用三种算法进行路径规划,三者各自搜索到最短路径的情况如表2-5所示.表中括号外数据为各算法实际得到最短路径数,括号内数据则为各算法实际得到路径数和应该规划出的最短路径数1

n之比.

-

表2-5 三种算法在搜索质量方面的对比

A算法遗传算法节点数Dijkstra算法*

16 15(100%)12(80%)15(100%)

32 31(100%)25(81%)29(94%)

43 42(100%)32(76%)38(90%)

62 61(100%)40(66%)56(92%)

78 77(100%)45(58%)71(92%)

由表2-5可以看出:当地图节点个数和弧数量比较多时,Dijkstra算法是一种遍历算法,每次能保证100%搜索到最短路径,遗传算法搜索到最短路径的成功率比Dijkstra算法低一些,*

A算法最低,且这种差距在节点数和弧数量越大时更加明显.

2.3.3 Dijkstra算法的优缺点

Dijkstra算法能够保证100%找到最优解,但其搜索速度较慢,搜索效率非常低,时间花费较多,一般只能用于离线的路径规划问题.

如节点数为n的图,用Dijkstra算法计算最短路径总共需要迭代1

-

n次,每次迭代都新加一个节点到临时节点集合中,由于第i次迭代时不在临时节点集合中的节点数为i

n-.即第i次迭代需对i

n-个节点进行处理,因此其所需的处理数为:

2)1

(

)

(

1

1-

=

-∑-

=

n n

i

n

n

i

对n个节点网络的时间复杂度是)

(2n

O.在实际应用当中,使用Dijkstra算法查找最短路径时耗费大量的时间进行数据的比较,本文对Dijkstra算法进行分析,通过改变算法实现减少不必要节点计算的时间,提高算法的效率达到对其进行优化.

第3章 两点间最短路的改进的Dijkstra 算法及其

MATLAB 实现

3.1 Dijkstra 矩阵算法I

Dijkstra 矩阵算法I 比Dijkstra 算法更容易在计算机上实现,它能够计算加权图中任意两顶点之间的最短距离.该算法的基本思想是将加权图),(E V G 存储在矩阵()n n ij a A ?=里该矩阵可定义为

????≠∞≠==无连边与,顶点若有连边

与,顶点若若j i j i v v j i ,v v j i ,j i ,0ij ij a ω

其中,n 为图G 的顶点个数,ij ω为边j i v v 的权重.

将Dijkstra 算法的思想影响用于此矩阵的第k 行,可求出顶点k v 到其他各项点的最短距离,将最短距离仍保存在矩阵A 的第k 行,其中k =1,2,…,n .当算法结束时,矩阵A 的元素值就是任意两顶点之间的最短距离]6[.

3.2 Dijkstra 矩阵算法II

Dijkstra 矩阵算法I 只是简单地将Dijkstra 算法的思想应用到矩阵的每一行,这样做有很多的重复计算,效率不高.为了提高效率,有提出了下面的Dijkstra 矩阵算法II ,步骤如下:

步骤1 输入加权图,存储在矩阵()n n ij a A ?=里;

步骤2 对矩阵A 进行操作,求任意两顶点间的最短距离.算法的求解过程; 循环k 以1为步长,从1到1-n ,

执行,{}n k k k b ,, ,21,1,,2,1++-←,

length kk ←()b ,

k id a ←_;

{}n k k b ,,2,11 ++←;

()11b length kk ←;

循环.反复执行下列语句,直到0=kk ;

循环.J 以1为步长,从1到1kk ,执行;

若()()()()te j b k a j b k a te ←<1,,1,

1←miid

循环.J 以1为步长,从2到kk ,执行

若()()()().,,,j miid miid b k a j b k a ←<

()miid b id a ←_;

()()[]kk miid b miid b b :1,1:1+-←;

%在数组[]b 中去掉一个元素

()b length kk ←;

%数组[]b 的长度减少了1

若k id a >_,执行

()id a b find miid _11==←;

()()[]1:111,11:111kk miid b miid b b +-←

循环.J 以1为步长,从1+k 到n ,执行

()),(,j k a k j a ←.

步骤3 则算法结束.

算法II 与算法I 比较,在步骤循环的次数随着k 的增加而减少,循环体的执行总次数会减少一半.

Dijkstra 矩阵算法II 的MATLAB 实现见附录.

3.2.1 简单实例

我们举下面图3-1中顶点

v到其他顶点的最短距离这个例子.

1

图3-1 实例图

用MATLAB求解的主程序如下:

n=12;

a=ones(n)+inf;

for i=1:n

a(i,i)=0;

end

a(1,2)=5;

a(2,3)=8;

a(2,6)=5;

a(3,4)=3;

a(3,9)=10;

a(4,5)=5;

a(4,7)=3;

a(5,6)=2;

a(7,8)=2;

a(8,9)=4;

a(8,11)=6;

a(9,10)=3;

a(10,11)=5;

a(10,12)=3;

>> dij2_m(a)

计算结果如下:

图3-2 运行结果

第4章基于Dijkstra算法的优化算法的研究

4.1 几种优化算法

4.1.1 减小算法中成功搜索的搜索范围

减小算法中成功搜索的搜索范围以尽快到达目标节点.在对现实问题中的交通图初始化为网络拓扑图时,虽然终点已知,而源点尚未确定,但依据常识离案发地段最近的派出所应为案发地段所在辖区派出所,或其周边派出所,也就是源点的选取范围可以确定.利用MapObjects2组件提供的MapLayer.SearchExpression (expression)记录集筛选方法,根据案发地段(终点)的不同,动态选取案发地段所在辖区及相邻辖区的道路图层及派出所图层数据进行最短路径查询,从而有效地减少了拓扑图中节点总数n的值]7[.

4.1.2 改进算法的存储结构

在实际工作中,还要建立起空间数据结构.网络数据结构使用的是“边和节点”的数据结构,该数据结构是建立在图论的基础上,节点可用来定义边的连接关系.对于网络数据的存储,传统的是采用图论中的邻接矩阵方法,其存储量为N (N为网络中节点数).通常的地理网络,尽管节点很多,但与节点相关联N

的节点数目并不多,一般都为稀疏图,将会浪费大量的空间.若采用邻接表的链式存储结构,其存储量为E(E为节点列表中,同节点关联的所有边的数目),可节省大量的存储空间,尤其是在表示与节点和边相关信息较多的地理网络时,更为有效.但邻接表却难以判断两节点之间的关系,因此本文提出利用.NET框架提供的特殊类Hashtable.NET框架包含特殊类,比如通常所说的集合类用于存储对象.与数组类似,集合类可以把对象放入容器中,然后再取出.但集合的使用方法与数组不同,拥有用于插入和删除项的专用方法.使用Hashtable最大的优点就是大大降低数据存储和查找的时间花费]8[.

4.2 本文对Dijlstra 优化算法研究

4.2.1 优化目标

Dijkstra 算法用来求解图上从任一节点(源点)到其余各节点的最短路径.其时间复杂度为)(2n O ;采用邻接矩阵存储网络拓扑结构,需要)(N N ?的存储空间,随着节点数N 的增大,其计算效率和存储效率越低.针对此问题,提出了Dijkstra 算法的改进,本文在对传统Dijkstra 算法分析的基础上,对其进行了优化,优化算法只对最短路径上节点的邻居做处理,而不涉及到其他节点.

4.2.2 优化思路

Dijkstra 算法基本方法:设j W 是从源点s 到节点j 的最短路径长度;j p 是从s 到j 的最短路径中j 点的前一节点.S 是标识集合;T 是未标识集合;M 是节点集合.ij d 是节点i 到节点j 的距离(i 与j 直接相连,否则ij d ∞=).算法步骤如下:

Step0:S {}s =;T =S M -;j W =ij d (T j ∈,s 与j 直接相连)或

j W ∞=(T j ∈,s 与j 不直接相连).

Step1:在T 中找到节点i ,使s 到i 的距离最小,并将i 划归到S (可从与s 直

接相连的j 中考虑)

若si d = min sj d ,j 与s 直接相连,则将i 划归到S 中,即S {}i s ,=,

T {}

i T -=;T j ∈;i P =S . Step2:修改T 中j 节点的j w 值:j W =()ij i j d W W ++,min ;若j W 值改变,则

i P i =.T j ∈;S i ∈.

Step3:选定所有的j W 最小值,并将其划归到S 中:

i W =j W min ;S }{i S ?=;T {}i T -=;若s n =,所有节点已标识,

最短路径的Dijkstra算法及Matlab程序

两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。 以各城镇为图G 的顶点,两城镇间的直通铁路为图G 相应两顶点间的边,得图G 。对G 的每一边e ,赋以一个实数)(e w —直通铁路的长度,称为e 的权,得到赋权图G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。 求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。 (i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。 (ii) 对每个i S v ∈(i i S V S \=),用 )}()(),({min uv w u l v l i S u +∈ 代替)(v l 。计算)}({min v l i S v ∈,把达到这个最小值的一个顶点记为1+i u ,令}{11++=i i i u S S 。 (iii). 若1||-=V i ,停止;若1||-

Dijkstra算法

5.3.4 附录E 最短路径算法——Dijkstra 算法 在路由选择算法中都要用到求最短路径算法。最出名的求最短路径算法有两个,即Bellman-Ford 算法和Dijkstra 算法。这两种算法的思路不同,但得出的结果是相同的。我们在下面只介绍Dijkstra 算法,它的已知条件是整个网络拓扑和各链路的长度。 应注意到,若将已知的各链路长度改为链路时延或费用,这就相当于求任意两结点之间具有最小时延或最小费用的路径。因此,求最短路径的算法具有普遍的应用价值。 令v 部分: 不直接相连与结点若结点 1 v ? ?∞在用计算机进行求解时,可以用一个比任何路径长度大得多的数值代替∞。对于上述例子, 可以使D (v ) = 99。 (2) 寻找一个不在N 中的结点w ,其D (w )值为最小。把w 加入到N 中。然后对所有不在N 中的结点v ,用[D (v ), D (w ) + l (w , v )]中的较小的值去更新原有的D (v )值,即: D (v )←Min[D (v ), D (w ) + l (w , v )] (E-1) (3) 重复步骤(2),直到所有的网络结点都在N 中为止。 表E-1是对图E-1的网络进行求解的详细步骤。可以看出,上述的步骤(2)共执行了5次。表中带圆圈的数字是在每一次执行步骤(2)时所寻找的具有最小值的D (w ) 值。当第5次执行步骤(2)并得出了结果后,所有网络结点都已包含在N 之中,整个算法即告结束。 表E-1 计算图E-1的网络的最短路径

现在我们对以上的最短路径树的找出过程进行一些解释。 因为选择了结点1为源结点,因此一开始在集合N中只有结点1。结点1只和结点2, 3和4直接相连,因此在初始化时,在D(2),D(3)和D(4)下面就填入结点1到这些结点相应的距离,而在D(5)和D(6)下面填入∞。 下面执行步骤1。在结点1以外的结点中,找出一个距结点1最近的结点w,这应当是w = 4,因为在D(2),D(3)和D(4)中,D(4) = 1,它的之值最小。于是将结点4加入到结点集合N中。这时,我们在步骤1这一行和D(4)这一列下面写入①,数字1表示结点4到结点1的距离,数字1的圆圈表示结点4在这个步骤加入到结点集合N中了。 接着就要对所有不在集合N中的结点(即结点2, 3, 5和6)逐个执行(E-1)式。 对于结点2,原来的D(2) = 2。现在D(w) + l(w, v) = D(4) + l(4, 2) = 1 + 2 = 3 > D(2)。因此结点2到结点1距离不变,仍为2。 对于结点3,原来的D(3) = 5。现在D(w) + l(w, v) = D(4) + l(4, 3) = 1 + 3 = 4 < D(3)。因此结点3到结点1的距离要更新,从5减小到4。 对于结点5,原来的D(5) = ∞。现在D(w) + l(w, v) = D(4) + l(4, 5) = 1 + 1 = 2 < D(5)。因此结点5到结点1的距离要更新,从∞减小到2。 对于结点6,现在到结点1的距离仍为∞。 步骤1的计算到此就结束了。 下面执行步骤2。在结点1和4以外的结点中,找出一个距结点1最近的结点w。现在有两个结点(结点2和5)到结点1的距离一样,都是2。我们选择结点5(当然也可以选择结点2,最后得出的结果还是一样的)。以后的详细步骤这里就省略了,读者可以自行完 1的路由表。此路由表指出对于发往某个目的结点的分组,从结点1发出后的下一跳结点(在算法中常称为“后继结点”)和距离。当然,像这样的路由表,在所有其他各结点中都有一个。但这就需要分别以这些结点为源结点,重新执行算法,然后才能找出以这个结点为根的最短路径树和相应的路由表。

dijkstra算法

迪克斯特拉算法: 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 定义: Dijkstra算法一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN,CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点V0到S中其他各顶点的长度都不大于从V0到T 中任何顶点的最短路径长度 (2)每个顶点对应一个距离值 S中顶点:从V0到此顶点的长度 T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度

依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和。 (反证法可证) 求最短路径步骤 算法步骤如下: G={V,E} 1.初始时令S={V0},T=V-S={其余顶点},T中顶点对应的距离值 若存在,d(V0,Vi)为弧上的权值 若不存在,d(V0,Vi)为∞ 2.从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中 3.对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值 重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

计算最短路径的Dijkstra算法的编程实现

计算最短路径的Dijkstra算法的编程实现 实验环境: C++ 为了进行网络最短路径路径分析,需将网络转换成有向图。如果要计算最短路径,则权重设置为两个节点的实际距离,Dijkstra算法可以用于计算从有向图中任意一个节点到其他节点的最短路径。 算法描述: 1)用带权的邻接矩阵来表示带权的n个节点的有向图,road[i][j]表示弧< vertex i, vertex j>的权值,如果从vertex i到vertex j不连通,则road road[i][j]=无穷大=9999。引进一个辅助向量Distance,每个Distance[i]表示从起始点到终点vertex i的最短路径长度。设起始点为first,则Distance[i]= road[first][i]。令S为已经找到的从起点出发的最短路径的终点的集合。 2)选择vertex j使得Distance[j]=Min{ Distance[i]| vertexi∈V-S},vertex j就是当前求得的一条从起始点出的的最短路径的终点的,令S=S∪{ vertex j} 3)修改从起始点到集合V-S中任意一个顶点vertex k的最短路径长度。如果Distance[j]+ road[j][k]< Distance[k],则修改Distance[k]为:Distance[k]= Distance[j]+ road[j][k]。 4)重复2,3步骤操作共n-1次,由此求得从起始点出发到图上各个顶点的最短路径长度递增的序列。 算法复杂度为O(n2)。 程序代码如下: #include #include "Dijkstra.h" int main() { int Graph_list_search[max][max]={{0,3,2,5,9999,9999}, {9999,0,9999,2,9999,9999}, {9999,9999,0,1,9999,9999}, {9999,9999,9999,0,9999,5}, {9999,9999,5,3,0,1}, {9999,9999,9999,9999,9999,0}}; printf_edge(Graph_list_search); Dijkstra(Graph_list_search,0,5); return 0; }

Dijkstra最短路径算法

5.3.4 附录E 最短路径算法——Dijkstra算法 在路由选择算法中都要用到求最短路径算法。最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法。这两种算法的思路不同,但得出的结果是相同的。我们在下面只介绍Dijkstra算法,它的已知条件是整个网络拓扑和各链路的长度。 应注意到,若将已知的各链路长度改为链路时延或费用,这就相当于求任意两结点之间具有最小时延或最小费用的路径。因此,求最短路径的算法具有普遍的应用价值。 下面以图E-1的网络为例来讨论这种算法,即寻找从源结点到网络中其他各结点的最短路径。为方便起见,设源结点为结点1。然后一步一步地寻找,每次找一个结点到源结点的最短路径,直到把所有 点1, j)为结点i (1) 初始化 令N表示网络结点的集合。先令N = {1}。对所有不在N中的结点v,写出

不直接相连与结点若结点直接相连 与结点若结点 1 1 ),1()(v v v l v D ? ? ?∞= 在用计算机进行求解时,可以用一个比任何路径长度大得多的数值代替∞。对于上述例子,可以使D (v ) = 99。 (2) 寻找一个不在N 中的结点w ,其D (w )值为最小。把w 加入到N 中。然后对所有不在N 中的结点v ,用[D (v ), D (w ) + l (w , v )]中的较小的值去更新原有的D (v )值,即: D (v )←Min[D (v ), D (w ) + l (w , v )] (E-1) (3) 重复步骤(2),直到所有的网络结点都在N 中为止。 表E-1是对图E-1的网络进行求解的详细步骤。可以看出,上述的步骤(2)共执行了5次。表中带圆圈的数字是在每一次执行步骤(2)时所寻找的具有最小值的D (w ) 值。当第5次执行步骤(2)并得出了结果后,所有网络结点都已包含在N 之中,整个算法即告结束。 表E-1 计算图E-1的网络的最短路径

数据结构课程设计报告Dijkstra算法求最短路径

中南大学 《数据结构》课程设计 题目第9题 Dijkstra算法求最短路径 学生姓名 XXXX 指导教师 XXXX 学院信息科学与工程学院 专业班级 XXXXXXX 完成时间 XXXXXXX

目录 第一章问题分析与任务定义---------------------------------------------------------------------3 1.1 课程设计题目-----------------------------------------------------------------------------3 1.2 原始数据的输入格式--------------------------------------------------------------------3 1.3 实现功能-----------------------------------------------------------------------------------3 1.4 测试用例-----------------------------------------------------------------------------------3 1.5 问题分析-----------------------------------------------------------------------------------3 第二章数据结构的选择和概要设计------------------------------------------------------------4 2.1 数据结构的选择--------------------------------------------------------------------------4 2.2 概要设计-----------------------------------------------------------------------------------4 第三章详细设计与编码-----------------------------------------------------------------------------6 3.1 框架的建立---------------------------------------------------------------------------------6 3.2 点结构体的定义---------------------------------------------------------------------------7 3.3 创立带权值有向图------------------------------------------------------------------------8 3.4 邻接矩阵的显示---------------------------------------------------------------------------9 3.5 递归函数的应用---------------------------------------------------------------------------10 3.6 Dijkstra算法实现最短路径--------------------------------------------------------------10 第四章上机调试------------------------------------------------------------------------------------11 4.1 记录调试过程中错误和问题的处理---------------------------------------------------11 4.2 算法的时间课空间性能分析------------------------------------------------------------11 4.3 算法的设计、调试经验和体会---------------------------------------------------------11 第五章测试结果-----------------------------------------------------------------------------------12 第六章学习心得体会-----------------------------------------------------------------------------12 第七章参考文献-----------------------------------------------------------------------------------12 附录------------------------------------------------------------------------------------------------------12

DIJKSTRA算法详细讲解

最短路径之Dijkstra算法详细讲解 1最短路径算法 在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括: (1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 (2)确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 (3)确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。 (4)全局最短路径问题:求图中所有的最短路径。 用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:Dijkstra算法、A*算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法。 本文主要研究Dijkstra算法的单源算法。 2Dijkstra算法 2.1Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 2.2Dijkstra算法思想 Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U 表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S 中的顶点为中间顶点的当前最短路径长度。 2.3Dijkstra算法具体步骤

Dijkstra算法

最短路径—Dijkstra算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图G=(V,E) 中,假设每条边E[i] 的长度为w[i],找到由顶点V0 到其余各点的最短路径。(单源最短路径) 2.算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S 中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2)算法步骤: a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边, 则正常有权值,若u不是v的出边邻接点,则权值为∞。 b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。 c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短, 则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。 d.重复步骤b和c直到所有顶点都包含在S中。 GPSR路由协议:(车载自组织网络中自适应路由协议研究_李诗雨) 2>基于地理位置的路由 随着科技的发展,现在的车辆通常都会具有全球定位系统,利用这个系统, 车辆可以随时随地查找出自己的地理坐标。于是越来越多的学者开始利用这些定 位系统来制定新的路由,如Greedy Perimeter Stateless Routing(GPSR)}ZO}。GPSR 是影响最广和应用范围最大的一个路由协议。它脱离了传统路由协议需要维护一 个全局静态路由,需要时刻去查看该路由的有效性的方式,而开始将更多的注意 力放到车辆四周的临近车辆,只依赖它们进行短距离的路由计算。在GPSR协议 中[[21],网络节点都可以通过GPS等方法获取自身的地理位置,源节点在发送数据 时会在报文里加入目的节点的GPS坐标,在后面每一跳节点都会查找自己的邻居 车辆,在其中找到一个距离目的节点在地理位置上最近的节点作为下一跳节点。

Dijkstra算法

Dijkstra 算法
Dijkstra 算法(狄克斯特拉算法) 算法(狄克斯特拉算法)
目录
[隐藏]
? ? ? ? ? o ?
1 2 3 4 5
Dijkstra 算法概述 算法描述 虚拟码 时间复杂度 Dijkstra 算法案例分析 5.1 案例一:基于 Dijkstra 算法在物流配送中的应用[1] 6 参考文献
[编辑]
Dijkstra 算法概述
Dijkstra 算法 算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于 1959 年提出的,因此 又叫狄克斯特拉算法。 是从一个顶点到其余各顶点的最短路径算法, 解决的是有向图中最短 路径问题。 其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权 都为正时, 由于不会存在一个距离更短的没扩展过的点, 所以这个点的距离永远不会再被改 变, 因而保证了算法的正确性。 不过根据这个原理, Dijkstra 求最短路的图不能有负权边, 用 因为扩展到负权边的时候会产生更短的距离, 有可能就破坏了已经更新的点距离不会改变的 性质。 举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离。 Dijkstra 算法可以用来找到两个城市之间的最短路径。 Dijkstra 算法的输入包含了一个有权重的有向图 G,以及 G 中的一个来源顶点 S。 我 们以 V 表示 G 中所有顶点的集合。 每一个图中的边,都是两个顶点所形成的有序元素对。 (u,v)表示从顶点 u 到 v 有路径相连。 我们以 E 所有边的集合,而边的权重则由权重函数 w: E → [0, ∞]定义。 因此,w(u,v)就是从顶点 u 到顶点 v 的非负花费值(cost)。 边的花费 可以想像成两个顶点之间的距离。 任两点间路径的花费值, 就是该路径上所有边的花费值总 和。已知有 V 中有顶点 s 及 t, Dijkstra 算法可以找到 s 到 t 的最低花费路径(i.e. 最短路径)。 这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。

迪杰斯特拉算法求解最短路径

#include #define MAX_VERTEX_NUM 50 #define INFINITY 300 typedef char VertexType[3]; typedef struct vertex { int adjvex;//顶¥点?编括?号? VertexType data;//顶¥点?信?息¢ }Vertex_Type;//顶¥点?类え?型í typedef struct graph { int Vertex_Num;//顶¥点?数簓 int Edge_Num;//边?数簓 Vertex_Type vexs[MAX_VERTEX_NUM];//顶¥点?数簓组哩? int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];// 边?的?二t维?数簓组哩? }AdjMatix;//图?的?邻ⅷ?接?矩?阵?类え?型í int Create_Adjmatix(AdjMatix &g) { int i,j,k,b,t,w; printf("请?输?入?图?的?顶¥点?数簓和í边?数簓:阰\n"); scanf("%4d%4d",&g.Vertex_Num,&g.Edge_Num); for (i=0;i0) g.edges[b][t]=w; else {printf("输?入?错洙?误?!?");return 0;} } return 1;

Dijkstra算法C代码

#include "stdio.h" #include "stdlib.h" #define M 10000 int dist[M] = {0},fa[M] = {0},visit[M] = {0}; int g[M][M] = {0}; int n,start,end; int findmin(){ int i,flag; int min = 987654321; for( i = 1 ; i<= n ; i++ ) if( visit[i] == 0 && dist[i] < min && dist[i] != 0){ min = dist[i]; flag = i; } return flag; } int Dijkstra(){ int i,j,pos; for( i = 1 ; i <= n ; i++ ){ dist[i] = g[start][i]; if( dist[i] == 123456789 ) fa[i] = i;

else fa[i] = start; } visit[start] = 1; for( i = 1 ; i <= n ; i++ ){ pos = 0; pos = findmin(); if(pos == 0) break; visit[pos] = 1; for( j = 1 ; j <= n ; j++ ) if( visit[j] == 0 && dist[j] > dist[pos] + g[pos][j] ){ dist[j] = dist[pos] + g[pos][j]; fa[j] = pos; } } } int main(){ int i,j; int p; scanf("%d%d%d",&n,&start,&end); for( i = 1 ; i <= n ; i++ )

Dijkstra算法求最短路径

Dijkstra算法求最短路径(C#版)行如下图的路径,(V0是中心): 经过该算法后转化为下图 using System; using System.Collections; using System.Text; namespace Greedy {

class Marx { private int[] distance; private int row; private ArrayList ways = new ArrayList(); public Marx(int n,params int[] d) { this.row = n; distance = new int[row * row]; for (int i = 0; i < row * row; i++) { this.distance[i] = d[i]; } for (int i = 0; i < this.row; i++) //有row个点,则从中心到各点的路有row-1条 { ArrayList w = new ArrayList(); int j = 0; w.Add(j); ways.Add(w); } } //------------------------------ public void Find_way() { ArrayList S = new ArrayList(1); ArrayList Sr = new ArrayList(1); int []Indexof_distance=new int[this.row]; for(int i=0; i < row; i++) { Indexof_distance[i]=i; } S.Add( Indexof_distance[0] ); for (int i = 0; i < this.row; i++) { Sr.Add( Indexof_distance[i] ); } Sr.RemoveAt(0); int[] D = new int[this.row]; //存放中心点到每个点的距离 //---------------以上已经初始化了,S和Sr(里边放的都是点的编

Dijkstra算法详细讲解

D i j k s t r a算法详细讲解 This model paper was revised by the Standardization Office on December 10, 2020

最短路径之D i j k s t r a算法详细讲解 1最短路径算法 在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括: (1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 (2)确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 (3)确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。 (4)全局最短路径问题:求图中所有的最短路径。 用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:Dijkstra算法、A*算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法。 本文主要研究Dijkstra算法的单源算法。 2 Dijkstra算法 2.1 Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 2.2 Dijkstra算法思想 Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2.3 Dijkstra算法具体步骤

Dijkstra算法原理详细讲解

Dijkstra算法原理详细讲解 如下图,设A为源点,求A到其他各顶点(B、C、D、E、F)的最短路径。线上所标注为相邻线段之间的距离,即权值。(注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一一对等) 算法执行步骤如下表:

Dijkstra算法的完整实现版本之算法的源代码 样例图: 输入格式: 输出格式:

输入时,将s,t,x,y,z五个点按照1,2,3,4,5起别名,输入格式按照下图例所示当提示Please enter the vertex where Dijkstra algorithm starts:时输入算法的起 始点 比如计算结果v1v4v2表示从点1到点2经过1,4,2为最短路径 Dijkstra算法的完整实现版本,算法的源代码 /* Dijkstra.c Copyright (c) 2002, 2006 by ctu_85 All Rights Reserved. */ #include "stdio.h" #include "malloc.h" #define maxium 32767 #define maxver 9 /*defines the max number of vertexs which the programm can handle*/ #define OK 1 struct Point { char vertex[3]; struct Link *work; struct Point *next; }; struct Link { char vertex[3]; int value; struct Link *next; }; struct Table /*the workbannch of the algorithm*/ { int cost; int Known; char vertex[3];

迪杰斯特拉算法计算最短路径

利用Dijkstra算法计算最短路径 摘要 福格环游地球问题是一个十分典型的最短路径求解问题,题设给出了当时世界上主要交通网络图及交通通畅的城市之间来往所需时长,并限定了福格的出行方向(福格选择的是往东走),给出起止地点后要求找出福格环游世界天数最短的最佳路径。 我们认为,这个问题的实质在于最短路径的求解和优化。我们对比图论中的多种最短路径算法,决定利用Dijkstra算法解决这个问题。 由于Dijkstra算法要求输入图G的关联矩阵,且图G为二维赋权图,而题中给出的地图可看成是三维环状地图,因此,我们对题设地图做相关处理,将其从起点处“切断”并展开为二维图,然后根据此图建立关联矩阵。同时,我们考虑到最短路径可能会与切断线有交点,在切断线以西找出若干地点一分为二,修改关联矩阵。 对于题目中缺失的两处数据,本文将以当时的交通数据为基础,经过合理的数据处理,结合Google Earth测距软件与题目数据的合理类比,补充缺失数据,完成关联矩阵。 得到关联矩阵后,我们分别以伦敦、纽约和上海作为起点,调整关联矩阵起点和终点,用matlab编程进行求解得到最短环游时间和最短路径,进而判断出所选择的路径是否能让他赢得赌注。根据我们的求解结果,在这三个城市,福格均能在80天内环游地球,赢得赌注。 本文进一步对此种算法的优缺点、灵敏度与推广性进行了分析,同时初步提出了两种优化方法。 关键词:最短路径算法 dijkstra算法算法优化

一、问题重述 儒勒?凡尔纳的著名小说《环游世界80天》中,英国绅士福格在伦敦与人打赌能够在80天内环游世界,这在当时的1872年是一个了不起的壮举。当时最快的旅行方式是火车和轮船,然而世界上大部分地区还是靠马车、大象、驴子或者步行来旅行。下面是一个从伦敦环游世界不同路线的交通网络图,福格选择的是往东走,每段路线所需要的天数显示在图上(见附录一),旅行的时间基于1872年能采用的旅行方式以及距离。 我们将解决以下问题: 1.我们将设计一个算法为福格选择一条最佳路径,即环游世界天数最短,并判断所选择的路径是否能让他赢得赌注。 2.若他在别的地方与人打赌,如纽约或者上海,我们将分别设计最佳路径并判断所选择的路径是否能让他赢得赌注。 二、问题分析 福格环游地球问题是一个十分典型的最短路径求解问题,题设给出了当时世界上主要交通网络图及交通通畅的城市之间来往所需时长,并限定了福格的出行方向(福格选择的是往东走),给出起止地点后要求找出福格环游世界天数最短的最佳路径。 本题实质在于最短路径的求解和优化,如何求解最短路径呢,我们联系到图论中求解最短路径的Dijkstra算法,然而,要满足Dijkstra算法的条件,首要任务是弄清如何处理题设所给的世界交通网络图。我们可以把题中给出的地图看成是三维环状地图,而Dijkstra算法要求输入图G的关联矩阵,且图G为二维赋权图,因此,我们应该对题设地图做相关处理,将其从起点处“切断”并展开为二维图,然后根据此图建立关联矩阵。但是,考虑到最短路径可能会与切断线有交点,我们必须在切断线以西找出若干地点一分为二,修改关联矩阵。 在创建关联矩阵的时候,必须考虑到如何估计两处缺失的数据,当时的地区交通状况文献已经无法查询,因此,我们只能根据当地周围相似地形地势处的已知交通状况进行估值。如何估值呢,我们用Google Earth对两地距离进行测量,并进行若干假设,与附近相似地形已知数据处进行同比例估值,得到近似结果。对于题目提出的问题,分别以伦敦、纽约和上海作为起点,我们只需调整关联矩阵起点和终点用matlab编程进行求解即可得到最短环游时间和最短路径,从而判断出所选择的路径是否能让他赢得赌注。 三、基本假设 1、题目中给出的数据均准确。 2、题目中给出的数据均采用当时能达到的最高效的交通方式。 3、在环游地球的路程中,福格不会在任何地点因任何原因停留。

Dijkstra算法详细讲解资料整理

最短路径之Dijkstra算法详细讲解1最短路径算法 在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括: (1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 (2)确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 (3)确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。 (4)全局最短路径问题:求图中所有的最短路径。 用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:Dijkstra算法、A*算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法。 本文主要研究Dijkstra算法的单源算法。

2 Dijkstra算法 2.1 Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 2.2 Dijkstra算法思想 Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2.3 Dijkstra算法具体步骤

单源最短路径的Dijkstra算法

单源最短路径的Dijkstra算法: 问题描述: 给定一个带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。算法描述: Dijkstra算法是解单源最短路径的一个贪心算法。基本思想是:设置顶点集合S并不断地做贪心选择来扩充这个集合。一个顶点属于S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist做必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。 源代码: #include #define MAX 1000 #define LEN 100 int k=0, b[LEN]; using namespace std;

//-------------------------------------数据声明------------------------------------------------//c[i][j]表示边(i,j)的权 //dist[i]表示当前从源到顶点i的最短特殊路径长度 //prev[i]记录从源到顶点i的最短路径上的i的前一个顶点 //--------------------------------------------------------------------------------------------- void Dijkstra(int n, int v, int dist[], int prev[], int c[][LEN]) { bool s[LEN]; // 判断是否已存入该点到S集合中 for (int i = 1; i <= n; i++) { dist[i] = c[v][i]; s[i] = false; //初始都未用过该点 if (dist[i] == MAX) prev[i] = 0; //表示v到i前一顶点不存在 else prev[i] = v; } dist[v] = 0; s[v] = true; for (int i = 1; i < n; i++)

相关主题
文本预览
相关文档 最新文档