公交查询系统报告资料.docx

上传人:b****6 文档编号:8470417 上传时间:2023-01-31 格式:DOCX 页数:13 大小:229.36KB
下载 相关 举报
公交查询系统报告资料.docx_第1页
第1页 / 共13页
公交查询系统报告资料.docx_第2页
第2页 / 共13页
公交查询系统报告资料.docx_第3页
第3页 / 共13页
公交查询系统报告资料.docx_第4页
第4页 / 共13页
公交查询系统报告资料.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

公交查询系统报告资料.docx

《公交查询系统报告资料.docx》由会员分享,可在线阅读,更多相关《公交查询系统报告资料.docx(13页珍藏版)》请在冰豆网上搜索。

公交查询系统报告资料.docx

公交查询系统报告资料

北京化工大学北方学院

课程设计报告

课程名称数据结构课程设计

设计题目公交查询系统

专业、班级软件工程0901

学号090203018

姓名高博

指导教师周建敏老师

设计时间2012年9月10日-2012年9月23日

2012年9月25日

一、引言(简要说明设计题目的目的、意义、内容、主要任务等)

设计解决公交线路选择问题的自主查询计算机系统系统,其核心是线路选择的模型与算法,特别是满足不同乘客的查询需求。

而我,依据对公交乘客出行心理调查的统计结果,指出换乘次数最少是乘客出行时考虑的首要因素,所以这里提出一种基于换乘次数最少的公交短路径算法,并根据公交系统的特点,以图的邻接表作为数据结构。

至于公交车的调度,需要同时考虑到公车公司和乘客的利益,必须尽量在满足双方的利益上做出合理的调度。

所以这是一个多目标最优的问题,一是公车公司的成本低,即提高每辆车的满载率,或者说发车的车次尽量少;二是等待时间过长的乘客所占的比例尽量少;三是超载的情况尽量不发生,让乘客尽量感到舒适。

关键词:

公交路线网络化,图的邻接表,公交查询,乘客的需求,换乘次数,广度搜索,公交调度,分时段调度,公交公司与乘客的利益关系

公交的调度系统:

公共交通是城市交通的重要组成部分,作好公交车的调度对于完善城市交通环境、改进市民出行状况、提高公交公司的经济和社会效益,都具有重要意义。

为了建立一个有效的公交调度,我需要采集需要调度的线路的相关数据。

根据采集到的数据,我的公交调度系统就可以为这条线路设计一个全天的公交调度方案。

