图论论文文档格式.docx
《图论论文文档格式.docx》由会员分享,可在线阅读,更多相关《图论论文文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
![图论论文文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/23/b26d154c-4842-40ab-ad37-12118a24c6fd/b26d154c-4842-40ab-ad37-12118a24c6fd1.gif)
引言
最短路径问题一直在计算机科学、交通工程学、地理信息系统、运筹学等学科中是一个研究的热点,它不仅是资源分配问题解决的基础,更是线路选择问题解决的基础,特别是在地图、车辆调度以及路由选择方面有着广泛的应用。
最短路径问题最直接的应用当数在地理信息领域中,例如:
GIS网络分析、城市规划、电子导航等等。
在交通咨询方面,寻找交通网路中两个城市之间最短的行车路线就是最短路径问题的一个典型的例子。
随着交通网络越来越发达,人们在旅游、出差或者其他出行时,不仅会关心费用问题,而且对里程和所需要的时间等问题也特别感兴趣。
本题目的意义在于,用java软件技术实现最短路径算法在交通咨询中的重要应用,对模拟结果进行分析讨论,为将来能够有效解决各大城市的交通问题提供可靠的依据。
一、Dijkstra算法
Dijkstra算法是一个按权值大小递增的次序产生最优路径的算法,用于计算从有向图中任意结点到其他结点的最优路径。
设一个有向图G=(V,E),已知各边的权值,以某指定点
为源点,求
到图的其余各点的最短路径。
1.算法思想分析
1959年狄克斯特拉(Dijkstra)提出一个按路径“长度”递增的次序产生最短路径的算法,即:
把图中所有的顶点分成两组,第一组S包括已经确定最短路径的顶点,初始时只含有源点;
第二组V-S中包括尚未包括最短路径的顶点,初始时含有图中初源点之外的所有其他顶点。
按路径长度递增的顺序计算源点到各顶点的最短路径,逐个把第二组中的顶点加到第一组中去,直至V=S。
2.实现思路
有向网用邻接矩阵cost[][]表示,其中规定:
(1)如果两个顶点之间无直接路径,即
弧对应权值为无穷大;
(2)两个顶点之间有直接路径
的,矩阵中的权值就是
弧对应的公路长度;
(3)
对应的值为0。
S集合初始存放最短路径的源点,计算过程中将已经确定了最短路径的顶点加到S中去。
Dist数组最终存放源点到各顶点的最短路径结果。
Path数组最终存放源点到个顶点的最短路径经过的顶点。
3.计算步骤
如下图所示:
由F到A的路径有三条:
FA:
24;
FBA:
5+18=23;
FBCA:
5+7+9=21
第一条最短路径为与源点V邻接顶点的弧集合中,权值最小的弧。
下一条长度次短的最短路径是:
假设该次短路径的终点是
,则这条路径或者是
,或者是
,它的长度或者是从V到
弧上的权值,或者是V到
路径长度与
到
的弧上权值之和。
引进一个辅助向量D,它的每个分量D[i]表示当前找到的从源点V到每个终点
的最短路径的长度。
设用带权的邻接矩阵dist[i][j]来表示有向图,dist[i][j]表示弧
上的权值,若
不存在,则置dist[i][j]为某一最大值。
向量S为已找到从V出发的最短路径的终点的集合,其初始值为空集。
算法按下面的步骤进行:
①从V出发到图上其余各个顶点(终点)
可能达到的最短路径长度的初始值为:
D[i]=dist[ORDINAL(V)][i],Vi∈V
其中ORDINAL(V)表示顶点V在有向图中的序号
②选择Vj,使
D[j]=Min{D[i]|Vi
S,Vi∈V}
Vj就是当前求得的一条从V出发的最短路径的终点,且令
S=S∪{j}
即将j加入到S集合中。
③修改从V出发到集合V-S上所有顶点Vk可达到的最短路径长度。
如果
D[j]+dist[j][k]<
D[k]
则修改D[k]为
D[k]=D[j]+dist[j][k]
④重复操作
(2),(3)共n-1次。
最后求得从V到图上其余各定点的最短路径是依路径长度递增的序列。
二、交通咨询系统的实现
1.系统设计流程
该交通咨询系统要完成城市网络图的存储,并要实现求任意一个城市顶点到其他城市顶点的最短路径问题,还要实现任意两个城市顶点间的最短路径问题。
故设计要分成三部分,一是建立网络交通的存储结构,二是解决单源最短路径问题;
最后时限两个城市之间的最短路径问题。
2.系统构架设计
首先总体的步骤是:
Dijkstra算法的具体流程图如下:
3.系统详细设计
程序源代码如下:
//Dijkstra算法
packageTest;
importjava.util.TreeMap;
importjava.util.ArrayList;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.IOException;
classPoint{
privateintid;
//点的id
privatebooleanflag=false;
//标志是否被遍历
intsum;
//记录总的点个数
privateTreeMap<
Integer,Integer>
thisPointMap=newTreeMap<
();
//该点到各点的距离。
BufferedReaderbufr=newBufferedReader(newInputStreamReader(System.in));
Point(intsum){//构造函数带有顶点个数
this.sum=sum;
}
publicvoidsetId(intid){//设置顶点id
this.id=id;
publicintgetId(){//获得顶点id
returnthis.id;
publicvoidchangeFlag(){//修改访问状态。
this.flag=true;
publicbooleanisVisit(){//查看访问状态
returnflag;
publicvoidsetLenToOther()throwsIOException{//初始化改点到各顶点的距离。
System.out.println("
=======请输入顶点"
+(this.id+1)+"
至其他各顶点的边距======="
);
for(inti=0;
i<
sum;
i++){
if(i==this.id)
thisPointMap.put(this.id,0);
else{
System.out.print("
至顶点"
+(i+1)+"
的距离:
"
booleanflag=true;
intlen=0;
while(flag){
try{
len=Integer.valueOf(bufr.readLine());
flag=false;
}catch(NumberFormatExceptione){
System.out.print("
输入有误,请重新输入:
}
};
thisPointMap.put(i,len);
}
}
//该点到顶尖id的距离。
publicintlenToPointId(intid){
returnthisPointMap.get(id);
}
classDijkstra{
publicstaticvoidmain(String[]args)throwsIOException{
ArrayList<
Point>
point_arr=newArrayList<
//存储点集合
BufferedReaderbufr=newBufferedReader(newInputStreamReader(System.in));
System.out.print("
请输入顶点个数:
"
intsum=0;
booleanflag=true;
while(flag){
try{
sum=Integer.valueOf(bufr.readLine());
flag=false;
}catch(NumberFormatExceptione){
};
i++){//初始化
Pointp=newPoint(sum);
p.setId(i);
p.setLenToOther();
point_arr.add(p);
请输入起始顶点id:
booleanflag2=true;
intstart=0;
while(flag2){
start=Integer.valueOf(bufr.readLine())-1;
if(start>
sum-1||start<
0)
thrownewNumberFormatException();
flag2=false;
}catch(NumberFormatExceptione){
showDijkstra(point_arr,start);
//单源最短路径遍历
publicstaticvoidshowDijkstra(ArrayList<
arr,inti){
顶点"
+(i+1));
arr.get(i).changeFlag();
Pointp1=getTopointMin(arr,arr.get(i));
if(p1==null)
return;
intid=p1.getId();
showDijkstra(arr,id);
publicstaticPointgetTopointMin(ArrayList<
arr,Pointp){
Pointtemp=null;
intminLen=Integer.MAX_VALUE;
arr.size();
//当已访问或者是自身或者无该路径时跳过。
if(arr.get(i).isVisit()||arr.get(i).getId()==p.getId()||p.lenToPointId(i)<
continue;
if(p.lenToPointId(i)<
minLen){
minLen=p.lenToPointId(i);
temp=arr.get(i);
}
if(temp==null)
returntemp;
else
System.out.print("
@--"
+minLen+"
-->
returntemp;
4.测试数据及分析
Dijkstra算法运行结果如下:
三、设计总结
城市现代化的目的,说到底是为了人的现代化。
交通咨询现代化作为城市现代化的重要内容,首先应是城市居民的生活交通现代化,这是以人为本原则的基本含义和根本要求。
一般来说,实现居民生活交通现代化(主要是交通咨询的现代化)便可以满足城市生产和经营交通现代化的要求。
交通咨询系统服务于城市现代化发展战略,以建设现代化交通为目标,坚持以人为本原则,优化交通结构,大力发展公共交通。
本次设计只是实现了两点之间最短路径可行距离的查询,而在现实生活中我们不仅要考虑两点之间的最短距离,还要考虑转车次数,这正是本次设计的不足之处。
调查表明人们在出行时往往更倾向于转车次数较少的路线,这样便降低了人们的办事效率。
因此,完善的交通咨询系统对两点之间的最短路径的查询应以转车次数少为条件。
参考文献
[1]图论及其应用[M].北京,清华大学出版社,2012.
[2]严蔚敏。
数据结构(C语言版)[M].北京,清华大学出版社,1997.
[3]周先曙。
最短路径问题及其解法研究[J],电脑知识与技术,2010,(06).
[4]陆锋。
最短路径算法:
分类体系与研究进展[J].测绘学报,2001,(3):
269-275
[5]陈箫枫,蔡秀云,唐德强。
最短路径算法分析及其在公交查询的应用[J].工程图学学报,2001,(3)
[6]宋晓宇,于澜洋,孙焕良,许景科。
交通网络中出现阻塞路径情况下增量路径查找算法[J].沈阳建筑大学学报(自然科学版),2009,(4)
[7]张池军,杨永健,赵洪波。
基于路径依赖的最短路径算法的改进与实现[J].计算机工程与应用,2006,(25)
[9]贺喜玲,季焕淑。
最短路径算法[J].大科技(科技天地),2011,(6)