求最短路问题的改进算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第18卷第1期工 科 数 学Vo l.18,№.1 2002年2月JO URN AL O F M AT HEM ATICS FO R TECHNO LOGY Feb.2002求最短路问题的改进算法

黄祖庆

(景德镇陶瓷学院,景德镇333001)

[摘 要]本文对图论中含有负权的最短路问题的算法进行了讨论,给出了一个具有“可节省存储空间、提高运算速度、易编程实现”等优点的改进算法(算法三),并通过例题进一步验证了该改进算法的优越性,具有一定的现实意义.

[关键词]负权有向图;最短路;Dijkst ra算法;改进算法

[中图分类号]O157.5 [文献标识码]A [文章编号]1007-4120(2002)01-0052-03

图论中的最短路问题可描述为:在赋权有向图中,求两个顶点v1到v n之间的一条路,使得在这条路上各个弧的权值之和在从v1到v n的所有路中是最小的.

类似的实际问题有许多,如企业的投资决策问题、各种管线的铺设问题、设备更新问题等等,其求解的算法是由Dijkstra在1959年提出的,故称为Dijkstra算法.其基本思路是:假设在得到从v1到v n的最短路之前,已经知道了图中最接近顶点v1的m个顶点,以及从v1到m个顶点的最短路;然后再确定最接近顶点v1的第m+1个顶点v k,以及从点v1到v k的最短路;如此继续延伸,直到v n也被确定,此时问题求解结束.

记P,T分别为永久标号集和临时标号集.顶点v i的临时标号记成T(i),它表示从v1到v i的最短距离的上界;顶点v i的永久标号记成P(i),它表示从v1到v i的实际最短距离.已得到P类标号的顶点不再改变其标号,而没有标上P类标号的顶点必须标上T类标号.算法的每一步要把某一顶点的T类标号改为P类标号.当v n获得P类标号时,就求得了从v1到v n的最短路线.w ij为弧(v i,v j)的权值.则Dijkstra算法具体步骤为(称作算法一):

i)给顶点v1标上永久标号P(1)=0,这表示从v1到v1最短距离为零.其余顶点标上临时标号T (j)=∞;

ii)设顶点i是刚得到P类标号的顶点,把与顶点i有弧直接相连而又属于T类标号的各顶点j的标号改为下列T类标号:

T(j)=min{T(j),P(i)+w i j};

iii)在T类标号中选标号最小的顶点j0,并把它的临时标号T(j0)改为永久标号P(j0).若终点获得P类标号,则算法终止,最短路已经找到;否则转向ii).

Dijkstra的思路、算法简单,但是仅适用权值w i j≥0的情形.当权值w ij有负值时,此时须对Dijkstra 算法作些改动、补充,则仍可以求出含有负权值图的最短路,算法步骤如下(称作算法二):

i)先对图中各个顶点按Dijkstra算法标号,称之为第一次标号(此次标号的结果是有可能改变的),记作P(1).令m=1,转向第二步;

ii)对图中除v1外的所有点进行第m+1次标号.记P(m+1)(k)为对顶点v k的第m+1次标号的第二个标号值,其计算公式为:

P(m+1)(k)=min{P(m)(k),{P(m)(i)+w ik|存在弧(v i,v k)}};

 [收稿日期]2001-02-15

iii )若对于每个点,P

(m +1)(k )=P (m )(k )都成立,则找出最短路,算法终止,若对于某些点存在P

(m +1)(k )

1)={P (m +1)(2),P (m +1)(3),…,P (m +1)(n )}的全部分量,显然在计算第k (k >1)个分量P (m +

1)(k )时,已经计算出的最新分量P (m +1)(2),P (m +1)(3),…,P (m +1)(k -1)没有被利用.从直观上看,最新计算出来的分量比旧的分量要

好些,这就是本文的主体思路,由此得到改进的算法如下(称作算法三):

i)先对图中各个顶点按Dijkstra 算法标号,称之为第一次标号(此次标号的结果是有可能改变的),记作P (1).令m =1,转向第二步;

ii)对图中除v 1外的所有点进行第m +1次标号.记P

(m +1)(k )为对顶点v k 的第m +1次标号的第

二个标号值,其计算公式为:P (m +1)(k )=min {P (m )(k ),{P (m +1)(i )+w ik ,(i ≤k );P (m )(i )+w ik ,(i >k )|存在弧(v i ,v k )}};iii )若对于每个点,P (m +1)(k )=P (m )(k )都成立,则找出最短路,算法终止,若对于某些点存在P (m +1)(k )

其算法框图为

:

从本算法及算法框图知其最大的一个优点是,在计算机编程实现时,只需一组存储单元,比前一算法节省了近一半存储单元,且可节省计算时间.下面通过例子加以说明.

例 在下图中,求从v 1到v 4的最短路.

解 第一次标号的结果为(即利用算法一):

P (1)={P (1)(1),P (1)(2),P (1)(3),P (1)(4)}={0,2,3,1}

(由于有负权,故需要进一步修正).

(一)利用算法二:i)对v 2,v 3,v 4进行第二次标号,计算如下:P (2)(2)=min{P (1)(2),P (1)(3)+w 32}=min{2,3-2}=

53

第1期 黄祖庆:求最短路问题的改进算法

相关文档
最新文档