公交线路乘车方案查询系统设计与实现一、实验目的开发一个信息更新及时、界面友好、查询优化的公交查询系统,系统具备的基本功能是:1、公交线路的数据输入与维护:线路的录入,修改,编辑功能;2、公交线路的查询:自动,快速,灵活的查询功能;3、乘车方案查询:起始站点线路查询,设定中转站点查询,最短路径查询功能。在开发系统的过程中使学生能对以下知识进行巩固和扩充:1,数据库理论知识;应用数据库理论对具体问题具体分析,设计出合理的数据库结构。2,数据结构理论知识;根据具体问题提出合理的数据结构,并使用相应处理方法,理解图和和图相关的搜索算法。3,算法设计与分析理论知识;对于不同的查询优化算法进行分析,选用合适的算法。4,程序设计理论知识;系统的最终实现需要编程环境,不同程序语言的选用可以更好的理解程序设计的相关知识。二、实验内容1、数据库结构设计;由于公交线路查询系统中所涉及的信息较多,它们之间的性质并不完全相同或者类似,势必造成信息冗余,但是为了系统提高查询速度和便利,可以牺牲存储空间,加快查询速度的方法。表8-1公交线路表(line)字段中文名字段英文名字段类型字段长度容许空路线编号line_idint4路线名称line_namevarchar50√始发车fristbusvarchar50√末班车lastbusvarchar50√站点1station1varchar50√站点2station2varchar50√站点3station3varchar50√…………varchar50√…………varchar50√…………varchar50√站点45station45varchar50√表8-2站点表(stop)字段中文名英文字段名字段类型长度容许空站点编号stop_idint4站点名称stop_namevarchar50√表8-3路线站点表(linestops)字段中文名英文字段名字段类型长度容许空路线编号line_idint4√站点编号stop_idint4√标记ordint4√2、数据结构设计;1)通过程序将line表中的所有数据(站点)信息存放入一个一维数组中;2)编写程序再将该数组中所有相同的数据删除,这样就有了站点(stop)表;3)将line表中的每条线路的站点一个一个记录下来存放入一个三列的二维数组中,如(1,火车站,1)表示:(线路编号:1;站名:火车站;线路所经站号:1);4)对二维数组的第二列值进行修改,参照stop表,将其字符全部换为stop_id。3、算法设计;1)起始站点查询算法第一步:查询经过这两个站点的所有公交线路,找出含有相同的线路编号的线路信息。第二步:判断以上查询中是否有满足要求的记录,若有,则记录两站点在线路中的位置,判断是否满足行驶方向的要求,通过定义一个数组,将线路信息中的线路名称,起始和目的站点名称以及两站点之间的站点个数存入数组并输出。若没有满足的记录,证明查询的站点之间不能直达,线路需要转乘。第三步:查询出两站点之间所有线路的站点交集(中转站点),将这些站点存放入一个一维数组中,查询从起始站点到达中转站点的所有公交线路,将线路信息中的线路名称,起始和中转站点名称以及两站点之间的站点个数存入一个二维数组;再查询从中转站点到达目的站点的所有公交线路,将线路信息中的线路名称,中转站点和目的站点名称以及两站点之间的站点个数存入另一个二维数组。第四步:判断两组路线之间是否有相同的站点,相同的站点即为中转站,将转乘信息输出。2)指定中转站点查询算法:第一步:查询经过起始和中转站点的所有公交线路,将符合查询条件的线路信息中的线路名称,起始和中转站点名称以及两站点之间的站点个数存入一个二维数组。第二步:再查询从中转站点到达目的站点的所有公交线路,将线路信息中的线路名称,中转站点和目的站点名称以及两站点之间的站点个数存入另一个二维数组。第三步:判断两组路线之间是否有相同的站点,相同的站点即为中转站,将转乘信息输出。3)最短路线查询算法最短路线查询算法的思想是在起始点查询的算法的基础上,是对站点之间的个数加入了一段比较着站点个数代码,通过三个临时变量,用于记录所有线路中的最短路径和两站点信息在数组中的位置,最后通过临时变量记录下来的信息,输出数组中相应位置的信息。4、开发平台选用本系统基于集成软件开发平台(Delphi)及数据库管理系统软件(SQLServer)实现。三、实验器材1、PC机(已安装Delphi7.0和SQLServer2000)1台四、实验原理“乘车方案查询系统的设计与实现”数据流程是:将用户要查询的公交线路信息、进行条件查询,将查询结果在界面上显示。用户需要查询的公交线路信息的要求是:从数据库中查询每条满足用户要求的公交线路,包括每条线路的线路名称及经过的所有站点。录入的信息进行条件查询的要求是:利用算法算出最符合用户需求的公交线路,在所输入的条件没有直达车的情况下,系统会自动给予转乘方案。查询结果显示的要求是:直观、简单、快捷的输出每条满足条件的信息。1,公交线路网络特点道路网络一般是以交叉口为结点,各路段为弧段。对于公交网络,同一条路段上可以由很多公交线路,并且,每条线路都有固定的行车线路和发出频率,乘客只能在具有相同站点的线路间换乘。因此,相对道路网络来说,公交网络更为复杂。其主要特点为:1)连通性:城市道路网络的连通性和公交网络的连通性含义不同。在道路网络中,道路交叉点连接着与该交叉口相连的多条路段,车辆在交叉点可以从一条路段进入另一条路段。在公交网络中,若几条不同公交线路经过空间上的同一站点,如果在该站点能够换车,则这几条公交线路是连通的,而且,换车存在换乘消耗,包括时间消耗、费用消耗等。另外多条公交线路虽然在空间上的同一点相交,但是该点不一定是公交站点,或不是同时有站点,此时,不同公交线路是不连通,的乘客不能在该点换乘。2)节点的特性:由于公交车只能在行驶线路上的相应站点停靠,因此,不同的公交线路,其行驶线路在空间上可能有重叠,但停靠站点不可能完全重叠。实际上,公交乘客在换乘时通常要步行一段距离才能到达另外一条公交线路的站点,达到换乘的目的。此时,换乘的两条公交线路的站点并不重叠。因此,在进行公交网络建模时,要把空间上相近的不同线路上的站点,合理抽象成公交网络图上的相关节点,来模拟不同公交线之间的换车情况。公交车只能按既定的顺序停靠站点,每条公交线路都有规定的方向,因此,由实际公交网络抽象的拓扑网络图是一个有向图,在拓扑网络图上不同属性的边在节点处连通,表示乘客可以在该节点处换乘换。乘必须在公交站点进行,不同公交线的站点在空间上并不一定完全相同,乘客在换乘时,一般需要步行一段距离,才能完成换乘。因此,需要将空间位置邻近的站点抽象成网络图中的一个节点。将公交站点抽象成网络节点后,接下来要做的工作是将公交线路的各站点间的路段抽象成网络图中的边。公交网络图是一个赋权有向图,边的权值可以是路段的长度、路段通行时间,或其它的含义。通常一条公交线路有两个行驶方向,当两个方向的行驶线路重合时,网络图上的节点在两个方向上各有一条出边和入边;当两个方向的行驶线路不重合时,网络图上的节点在每个方向上只有一条出边或入边。如果一个节点是多条公交线路的交汇点,则该节点处的边数等于各条公交线路在该节点处的出边和入边之和。如图1,此公交网由7各节点A、B、C、D、E、F、G;3条线路L1:A→B→D→E→G;L2:B→D→E→F;L3:C→D→E→G。在公交网中经过节点B的线路是L1、L2在线路L1中B为第二站在线路L2中B为起始站节点B的入边数是1,出边数为2。图8-1公交网络图例最短路径算法研究在设计最短路线算法时,考虑到公交线路的线路搜索与数据结构中赋权值图的搜索算法很相近,进行了相关资料和算法的研究。图是一些点和一些连接两点之间的连线所组成的图形的抽象,一个图由节点集边集,和节点与边的对应关系构成。设有图G,对G中的每一条边(Vi,Vj),相应地有一个数L(Vi,Vj)称为边的权。图G连同在它边上的权被称为赋权图。一条边的权也说成它的长。一条道路u=V1,V2……,Vm的长是u上所有长的和,即L(V1,V2)+L(V2,V3)+……+L(Vm-1,Vm)。在赋权图中给定一个始点Vi及终点的所谓最短路径问题就是在(Vi,,Vj)道路集合{Pij}中,寻求长为最小的路径,这样的路径称为从Vi到Vj的最短路径。从Vi到Vj的最短路径长度即最短距离记作d(Vi,Vj)。赋权图中的权可以表示两个顶点间的距离,或者途中所经的时间,或者交通费用等。此时路径长度的度量不是路径上边的数目,而是路径上边的权(距离、时间、费用等)之和。例如图2每个顶点表示城市两个顶点构成的边表示两城市间的道路,边上的数字也就是上面说的权表示两个城市之间的距离(公里),如果用汽车运输货物从A城到H城,司机就会考虑走路程最短的道路,那么最短路径是哪一条呢?应该是A-B-D-H,而且最短距离d(A,H)=L(A,B)十L(B,D)+L(D,H)=100+100+100=300公里。图8-2赋权值图的最短路径迪杰斯特拉(Dijksrta)最短路径算法寻找两顶点间的最短路径的算法很多,目前公认最好的算法是迪杰斯特拉(Dijksrta)在1959年提出的,它不仅求出从始点到终点的最短路径,而且最后所得到的实际上是始点到各顶点的最短路径。对Dijkstra算法进行补充得出的步骤如下:第一步:初始化。V={1,2,……,N},S={F},D[I]=L[F,I],Y[I]=F,其中I=1,2,⋯,N。F表示路径的始点,I表示某一顶点,N表示网络中所有顶点的数目,V是所有顶点的集合,L[F,I]表示从F点到I点的距离,S是顶点的集合,D为N个元素的数组用来存储顶点F到其它顶点的最短距离,Y为N个元素的数组用来存储最短路径中在顶点I之前经过的最近顶点。第二步:从V—S集合中找一个顶点T使得D[T]是最小值,并将T加入到S集合中。如果V—S是空集合则结束运算。第三步:调整Y、D数组中的值:在V—S集合中对于顶点T的邻接各顶点I,如果D[I]D[T]+L[I,T],那么令Y[I]=T,D[I]=D[T]+L[I,T]。继续执行第二步。Dijksrta最短路径算法由于其稳定性、能适应网络拓扑的变化,同时对系统的内存空间占用少,因而在计算机网络拓扑路径选择中得到广泛的应用。但是对公交线路来说,Dijkstra算法所采用的数据结构及其实现方法总体上说是比较复杂的,其缺点也是明显的,难以应付公交线路的网络拓扑中的复杂性。主要表现如下:(1)数据结构复杂;(2)算法时间长;(3)Dijksrta最短路径算法对于网络拓扑图要求简捷,对于复杂的公交网络拓扑,必须对其进行复杂的抽象、合并成简捷的网络拓扑图,这无疑增加了程序的复杂性。(4)公交转车中的特殊性并不一定要求用Dijkstra算法算出一条最短路径。求乘客从A站到B站的最短路径,将每个公交站点均看作网络上的顶点,每相邻站点间的路段看作一条边,假设乘客每到一个公交站点都考虑转车,才可用Dijkstra算法计算最短路径。用Dijkstra算法计算出来的结果可能是:从A站到B站需要转好几次车或十几次车才能到达。这样的计算结果是没有什么意义的。五、实验步骤1、起始站点查询算法实现第一步:通过查询站点(stop)表,将用户输入的站点信息(stop_name)转换成站点编号(stop_id),以站点编号为条件,查询线路站点关联(linestops)表中对应的记录,并记录下它们的线路编号(line_id),对经过这两个站点的所以公交线路进行比较,记录下相同的线路编号;第二步:判断以上查询中是否有满足要求的记录,若recordcount0,则记录两站点在线路中的位置,判断是否满足行驶方向的要求,通过定义一个数组,将线路信息中的线路名称,起始和目的站点名称以及两站点之间的站点个数存入数组并输出。若recordcount=0,证明查询的站点之间不能直达,需要转乘;第三步:查询出两站点之间所有线路的站点交集(中转站点),通过