基于Dijkstra算法的路由选择
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Dijkstra算法的路由选择
姓名:
班级:
学号:
摘要:本文阐述了最短路径问题及其算法,采用迪克斯屈拉算法解决最短路由问题。最短路由的问题利用了图的描述,并把算法用C++语言来实现,这就很好地将所学知识和现实生活结合起来。
关键词:最短路径 Dijkstra算法 C++
随着现代通信技术的不断发展,通信网的范围也逐渐扩大,通信网已成为人们生活中不可或缺的一部分了。而随着人们之间通信次数的增加,使的通信网的通信量也随之大量增加。这给通信网带了沉重的负担。如何在现有通信网的基础上提高通信效率,网络利用率和网络可靠性,以满足人们日益增长的对网络通信能力的需求已成为对通信网研究的主要内容。迪克斯屈拉算法是最适合解决网络拓扑中两节点间的最短通信距离的问题的方法之一。本文就如何利用迪克斯屈拉算法解决网络中点到点通信的最短距离问题做了说明,以此提高通信网的通信效率。
一、迪克斯屈拉算法
1、算法介绍
迪克斯屈拉算法是由荷兰计算机科学家迪克斯屈拉(Dijkstra)于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。
其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。
Dijkstra(迪克斯屈拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,该算法要求图中不存在负权边。
Procedure Dijkstra(G:所有权都为正数的加权连通简单图)
{G带有定点a=v
0, v
1
……,v
n
=z和权w(v
i
, v
j
),若{ v
i
, v
j
}不是G中的
边,则w(v
i , v
j
)=∞}
For i:=1 to n L(vi):=∞
L(a): =0 S:=φ
{初始化标记,a的标记为0,其余结点标记为∞,S是空集}
While z错误!未找到引用源。S
begin
u:=不属于S的L(u)最小的一个顶点
S:=S错误!未找到引用源。{u}
for 所有不属于S的顶点v
if L(u)+w(u,v) < L(v)
then L(v):=L(u)+w(u,v)
{这样就给S中添加带最小标记的顶点并且更新不在S中的顶点标记}
end {L(z)=从a到z的最短路的长度}
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的路,其路得长度小于L
k
(v)。
定理2 迪克斯屈拉算法使用O(n2)次运算(加法和比较)来求出n阶连通简单无向加权图中两个顶点之间最短路的长度,求加权无向图中最短路的Dijkstra算法可以推广到求加权有向图中最短有向路。
定理3 设有向图G中不含长度非正的有向圈,并且从点1到其余各点都有
有限长的有向路,那么G中结点1到其余各点j的最短有向路长度S
j
有唯一有限
解{S
j
}。
定理4 设S
j
是加权有向图G中自结点1到结点j的最短有向路的长度,并
且对所有的j=1,2,3,……,n,S
j
为有限值。若图G中除结点1外的其余各点能重新编写成如下的序号2,3,……,n使得对所有i S i ≤S j 错误!未找到引用源。且w 或者S i >S j 且 w (G),则 错误!未找到引用源。 定理5设G= Dijkstra算法求出了图中一个特定顶点到其他各定点的最短路,可以利用Dijkstra算法解决实际生活中的一些问题。 二、Dijkstra算法的实际应用 1、问题的提出 在现实生活中,我们常常会遇到很多问题,都是要找到一个地方到另一个地方的最短路径,当然还要满足各方面的要求,包括可实现性、预算、带来的利益等各方面条件。比如Dijkstra算法在计算机网络路由问题中的应用。通常我们解决的办法就是找到一条距离最短,又在现实可接受范围内的路径。 2、运用Dijkstra算法解决实际问题 在通信网中,如何利用现有的通信网络,通过最短的通信路径完成信息的传递,在通信网研究中具有重要意义。为了降低研究复杂性,我们假设每条通信线路的通信系能和状况都一样且恒定不变。建立如下网络模型:点用来表示路由节点(用a到e及z…表示),边用来表示两节点间的通信线路,边上的权重表示两节点间的距离,节点本身到他自己的距离记为0,如果两节点没有边直接相连用∞表示。 a 图1 无向图G 利用Dijkstra算法实现求解最短路径问题要有边权。本文最佳路径是基于两个路由节点间的距离。因此找路由节点间的最短距离就转化成了找图G=(V,E)中指定两点间的最小距离了。 首先我们利用上图可以知道节点之间的邻接关系,为此我们可以先画出节点间的邻接矩阵,方便我们对节点的关系进行了解。如下表(单位:m):