校园公交车管理系统设计
一、任务
通过信息网络将现实校园的各种信息收集,整理,归纳,存储,分析和优化,进而对校园的教学资源,校园环境等方面的实体和现象进行模拟,仿真,表现,分析和深入认识。
为了方便大学生在校内的出行,许多学校都建立了校内公交车系统,然而该系统的有效管理却成了一大难题,表现在如何选取行驶路线、乘坐站点以及时间表。为了解决以上难题,改善服务质量以及提高校园公交车的效率,以西安电子科技大学校内公交车为实验对象,通过采集和分析数据,实地考察以及综合分析,借助相关软件平台,设计出符合西电学生的校内公交车管理系统。
二、实验算法介绍
克鲁斯卡尔(Kruskal)算法是实现图的最小生成树最常用的算法。其基本思想是,先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,即把两棵树合成一棵树,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直到森林中只有一棵树,也即子图中含有 n-1 条边为止。
时间复杂度为为O(e^2), 使用并查集优化后复杂度为 O(eloge),与网中的边数有关,适用于求边稀疏的网的最小生成树。
三、详细设计
1、站点设计
我们先分析出人员分布比较聚集的地方,比如西电海棠,竹园,丁香三个宿舍区以及教学楼,家属区,结合路线分析,找出最合适的站点。我们选取了校内的二十个站点,分别为A栋教学楼、B栋教学楼、C栋教学楼、D栋教学楼、E栋教学楼、F栋教学楼、G栋教学楼、丁香、东门、体育场、信远楼、办公辅楼、医院、图书馆、大学生活动中心、家属区A区、家属区E区、海棠、竹园、远望谷体育馆。
2、数据库设计
我们对我校公交车及主要停靠站点进行数据统计,建立校园数据库。
ER图:
一条记录包含站点名、该站点区域人数占所有站点区域的总人数的百分比、 该站点与其它所有站点之间的距离、该站点到其它站点的人流量(从左至右依次)。
3、问题解决方案
根据两个站点所在区域的人数占所有站点区域人数的百分比以及两个站点之间的距离和两个站点之间的人流量(人流量是双向的)来确定一个站点到另一个站点的边上权值,然后使用最小生成树的克鲁斯卡尔算法,因此,权值越小的边越容易被选到,故权值的大小应该和两个站点所在区域的人数占总人数的百分比成反比,和两个站点之间的距离正相关,和两个站点的人流量负相关,按这种原则对确定权值的三个量每个乘以一个因子,然后将这三个量相加确定权值,构造最小生成树,因为公交线路的选择应该服务更多人,而且应该走的路程还希望尽可能短,因此公交车走的路线应该是最小生成树中最长的那条路。由实验可以得到的最优路线就是:
东门→G栋教学楼→F栋教学楼→信远楼→竹园→海棠→B栋教学楼→图书馆→丁香→家属区A区→家属区E区→远望谷体院馆→东门,正好再从远望谷体育馆开到东门构成一个完整的闭环。
四、实验结果
由实验可以得到的最优路线是:
东门→G栋教学楼→F栋教学楼→信远楼→竹园→海棠→B栋教学楼→图书馆→丁香→家属区A区→家属区E区→远望谷体院馆→东门
五、关键代码
1 def krusual(): 2 Num_Edge = 0 3 MST_Edge = [] 4 n = 20 5 father.append(0) 6 for i in range(n): 7 father.append(i + 1) 8 # print s 9 10 Edge.sort(key=get_Key) 11 for e in Edge: 12 faU = findFather(e[0]) 13 faV = findFather(e[1]) 14 if faU != faV: 15 father[faU] = faV 16 Num_Edge += 1 17 MST_Edge.append(e) 18 if Num_Edge == n-1: 19 break 20 if Num_Edge != n-1: 21 return [] 22 else: 23 return MST_Edge 24
六、实验总结
我们对学校内人流量进行了统计、站点之间距离进行了测量,利用数据库和算法知识,设计出了校园公交车管理系统,选择出了校园公交车的最优行车路线。在解决实际问题时,需求分析是首要任务,人流量和距离是我们进行站点设计的重要指标。下来是数据库设计,在MySQL数据库中建一张bus_station表,储存站点名、该站点区域人数占所有站点区域的总人数的百分比、该站点与其它所有站点之间的距离、该站点到其它站点的人流量信息。将各个站点构成的无向图,利用邻接矩阵表示,将采集到的数据通过计算转化为权值,用克鲁斯卡尔算法,选择权值最小的边,求出最小生成树,得到我们所需要的最优路线。