二、正文(课程设计的主要内容,包括实验与观测方法和结果、仪器设备、计算方法、编程原理、数据处理、设计说明与依据、加工整理和图表、形成的论点和导出的结论等。

正文内容必须实事求是、客观真切、准确完备、合乎逻辑、层次分明、语言流畅、结构严谨,符合各学科、专业的有关要求。

1、课程设计的主要内容

设计解决公交线路选择问题的自主查询计算机系统系统,其核心是线路选择的模型与算法,特别是满足不同乘客的查询需求。

通常乘客选择出行路线时受到以下几个因素的作用:

“换乘次数”、“出行距离”、“出行耗时”、“出行费用”。

换乘次数是指乘客在完成一次出行过程中所换车的次数。

实际上这几个出行因素是相互影响的,如换乘次数和出行费用就是相关联的,特别是在一些实行一票制的城市中,这两个因素可以说是一致的。

根据早期的测试的结果发现的确如此,所用的费用基本都是以换乘次数为界划分的。

2、测试方法描述

传统的Dijkstra算法无疑是解决一般最短路径问题的最优算法,但接下来我们会看到传统的Dijkstra算法在公交查询系统是不适合的。

依据对公交乘客出行心理调查的统计结果,指出换乘次数最少是乘客出行时考虑的首要因素,所以这里提出一种基于换乘次数最少的公交最短路径算法,并根据公交系统的特点,以图的邻接表作为数据结构。

3、编译原理数据分析

根据经验表明,在北京这样的大都市的公交网络上,换3次车即乘坐4条线路的公交车,方可到达目的地的情况都是很少发生的。

所以本文认为两次以内的转车是比较合理的。

换乘次数为2次及以下的情况中,会产生出行时间最小和费用最低等相应情形。

有些乘客可能有急事所以较为倾向时间最小,有些乘客因为经济上的考虑会选择费用最低,有些乘客就会做出折中的选择。

为满足各种乘客的需求,我提出了基于广度优先搜索,求解所有的换乘次数为2次及以下的路线。

并根据乘客的需求判断出最优选择。

针对考虑公交的换乘情况,主要算法描述如下。

(1)输入乘车的起始站点A及目的站点B;

(2)求经过站点A的所有线路集S(I)和经过站点B的所有线路集T(J);

(3)判断有S(I)=T(J)吗?

如果有,则找到了从站点A到站点B的直达线路S(I)即T(J),输出结果,进行下一步。

(4)求线路S(I)上的站点E(I,U)以及线路T(J)上的站点F(J,V);

(5)判断是否存在相同站点,即E(I,U)=F(J,V)。

如果满足E(I,U)=F(J,V),则线路S(I),T(J)即为一次转车的线路,E(I,U)即为转车站点;输出结果。

再执行下面。

(6)求经过E(I,U)的线路集R(K),经过F(J,V)的线路集Y(O);

(7)判断有R(K)=Y(O)吗?

如果有,则线路S(I),R(K),T(J)为两次换车的线路,换车站点为E(I,U)和F(J,V),输出结果。

继续执行下面。

(8)求线路R(K)上的站点G(K,W)和线路Y(O)上的站点L(O,X);

(9)判断是否存在相同站点,即G(K,W)=L(O,X),如果满足G(K,W)=L(O,X),则线路S(I),R(K),Y(O),T(J)即为三次转车的线路,E(I,U),G(K,W),F(J,V)即为转车站点。

公交调度:

通过对分析我觉得公车的调度问题是一个双方利益兼顾的问题,乘客的利益是超时等待的比例尽量少和超载的情况尽量少发生,公交公司的利益则是满载率尽量高,以提高效益。

接下来我将这三个目标量化,化为目标函数,以得到最优调度。

根据数据大家可以看出在一定的时段里乘客的人数有一定的相似性,这也比较容易理解,因为大家上班的时间大都集中在8:

00-9:

00,下班时间也集中在16:

00-18:

00左右。

所以我以乘客的人数多少将公车的运行时间分为几个时段。

一是早上平峰时段,二是早上高峰时段,三是中午平峰时段,四是傍晚的高峰时段,五是晚上的平峰时段。

这样我可以分别对每一时段单独进行分析求解,使得问题简化。

我只采用了上行的测试数据,下行同样可求。

下面是线路上行时段划分。

上行:

1

5:

00-6:

00

2

6:

00-9:

00

3

9:

00-16:

00

4

16:

00-18:

00

5

18:

00-23:

00

因为在我划分的一个时段里,情形都是相近的。

每个乘客到达车站又是相互独立事件,所以我可以认为在我划分的每个时间段里到达车站的乘客人数是均匀的。

由于乘客到达的均匀性,则一个时间段里发车也可以看成是均匀的。

而总人数Pi除以时间段Ti的运力,就可以得到满载率的目标函数。

下面我们先来求解上行路线。

时间段i的平均发车时间间隔为:

bi=Ti/Bi;

第k辆车到达站点j时,站点j上的等待上车的人数

PW(i,k,j)=Pl(i,k-1,j)+bi*Kij

而设Pl(i,0,j)=0,当k=1时PW(i,1,j)=

*Kij;

第k辆车到达站点j时,下车人数

D(i,k,j)=bi*

而D(i,k,0)=0,即起点站没人下车。

第k辆车到达站点j时,车上乘客下车后车上的最大容量为:

On(i,k,j)=Max{120-(PLB(i,k,j-1)-D(i,k,j)),0};

第k辆车离开站点j后车上的人数

PLB(i,k,j)=PLB(i,k,j-1)-D(i,k,j)+max{O(i,k,j),PW(I,j,k)}

第k辆车离开站点j后车上的超载人数

C(i,k,j)=max{PLB(i,k,j)-100,0}

 

第k辆车离开站点j后,站点上还剩下的等待人数

PL(i,k,j)=max{PA(i,j,k)-On(i,k,j),0}

时间段i车上的总人数

Pi=

第k辆车到达站点j时超额等待的乘客人数为

平峰期:

If(T(i,k,j)-10>T(i,k-1,j))W(i,k,j)=max{Kij*(T(i,k,j)-10-T(i,k-1,j)),

PL(i,k-1,j)}

高峰期:

If(T(i,k,j)-5>T(i,k-1,j))W(i,k,j)=max{Kij*(T(i,k,j)-5-T(i,k-1,j)),

数据及类型描述

下面是公交查询里用到的数据和函数

ElemTypevtail,vhead;//要查询的起点和终点,作为全局变量

boolev[600][100],fv[600][100];//e[i][j]为线路i会进入站点j,f[i][j]为线路i会从站点j出来

structARcType//弧结点:

弧头在顶点数组中的序号,权值,

指向下一条弧结点的指针

structVErtexType//顶点结点:

结点名字,指向第一条弧结点的指针

classGraph//公交线路图类

VErtexTypegraph[4100];//存储公交线路图的邻接表

VErtexTypegraph1[4100];//公交线路图的逆邻接表

intvertexnum,arcnum;//顶点数和弧定点数

intL[550];//记录线路i能经过几次换乘到达终点

ElemTypee[600][100],f[600][100];//e[i][j]为线路i会进入站点j,f[i][j]为线路i会从站点j出来

inten[600],fn[600];//e[i]有多少个站点

boolticket[550];//0为单一票制,1为分段计价

boolround[550];//是环形路为真,否则为假

voidinitiate();//初始化en,fn

voidinitiate2();

ElemTyper[6000],y[6000];//从E(I,U)站点发出的线路集R(K),进入站点F(J,V)的线路集Y(O);

intgetdata();//从文件中读入数据

intLocateVertex(ElemTypestr);//查找名为str的顶点在数组graph中的序号,返回。

没有返回-1

intfindpathout(ElemTypes[100],ElemTypea);//求出经过站点a的所有线路名字,复制到s[i]中

intfindpathout(ElemTypes[100],ElemTypea,ElemTypehi);

intfindpathin(ElemTypes[100],ElemTypea);//求出经过站点a的所有线路名字,复制到s[i]中

intCreateDN();//创建有向有权图的邻接表

voidInsertarc(inti,intj,ElemTypelinename,ElemTypestrh,ElemTypestrt);//在图中加入一条弧,由序号i的点指向序号j的点

voidInsertarc(inti,intj,ElemType&linename,ElemTypestrh,ElemTypestrt,charch);

voidShowUDN();//显示图的领接表的结构

intdirectpath(ElemTypeh[100],ElemTypet[100],intcounth,intcountt);//看是否有直接路线

intispath(ElemTypevhead,ElemTypevtail,ElemTypehi);//判断vhead和vtail是不是线路hi上的先后两点

intoncepath(ElemTypeh[100],ElemTypet[100],intcounth,intcountt);//看是否有转一次车路线,即看线路i和j有没有公共的站点

voidoncepathtime(ElemTypeh[100],ElemTypet[100],intcounth,intcountt);//看是否有转一次车路线,输出最小时间

voidoncepathsometime(ElemTypeh[100],ElemTypet[100],intcounth,intcountt);//看是否有转一次车路线,输出最小时间

inttwiceandthreepath(ElemTypeh[100],ElemTypet[100],intcounth0,intcountt0,intcounth1,intcountt1);//看是否有转2次车路线,即看线路i和j有没有公共的站点

voidtwiceandthreepathtime(ElemTypeh[100],ElemTypet[100],intcounth0,intcountt0,intcounth1,intcountt1);//看转两次车的最快时间

voidtwiceandthreepathsometime(ElemTypeh[100],ElemTypet[100],intcounth0,intcountt0,intcounth1,intcountt1);//看转两次车的最快几次时间

intnum1(intfasttime[5],inttime,intcount)//看time在fasttime数组中是第几快的,返回数组中的序号,如果不能入前3快,返回-1,如果count没有3个,则前count快。

voidnames(ElemTypes,intn)//给公交站点命名

intcheckarcname(ElemTypestr)//检查输入的弧名是否正确:

"L+三位数字",正确就返回1,否则0

intchangel(ElemTypestr)//将站点名转为相应的数字

intchange(ElemTypestr)//将弧名转为相应的数字

voidnamel(ElemTypelinename,intbusline)//根据线路的号码给线路命名

voidShowall()//显示所有线路的情况

GRaphnet;//全局变量,存储站点信息

 

下面是公交调度的相关数据和函数描述:

intB[6];//Bi,时间段Ti内发出的车辆数

floatb[6];//时间段i的平均发车时间间隔为

floatPL[6][90][20];//PL(i,k,j)时间段i内第k辆车离开第j个站点时,站点j上的人数

floatPW[6][90][20];//PW(i,k,j)时间段Ti内第k辆车到达站点j时,站点j的等待上车人数

floatC[6][90][20];//时间段i第k辆车离开站点j时的超载人数

floatK[6][20];//时间段i内单位时间平均到站j的人数

floatL[6][20];//时间段i内单位时间平均在站j下车的人数

floatT[6];//时间段i的长度

intstart[6];//5个时段的开始时刻

floatt[14];//起点到各个站点的时间

floatD[6][90][20];//D(i,k,j),时间段Ti内第k辆车到达站点j时,下车的人数

floatOn[6][90][20];//On(i,k,j),时间段Ti内第k辆车到达站点j时,乘客下车后,车能容纳上车的最大人数

floatPLB[6][90][20];//PLB(i,k,j)时间段i内第k辆车离开第j个站点时,车上的人数

floatW[6][90][20];//时间段Ti内第k辆车到达站点j时,等待时间过长的乘客

floatw[6],c[6],z[6];//记录各个目标函数的数值。

intb1;//全局变量,要调度的线路的站点数

voidinitiate1()//划分各个时段

intchange(intn)//看开始时间n是第几时段

intlarger(inta,intb)//比较,返回大数

intless(inta,intb)//比较,返回小数

voidgetdata()//从要调度的线路读出文件,并初始化相关数据

voidfindbestBi(inti,intb1)//求时段i最佳发车数数量B[i]

intcusmenu()//乘客菜单函数

intguanli()//管理员菜单

测试方法描述

(1)输入密码进入管理员菜单,进行相关操作,先是初始化公交查询系统。

(2)然后测试函数:

查看某站点的出入站的线路的情况

(3)查看所有线路的情况。

由于数据太多,近500多条线路,所以一开始会出现类似闪屏的情况。

运行过程如下。

(4)接着是根据文件的数据进行公交车的调度。

可以将每个线路的具体情况放在不同的文件中,这样就可以对不同的线路进行调度和相关数据预测。

由于时间关系这里我只存储了xianlu1这一个文件。

测试结果如下。

(5)接下来进入乘客菜单,先输入乘客想查询的起点和终点。

(6)然后大多数乘客为了舒适性会选择查询直达或只转一次车的路线,结果如下,可惜这两个站点没有直达路线,系统会作出提醒。

(7)然后乘客可以选择查看需要换乘多次的所有路线,结果如下。

(8)如果乘客赶时间,想找时间最快的路线:

(9)如果此时乘客担心时间最快的路线人数太多,会拥挤,可以选择查看几条最快线路

三、结论(应当准确、完整、明确精练;也可以在结论或讨论中提出建议、设想、尚待解决问题等。

首先我分析公交线路的特点,将公交系统化为多重带权图,并采用邻接表进行存储。

在设计公交查询系统时,我从实际出发,参考了报纸等媒体对乘客出行的心里需求的分析,满足乘客希望的换乘次数较少,时间较快等个性化需求,甚至考虑到一些特殊下的特殊需求,比如一些用户因为某些特殊原因可能想途中经过某个站,或者不想经过某个站,这样乘客就可以选择查看所有线路;再或者某项大型比赛,集会结束后,如果大家都想走最优路线会造成线路拥挤,所以提出了多条最快路线让用户选择。

在设计公交调度系统时,我为之建立了数学模型,分析各个时间的乘客人数变化,求出各个时间的公交发车间隔,和预测了相关数据。

四、参考文献

1:

王建林,基于换乘次数最少的城市公交网络最优路径算法,《经济地理》2005-9

2:

严蔚敏,吴伟民.数据结构[M].北京:

清华大学出版社

3、《c语言编程常见问题》,清华大学出版社1996年12月

4、姜仲秋等主编,《C语言程序设计》,南京大学出版社,1998年1月

五、指导教师评语

 

签名:

年月日

课程设计成绩(五级分制)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1