最短路径算法浅析
甘肃科技
GansuScienceandTechnology
Vol.26 No.2Jan. 2010
最短路径算法浅析
贺 鹏,殷亚君
1
2
(1.甘肃紫光智能交通与控制技术有限公司,甘肃兰州730010;2.甘肃省高等级公路运营管理中心,甘肃兰州730000)
摘 要:高速公路网结构的数学模型是高速公路收费和清分的计算基础。介绍了用邻接矩阵来描述高速公路网的物理结构,讨论用Floyed算法计算路网中最短路径和路径长度,并给出了实现该算法的C语言程序。关键词:高速公路;联网收费;最短路径;Floyed算法中图分类号:U495
随着高速公路路网规模的不断扩大以及联网收
费的实施,必然会出现二义性路径问题。所谓二义性路径,是指从高速公路网某个入口至某个出口之间存在两条或者多条不同的路径。由于高速公路通行费的收取是以车辆在路网内的行驶里程为依据进行计算的,因此,二义性路径必然给通行费的计算带来困难。根据国内外建设经验,解决二义性路径问题的常用方法主要有两类。
(1)路径确认。通过在产生二义性路径的路段上设立标识站,或者采用车牌识别、GPS跟踪定位等技术手段来精确判断车辆行驶路径;
(2)不确认路径。在产生二义性路径的路段根据最短路径法、交通分布法、车型分类统计法或协商法等算法确定两点之间的唯一收费费率,即把起止点间的多条路径简化为费率惟一的一条虚拟路径来处理。
上述两类方法各有优缺点。设立标识站等技术手段虽然可以精确地判断车辆行驶路径,但系统的建设、维护、管理等成本费用可能会远大于精确判断车辆行驶路径而带来的通行费收益,同时也影响了高速公路的通行效率。因此,目前常见的做法是根据最短路径法来确定两点之间的唯一收费费率,通过协商法来解决通行费的拆分问题。介绍了高速公路路网结构的数学描述方法以及最短路径的算法及实现。
图1 高速公路网络结构示意里程)。实施联网收费的高速公路网络结构必然为一个连通图,即从任意顶点出发进行深度优先或广度优先搜索即可遍历图。
对于有n个顶点的网络,利用图论,可以用n×n的邻接矩阵G描述:
Wij 若顶点Vi,Vj相邻接
G[i,j]=∞ 若顶点Vi,Vj不邻接
0 Vi=Vj
其中:Wij表示边上的权值。
则图1所示路网结构可表示为如下邻接矩阵:
0 45 ∞ ∞ ∞ ∞45 0 23 ∞ ∞ 37G=
∞ 23 0 ∞ 65 ∞∞ ∞ ∞ 0 43 ∞∞ ∞ 65 43 0 80∞ 37 ∞ ∞ 80 0显然,矩阵G为对称矩阵。在用计算机存储或计算时可以用某个最大的权值或计算机可处理的最大数来代替∞。
1 高速公路路网结构的数学模型
高速公路网的物理结构可以用无向带权图(网络)来描述,如图1所示。
在图1中顶点V1、V2、…、V6表示高速公路匝道出入口,两点之间的边表示匝道出入口之间的连接关系,边上的权值表示两点之间的距离(实际行驶
2 最短路径算法及实现
目前已有众多成熟的最短路径算法,如,Dijk2stra算法,可以方便的计算某一顶点到其余各顶点
的最短路径。另一个典型算法是Floyed算法,可以计算图中每对顶点之间的最短路径。在使用最短路
第2期 贺 鹏等:最短路径算法浅析径法计算联网收费费率表时,需要计算出任意两个匝道出入口之间的最短路径,因此,更适合使用Floyed算法。
Floyed算法使用图的邻接矩阵A进行n次迭代
43
}}
3 实例分析
以图1所示路网结构为例,该路网用邻接矩阵G表示:
0 45 ∞ ∞ ∞ ∞45 0 23 ∞ ∞ 37G=
来计算每对顶点间的最短路径,迭代过程中得到一
01nn
个矩阵序列A,A,…,A,矩阵元素A[i,j]的值即为从顶点i到顶点j的最短路径。首先在路径(i,j)中插入顶点0,考虑路径(i,0,j),若该路径存在,比较路径(i,j)和路径(i,0,j)的长度,取长度较短者作为从顶点i到顶点j且中间顶点编号不大于0的最
1
短路径存入A[i,j]中,记为(i,…,j),然后考虑路径(i,…,1,…,j),求得从i到j且中间顶点编号不大于1的最短路径存入A[i,j]。依此类推,逐个插
k+1
入图中的每个顶点,在k+1次迭代时,矩阵A[i,j]的值为:
A
k+1
∞ 23 0 ∞ 65 ∞∞ ∞ ∞ 0 43 ∞∞ ∞ 65 43 0 80∞ 37 ∞ ∞ 80 02
[i,j]=mink+1
A[i,j]
A[i,k]+A[k,j]
k
k
k
其中A[i,j]表示经过k+1次迭代后得到的值,等于从i到j且中间顶点编号不大于k的最短路
3
径长度。该算法复杂度为0(n)。
下面是Floyed算法求每对顶点之间最短路径的C语言程序,程序中矩阵A用来进行n次迭代,矩阵P用来记录路径,P[i,j]为迭代过程中当前已经求得的从顶点i到顶点j的最短路径上最后被插入的那个顶点。
voidFloyed(GraphG,intA[n][n],intP[n][n]){
inti,j,k;