全国交通咨询模拟系统实验报告
全国交通咨询模拟系统
全国交通咨询模拟系统系统背景随着我国经济的快速发展,交通出行已经成为人们日常生活中不可或缺的一部分。
不仅高速公路、铁路、城市轨道交通、公共汽车等交通工具不断完善,而且智能化、自动化、先进化等新兴技术也在交通领域变得越来越普及。
但是在日常出行中,人们难免会遇到交通拥堵、事故等问题,对于这些问题,如果及时得到准确可靠的信息,将大大缩短人们的出行时间,帮助人们更快地解决问题。
因此,我们开发了一款全国交通咨询模拟系统,帮助人们快速获取各地交通信息、查询交通路线、实时交通情况等信息,缩短出行时间,提高出行效率,让人们更加便捷的出行。
系统功能1. 查询交通信息全国交通咨询模拟系统提供了各地铁路、航班、长途汽车的信息查询功能,用户可通过输入出发地和目的地信息,查询出该区域的所有交通信息。
同时提供了乘车时间和价格等信息,方便用户选择最优出行方式。
2. 实时交通情况查询全国交通咨询模拟系统为用户提供了实时交通情况查询功能,用户可通过输入出行路线,系统将返回该路线的实时情况,包括此时此刻的路况、车流量、拥堵情况、事故情况等,方便用户对出行进行最佳规划。
3. 路线规划全国交通咨询模拟系统提供了路线规划的功能,用户输入起点和终点的位置信息,系统将为用户快速规划出一条最优的路线。
此外,该系统还提供了多条路线的选择,用户可以根据自己的需求进行选择。
4. 路况预报全国交通咨询模拟系统还提供了路况预报的功能,即用户可以预先了解某段道路的车流量、拥堵情况等。
系统通过大数据分析和深度学习等技术,对路况进行精准预测,使用户能够提前规划出行。
5. 存储建议全国交通咨询模拟系统可为用户存储出行建议,用户可以按照自己的需求,将出行建议进行收藏、备份和删除,方便后续使用。
系统优势1. 数据准确性高全国交通咨询模拟系统通过各种渠道收集、整理和分析各地交通数据,确保提供给用户的是准确可靠的信息。
2. 使用简单该系统的使用非常简单,用户只需按照系统提示输入需要查询的信息,系统将自动返回相应的结果。
交通系统仿真实验报告
道路交通系统仿真实验实验一 VISSIM班级:08交通工程学号:120081501131 姓名:王两全一、实验目的1.掌握用VISSIM绘制简单的路网;2.掌握如何给路网添加基本的路网元素(如:信号灯、路径决策、冲突区域、优先规则、公交站点等);3.掌握对仿真模型进行指标评价,包括行程时间、延误、排队长度以及相关参数的设置。
二、实验设备1.硬件要求:装有VISSIM的PC机一台;2.系统要求:能在Windows 2000、XP和VISTA环境下运行;三、实验要求在VISSIM中构建一个平面信号控制交叉口模型,不考虑行人和非机动车,具体要求见试卷。
四、实验内容与步骤1.绘制路网(1)根据实验要求导入背景图;(2)按照每车道宽3.5m设置比例尺参数,根据背景图绘制一个T形交叉口(北进口封闭),交叉口宽度:南北:45m、东西99m;(3)初步路网结果图.2.添加路网元素(1)对绘制好的路网标明车道方向;(2)输入车辆数:400辆/车道小时;(3)信号配时;(4)设置行驶路径决策;(5)设置一条跨越交叉口的公交线路并设置两种不同的公交站点:港湾式和路边式;(6)设置冲突区域。
(7)添加路网元素后的结果3.设置仿真评价指标(1)行程时间;创建时间检测,并在“评价->文件”进行行程时间检测设置。
(2)延误;(3)排队长度。
1.信号控制2.冲突区域通过该实验巩固了初步使用VISSIM对一个完整路网的构建,对Vissim 的各个功能有更深刻的了解。
但由于实验过程中可能有一些小细节出错了,导致两种控制方式的评价指标结果都一样,通过多次的调试仍然未找出错误的地方,这是该实验遗憾的地方。
理论上讲,该试验的交叉口可以看成是主干道与次干道的相交(东西为主干道,南北为次干道且),而且该交叉口的流量比较小,粗略判断应该是冲突区域控制会比信号控制更加优越。
同时,此次实验为我们以后自己动手进行交通仿真做了很好的铺垫。
交通仿真实习报告
交通仿真实习报告一、引言随着城市化进程的加速和人们对出行需求的不断提高,交通问题日益凸显。
为了解决实际交通问题,提高交通系统效率,我们进行了一次交通仿真实习。
本报告将详细介绍我们的仿真实习目的、方法、结果及结论。
二、仿真实习目的本次仿真实习的主要目的是通过模拟交通系统,深入了解交通流特性、交通拥堵形成原因、交通规划原则等,以期在实践中得到应用。
三、仿真实习方法我们采用了专业的交通仿真软件进行模拟实验。
我们构建了一个包含道路、交叉口、交通信号灯等基本交通设施的模型。
接着,我们设置了不同的交通流量和出行需求,观察交通运行情况。
同时,我们还通过调整交通信号灯的配时方案,研究其对交通流的影响。
四、仿真实习结果在模拟过程中,我们观察到了交通拥堵、车辆排队等现象。
通过数据分析,我们发现交通拥堵主要发生在道路节点处,如交叉口和交通信号灯处。
我们还发现交通信号灯配时不合理会加剧交通拥堵。
针对这些问题,我们提出了一些可能的解决方案,如优化交通信号灯配时、增加道路通行能力等。
五、结论与展望通过本次仿真实习,我们深入了解了交通系统的运行特性和存在的问题。
针对这些问题,我们提出了一些解决方案,以期在实际应用中得到改善。
然而,这只是初步的探索和研究,我们还需要在未来的学习和实践中不断深化和完善相关知识,为解决实际交通问题提供更有价值的参考。
仿真实习个人实习报告一、引言随着科技的发展和数字化时代的到来,仿真技术已经成为工程设计、生产规划和管理决策等方面的重要工具。
为了更好地掌握仿真技术的应用和实践,我参与了一次为期六周的仿真实习项目。
通过本次实习,我不仅了解了仿真模型的构建过程和基本原理,还深入学习了如何运用仿真技术解决实际问题。
以下是我对本次实习的总结和个人心得。
二、仿真实习概述在本次实习中,我参与的是一个生产流水线的仿真项目。
通过构建仿真模型,模拟生产线的运行过程,预测可能出现的瓶颈和问题,并制定相应的优化方案。
1、仿真模型的构建构建仿真模型是仿真的基础。
全国交通咨询模拟
一.实验目的交通咨询模拟的主要功能是可以列出从一个城市到另一个城市的所有路径,供所需要的人选择。
二.实验内容开始页面进入交通系统管理菜单页面,页面下面包括有:查询两城市间的最短距离,查询一个城市到其余城市的最短距离,查询两城市间的所有路径等。
最后调用相应的子函数,完成程序的编写。
此程序中除主函数外,有四个功能各异的子函数,其调用关系如图所示。
三.实验步骤(可选)本次调用的库函数为:#include <iostream>using namespace std;#include"string.h"# include "stdlib.h"以下为交通咨询管理系统所用的主要子函数。
用邻接矩阵作为数据的存储结构构建一个有向图,代码如下:void CreateMGraph(MGraph *G,int n,int e){//采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数int i,j,k,w;for(i=1;i<=n;i++) //输入顶点信息G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint; //初始化邻接矩阵Cout<<"输入%d条边的i、j及w:\n"<<e;for(k=1;k<=e;k++) //读入e条边,建立邻接矩阵{Cin>>i>>j>>w;G->arcs[i][j]=w;//权值}cout<<"有向图的存储结构建立完毕\n”;}用Dijkstra算法求一点到其余点的最短距离,代码如下:void Dijkstra(MGraph *G,int v1,int n)//用迪杰斯特拉算法求有向图G的v1顶点到其他顶点V的最短路径P[V]及其权D[V]//设G是有向图的邻接矩阵,若边<i,j>不存在,则G[i][j]=Maxint// S[v]为真当且仅当v∈s,即已求得从V1到v的最短路径。
全国交通咨询模拟系统实验报告
一、问题描述全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
【测试数据】二、数据结构设计和核心算法设计描述:1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下:3、核心设计:根据上面的流程图和逻辑拆分,对这个问题有了一个比较直观,详细地了解。
并且从中也可得知路线的添加即数据的存储是这个系统进行运作的一个基础。
而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这些数据进行了存储。
将每个信息量放在不同的文件中,可以更有效、直观地对这些数据进行处理。
流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是其他操作都是在路线添加好后进行的,并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用的是无限循环形式,即while(1)。
以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。
三、主控及功能模块层次结构:1、模块说明:本系统分为个模块1、)主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:基本操作:函数变量声明:#include <stdio.h>#include <string.h>#define ERR 0#define OK 1#define Dij_MAXN 33#define MAX_VERTEX_NUM 31 #define MAX_STRING_NUM 10 #define MAX_TRAFFIC_NUM 10const char CityFile[] ="D:\\city.txt";const char TrainFile[] ="D:\\train.txt";const char FlightFile[] ="D:\\flight.txt";typedef short int CityType;typedef struct TrafficNode{char name[MAX_STRING_NUM]; //班次int StartTime,StopTime; //起止时间int EndCity; //该有向边指向的顶点在数组中的位置,即该城市编号int Cost; //票价} TrafficNodeDat;typedef struct VNode{CityType city;int TrainNum,FlightNum; //标记下面Train数组和Flight数组里元素个数TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; // int Cost; //遍历时到达该城市的耗费(时间或者费用)} VNodeDat;typedef struct PNode{int City;int TraNo;} PNodeDat;VNodeDat AdjList[MAX_VERTEX_NUM]; //System Infochar CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中的编号int CityNum; //城市数目PNodeDat Path[MAX_VERTEX_NUM]; //存储临时最小时间路径PNodeDat MinPath[MAX_VERTEX_NUM]; //存储搜索到当前的最小时间路径int MinTime,StartTime;int curPath;函数构成:int main(){char name[MAX_STRING_NUM]; char s_city[MAX_STRING_NUM]; char e_city[MAX_STRING_NUM]; int Command,cost;int startcity,endcity,traveltype;int s_hour,s_minute,e_hour,e_minute;while (1){ShowMenu(); //显示菜单scanf("%d",&Command); //switch (Command){case 0: //退出return 0;case 1: //添加城市InitSysData();printf("\n输入城市名:");InsertCity(name);SaveSysInfo();printf("System Info Save OK!\n"); break;case 2: //删除城市InitSysData();printf("\n输入城市名:");scanf("%s",&name);DelCity(name);SaveSysInfo();printf("System Info Save OK!\n"); break;case 3: //添加路线InitSysData();printf("起始站城市名:");scanf("%s",&s_city);printf("终点站城市名:");scanf("%s",&e_city);printf("类型(列车0,航班1):"); scanf("%d",&traveltype);printf("输入列车/飞机班次:");printf("起始时刻(00:00,24小时制):");scanf("%2d:%2d",&s_hour,&s_minute);printf("到达时刻(00:00,24小时制):");scanf("%2d:%2d",&e_hour,&e_minute);printf("票价:");scanf("%d",&cost);if (traveltype){InsertFlight(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost);}else{InsertTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost);}SaveSysInfo();printf("System Info Save OK!\n");break;case 4: //删除路线InitSysData();printf("输入班次:");DelPath(name);SaveSysInfo();printf("System Info Save OK!\n");break;case 5: //最小耗费InitSysData();printf("\n起始城市:");scanf("%s",&name);startcity=SeekCity(name);if (startcity<0){printf("Error City Name:No such city!\n"); break;}printf("终点城市:");scanf("%s",&name);endcity=SeekCity(name);if (endcity<0){printf("Error City Name:No such city!\n"); break;}printf("类型(列车0,航班1) :");scanf("%d",&traveltype);if (traveltype!=0&&traveltype!=1){printf("Error Input!");break;}CalcMinCost(startcity,endcity,traveltype);printf("\n");break;case 6: //最短时间路线InitSysData();printf("\n起始城市:");scanf("%s",&name);startcity=SeekCity(name);if (startcity<0){printf("Error City Name:No such city!\n"); break;}printf("终点城市:");scanf("%s",&name);endcity=SeekCity(name);if (endcity<0){printf("Error City Name:No such city!\n"); break;}printf("类型(列车0,航班1) :");scanf("%d",&traveltype);if (traveltype!=0&&traveltype!=1){printf("Error Input!");break;}CalcMinTime(startcity,endcity,traveltype);printf("\n");break;}}}四、主函数中的各个调用的函数代码具体如下:(1)显示菜单:int ShowMenu(){printf("\n************MENU************\n");printf("1: 添加城市\n2: 删除城市\n3: 添加交通路线\n4: 删除交通路线\n5: 查询最小费用路线\n6: 查询最快路线\n0: 退出");printf("\n****************************\n");printf("\nType In Your Command:");return 1;}(2)查找城市并返回城市序号:int SeekCity (char *name){int i;for (i=0;i<CityNum;i++){if (strcmp(name,CityName[i])==0){return i;}}return -1;}(3)储存信息到文件:int SaveSysInfo(){FILE *fp;int i,j,total;fp=fopen(CityFile,"w");fprintf(fp,"%d\n",CityNum);for (i=0;i<CityNum;i++){fprintf(fp,"%s\n",CityName[i]);}fclose(fp);total=0;fp=fopen(TrainFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].TrainNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].TrainNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Train[j].name,CityName[i],CityName[AdjList[i].Train[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Train[j].StartTime/60, AdjList[i].Train[j].StartTime%60,AdjList[i].Train[j].StopTime/60,AdjList[i].Train[j].StopTime%60,AdjList[i].Train[j].Cost);}}fclose(fp);total=0;fp=fopen(FlightFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].FlightNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Flight[j].name,CityName[i],CityName[AdjList[i].Flight[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Flight[j].StartTime/60, AdjList[i].Flight[j].StartTime%60,AdjList[i].Flight[j].StopTime/60,AdjList[i].Flight[j].StopTime%60,AdjList[i].Flight[j].Cost);}}fclose(fp);return 1;}(4)添加城市:int InsertCity (char *Name){strcpy(CityName[CityNum],Name);AdjList[CityNum].city=CityNum;AdjList[CityNum].FlightNum=0;AdjList[CityNum].TrainNum=0;CityNum++;return 1;}(5)删除城市:int DelCity (char *Name){int city,i,j;city=SeekCity(Name);for (i=city;i<CityNum-1;i++){strcpy(CityName[i],CityName[i+1]);AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;for (j=0;j<AdjList[i].FlightNum;j++){AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost;AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name); AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime;}}CityNum--;return 1;}(6)添加火车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost){int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime;AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime;strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);AdjList[i].TrainNum++;return 1;}(7)添加航班路线:int InsertFlight(char *flight,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost){int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime; AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime; strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight); AdjList[i].FlightNum++;return 1;}(8)删除路线:int DelPath (char *name){int i,j,flag=0;for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++)if (strcmp(AdjList[i].Flight[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].FlightNum-1;j++){AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name); AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime;}AdjList[i].FlightNum--;break;}for (j=0;j<AdjList[i].TrainNum;j++)if (strcmp(AdjList[i].Train[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].TrainNum-1;j++){AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime;AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime;}AdjList[i].TrainNum--;break;}}return 1;}(9)打印最小费用路线:void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN],int PreCity[Dij_MAXN],int p_end,int TravelType){int track[Dij_MAXN];int i=0,j,k,min,tmp,end,cost=0;int startH, startM, endH, endM;//定义四个变量:startH 出发的小时,startM 出发的分钟, endH 到达的小时, endM 到达的分钟j=p_end;track[i++]=j;while (PreCity[j]>=0){cost+=matx[PreCity[j]][j];track[i++]=j=PreCity[j];}printf("\nTrack Way:");if (!TravelType){for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].TrainNum;k++)if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost){min=AdjList[track[i]].Train[k].Cost;tmp=k;}printf("%s ",AdjList[track[i]].Train[tmp].name);startH = AdjList[track[i]].Train[tmp].StartTime/60 ;startM =AdjList[track[i]].Train[tmp].StartTime%60;endH = AdjList[track[i]].Train[tmp].StopTime/60 ;endM = AdjList[track[i]].Train[tmp].StopTime%60 ;if( !(startH/10) ){printf("0");}printf("%d:",startH);if( !(startM/10) ){printf("0");}printf("%d -- ",startM);if( !(endH/10) ){printf("0");}printf("%d:",endH);if( !(endM/10) ){printf("0");}printf("%d\n",endM);//printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Train[tmp].StartTime/60,AdjList[track[i]].Train[tmp].StartTi me%60,AdjList[track[i]].Train[tmp].StopTime/60,AdjList[track[i]].Train[tmp].StopTime %60);}}else{for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].FlightNum;k++)//这句错了,AdjList[track[i]].Train[k].EndCity改为AdjList[track[i]].Flight[k].EndCity!/*if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){ */if(AdjList[track[i]].Flight[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){min=AdjList[track[i]].Flight[k].Cost;tmp=k;}printf("%s",AdjList[track[i]].Flight[tmp].name);startH = AdjList[track[i]].Flight[tmp].StartTime / 60 ;startM = AdjList[track[i]].Flight[tmp].StartTime % 60;endH =AdjList[track[i]].Flight[tmp].StopTime / 60 ;endM = AdjList[track[i]].Flight[tmp].StopTime % 60 ;if( !(startH/10) ){printf("0");}printf("%d:",startH);if( !(startM/10) ){printf("0");}printf("%d -- ",startM);if( !(endH/10) ){printf("0");}printf("%d:",endH);if( !(endM/10) ){printf("0");}printf("%d\n",endM);//printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Flight[tmp].StartTime / 60,AdjList[track[i]].Flight[tmp].StartTime % 60,AdjList[track[i]].Flight[tmp].StopTime / 60,AdjList[track[i]].Flight[tmp].StopTime % 60);}}printf("\n%s: DESTINATION!",CityName[track[0]]);printf("\nMin Cost : %d\n",cost);}(10)找出最小费用路线void Dijkstra(int matx[Dij_MAXN][Dij_MAXN],int p_start,int p_end,int TravelType) {int PreCity[Dij_MAXN]; //PreCity[i]==-1,never used;//PreCity>0,the precity of City iint i,j,min,pre,pos;for (i=0;i<CityNum;i++){PreCity[i]=-1;}PreCity[p_start]=-2;while (PreCity[p_end]==-1){min=-1;for (i=0;i<CityNum;i++)if (PreCity[i]!=-1){for (j=0;j<CityNum;j++)if (PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min)){pre=i;pos=j;min=matx[i][j];}}PreCity[pos]=pre;}Dijkstra_Output(matx,PreCity,p_end,TravelType);}(11)初始化系统数据:int InitSysData (){FILE *fp;int i,j,hour,minute,num,cost;char stmp1[MAX_STRING_NUM];char stmp2[MAX_STRING_NUM];char stmp3[MAX_STRING_NUM];fp=fopen(CityFile,"r");if (!fp){printf("\nError:Cannot Open City File...\n"); return -1;}fscanf(fp,"%d",&CityNum);for (i=0;i<CityNum;i++){fscanf(fp,"%s",&CityName[i]);AdjList[i].city=i;AdjList[i].TrainNum=0;AdjList[i].FlightNum=0;}fclose(fp);fp=fopen(TrainFile,"r");if (!fp){printf("\nError:Cannot Open Train File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Train[AdjList[j].TrainNum].Cost=cost;AdjList[j].TrainNum++;}fclose(fp);fp=fopen(FlightFile,"r");if (!fp){printf("\nError:Cannot Open Flight File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost;AdjList[j].FlightNum++;}fclose(fp);return 1;}(12)找出最快路线:int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,int TravelType){int i;if (City==EndCity){if (MinTime>CurTime-StartTime){for (i=0;i<=curPathNo;i++){MinPath[i].City=Path[i].City;MinPath[i].TraNo=Path[i].TraNo;curPath=curPathNo;}MinTime=CurTime-StartTime;}}else{curPathNo++;Path[curPathNo].City=City;if (!TravelType){for (i=0;i<AdjList[City].TrainNum;i++){if((AdjList[City].Train[i].StartTime>=(CurTime%1440))&&(AdjList[City].Train[i].StopTi me+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTime+ (CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Train[i].StartTime<(CurTime%1440))&&(AdjList[City].Train[i].StopTime +(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTime+ (CurTime/1440+1)*1440,curPathNo,TravelType);}}}else{for (i=0;i<AdjList[City].FlightNum;i++){if((AdjList[City].Flight[i].StartTime>=CurTime)&&(AdjList[City].Flight[i].StopTime+(Cur Time/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTime +(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Flight[i].StartTime<CurTime)&&(AdjList[City].Flight[i].StopTime+(CurT ime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTime +(CurTime/1440+1)*1440,curPathNo,TravelType);}}}}return 1;}(13)计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType){int i;int startH, startM, endH, endM;//定义四个变量:startH 出发的小时,startM 出发的分钟, endH 到达的小时, endM 到达的分钟MinTime=32767;curPath=0;Path[0].City=StartCity;if (!TravelType){for (i=0;i<AdjList[StartCity].TrainNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Train[i].StartTime;SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity,AdjList[StartCity].Train[i].St opTime,0,TravelType);}}else{for (i=0;i<AdjList[StartCity].FlightNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Flight[i].StartTime;SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity,AdjList[StartCity].Flight[i].S topTime,0,TravelType);}}if (MinTime==32767){printf("\nNo access to that destination!");return 0;}// if (!TravelType)// StartTime=AdjList[StartCity].Train[MinPath[0].TraNo].StartTime;// else// StartTime=AdjList[StartCity].Flight[MinPath[0].TraNo].StartTime;printf("\nPath:\n");for (i=0;i<=curPath;i++){if (!TravelType)printf("%s : %s ",CityName[MinPath[i].City],AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name);elseprintf("%s : %s ",CityName[MinPath[i].City],AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name);startH = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime / 60 ;startM = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime % 60 ;endH = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime / 60 ;endM = AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime % 60 ;if( !(startH/10) ){printf("0");}printf("%d:",startH);if( !(startM/10) ){printf("0");}printf("%d -- ",startM);if( !(endH/10) ){printf("0");}printf("%d:",endH);if( !(endM/10) ){printf("0");}printf("%d\n",endM);//printf(" %2S:%2S-%2S:%2S\n",startH);}printf("%s: DESTINATION!",CityName[EndCity]);printf("\nTime Cost: %2d hour - %2d minute",MinTime/60,MinTime%60); return 1;}(14)计算最小费用路线:int CalcMinCost (int StartCity,int EndCity,int TravelType){int ma[Dij_MAXN][Dij_MAXN];int i,j,min,end;for (i=0;i<CityNum;i++)for (j=0;j<CityNum;j++)ma[i][j]=-1;if (TravelType==0){for (i=0;i<CityNum;i++){min=32767;j=0;while (j<AdjList[i].TrainNum){min=32767;end=AdjList[i].Train[j].EndCity;while(end==AdjList[i].Train[j].EndCity&&j<AdjList[i].TrainNum){if (AdjList[i].Train[j].Cost<min){min=AdjList[i].Train[j].Cost;}j++;}ma[i][end]=min;}}else{for (i=0;i<CityNum;i++){min=32767;j=0;while (j<AdjList[i].FlightNum){min=32767;end=AdjList[i].Flight[j].EndCity;while(end==AdjList[i].Flight[j].EndCity&&j<AdjList[i].FlightNum){if (AdjList[i].Flight[j].Cost<min){min=AdjList[i].Flight[j].Cost;}j++;}ma[i][end]=min;}}Dijkstra(ma,StartCity,EndCity,TravelType);return 1;}五、功能模块间函数的调用关系,如下图所示:六、调试结果: 1、主界面:2、添加城市:输入命令1后,按提示输入城市名,而后返回主界面CalcMinCost():Dijkstra(ma,StertCity,EndCity,TravelType)Dijkstra():Dijkstra_OutPut(mat x,PreCity,p_end,Trav elType)InsertTrain():SeekCity(StartCity) SeekCity(EndCity)InsertFlight():SeekCity(StartCity) SeekCity(EndCity)原city文件:添加城市后的city文件:3、删除城市:输入命令2后,按提示输入城市名,而后返回主界面4、添加路线:输入命令3后,按提示依次输入起始站、终点站、类型、起始时刻、到达时刻、票价等信息,而后返回主界面。
2数据结构——全国交通咨询模拟系统实验报告
2数据结构——全国交通咨询模拟系统实验报告
实验目的:
实验环境:
本次实验的开发环境为Java编程语言,使用了面向对象的编程思想,采用了数据结构中的图和链表等数据结构。
实验内容:
1.设计交通工具类:
首先,根据系统需求,设计了交通工具类,该类用于表示交通工具的
基本信息,包括交通工具的名称、班次、票价等。
在该类中,使用了链表
数据结构来存储交通工具的班次信息。
2.设计城市类:
接下来,设计了城市类,用于表示各个城市的交通信息。
在该类中,
使用了图数据结构来表示城市之间的联通关系,每个城市作为图的一个节点,城市间的交通工具作为图的边。
实验结果:
经过测试,实验系统能够准确地输出起点城市到终点城市的最短路径
和最佳交通方案,用户可以根据输出信息来决定如何安排旅行计划。
实验总结:。
C++数据结构-全国交通咨询模拟报告
数据结构课程设计报告班级:195182学号:20181003991姓名:钟欢日期:2019.12一、课程设计题目与要求1.课程设计题目:全国交通咨询模拟2.问题描述:出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
3.基本要求:3.1提供对城市信息进行编辑(如添加或删除)的功能。
3.2城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增加或删除)的功能。
3.3提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
3.4旅途中耗费的总时间应该包括中转站的等候时间。
3.5咨询以用户和计算机的对话方式进行。
二、需求分析1.问题描述搭建一个全国交通咨询模拟系统,可以实现简单的人机互动从而达到咨询的效果。
需要完成的功能有,对城市、列车时刻表、航班时刻表进行编辑(手动/文件添加,删除),能够根据出发城市以及到达城市进行相关线路推荐(花费最少线路、耗时最短线路),其中整个线路的耗时总时长包括中转等待时间。
2.程序的功能:2.1维护功能:2.1.1航班操作2.1.2列车操作2.1.3更改密码2.2咨询功能2.2.1选择出行交通工具2.2.2选择要查询的信息:○1查询花费最小的路径○2查询耗时最短的路径2.2.3进行进一步的输入得到所需要的结果三、设计1.设计思想1.1数据结构设计1.1.1逻辑结构设计采用图结构来表示该全国交通网络,用一个结构体来表示时间,结构体内有标准化的(天,时,分)的相关表示以及操作,重载的运算符“-”。
全国交通网络中的城市用结点表示,两个城市之间的航线或者列车线用两个结点之间的边来表示。
城市结点中包含城市名字、城市编号、第一条航线/列车线以及航线/列车线的数目;边结点中包含到达城市名称,指向下一航线/列车线的指针,以及指向该边所指代航线/列车线信息的指针;航班线/列车线信息结点包含航班号/列车号,出发时间,到达时间,花费时间,花费金额。
02_[全国交通咨询模拟]_课程设计报告_
计算机科学与技术学院数据结构课程设计指导教师二○一八年一月十七日课程设计任务书及成绩评定课程设计题目全国交通咨询模拟Ⅰ课程设计的目的和内容设计目的:通过数据结构课程设计的训练,达到以下目的:(1)巩固和加深对数据结构知识的理解,熟练掌握几种重要的数据结构与算法,能够根据具体问题选择合适的数据结构并设计相应算法;(2)初步掌握软件开发过程的需求分析、系统设计、程序测试和编码风格等基本流程和规范;(3)提高综合运用所学的数据结构和算法知识独立分析和解决复杂工程问题的能力;(4)培养学生从事计算机相关专业工作所应具备的科学方法和基本素质。
设计内容:(根据具体题目简要阐述系统的总体任务、所需实现的功能、相应的子任务和模块分解、数据结构的选择和算法的设计、数据库的设计和存储、系统的重点测试内容等。
本部分表格不得超出本页范围,文档格式不得擅自改变。
)从中国地图平面图中选取部分城市,抽象为程序所需要图的结点,并以城市间的列车路线和飞机路线,作为图结点中的弧信息,设计一个全国交通咨询模拟系统。
利用该系统实现两种最优决策:最快到达或最省钱到达。
程序所能达到的功能a.该系统有供用户选择的菜单和交互性。
可以对城市、列车车次和飞机航班进行编辑,添加或删除。
b.建立一个全国交通咨询系统,该系统具备自动查找任意两城市间铁路、飞机交通的最短路径和最少花费及中转次数最少等功能。
c.初始化交通系统有两种方式,键盘和文档。
数据存储:城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。
用不同的功能模块对城市信息和交通信息进行编辑。
添加、修改、删除功能可用菜单方式或命令提示方式。
只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面。
最优决策功能模块(fast or province)。
Ⅱ课程设计的创新和特色(简要列举本设计的创新点和特色,比如应用了何种数据结构或算法使得排序或查找更为高效;使用了何种数据库设计使得数据存储和检索更为高效;区别于其他项目组的特色或亮点等等。
交通仿真实验报告
交通仿真实验报告交通仿真实验报告一、实验目的和背景交通仿真是一种通过计算机模拟交通流动和交通控制的技术,旨在提供有效的交通规划和管理策略。
本实验旨在通过交通仿真软件,模拟真实道路上的交通流动,探究不同交通控制策略对交通流量和拥堵情况的影响,以提供决策者参考。
二、实验方法和过程1. 实验环境搭建在实验开始前,我们首先搭建了交通仿真实验的环境。
选择了一条典型的城市主干道进行仿真,确定了道路的长度、车道数、车辆流量等参数,并在仿真软件中进行设置。
2. 交通流模型设定根据实际情况,我们选择了基于微观交通流模型的仿真方法。
该方法以车辆为基本单位,通过模拟车辆的加速、减速、换道等行为,来模拟真实道路上的交通流动。
3. 交通控制策略设计为了探究不同交通控制策略对交通流量和拥堵情况的影响,我们设计了三种不同的交通控制策略:信号灯控制、交通警察指挥和无交通控制。
在实验中,我们分别对这三种策略进行了仿真模拟,并记录了交通流量、平均车速、拥堵时间等数据。
4. 数据分析和结果展示通过交通仿真软件提供的数据,我们进行了详细的数据分析和结果展示。
通过对比不同交通控制策略下的数据,我们可以得出结论,评估各种策略的优劣,并为实际交通管理提供参考。
三、实验结果和讨论通过数据分析和结果展示,我们得出了以下结论:1. 信号灯控制策略在交通流量控制方面表现较好,能够有效地平衡道路上的车辆流动。
然而,在高峰时段,信号灯控制也容易导致交通拥堵,延长车辆通行时间。
2. 交通警察指挥策略可以根据实际情况及时调整交通流动,适应道路上的变化。
但是,这种策略需要人工干预,依赖于交警的经验和判断力,可能存在一定的主观性和误差。
3. 无交通控制策略下,车辆自由通行,但容易导致交通混乱和拥堵。
尤其是在交通流量较大的情况下,无交通控制策略的效果较差。
四、实验结论和建议根据实验结果和讨论,我们得出了以下结论和建议:1. 在交通流量较大的主干道上,推荐使用信号灯控制策略,以平衡车辆流动和减少交通拥堵。
全国交通咨询系统设计实验报告(word文档良心出品)
全国交通咨询模拟系统设计报告团队名称: Bug Killer团队成员:专业:时间:一.需求分析(1)提供对城市信息的的编辑功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对火车时刻表和航班运行表的编辑功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具。
输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时坐哪一趟列车哪一次班机到何地。
二.概要设计我们结合现实生活的实际情况,根据数据结构这门课程的特点和要求。
对问题做了如下处理:以数据结构教材的交通图(参照严蔚敏版《数据结构》 P187)为基础,按照 Internet 上查找的信息对数据进行初始化。
由于这是一个查询性质的程序,所以数据要尽可能的丰富。
但是为了控制问题的规模和减少数据初始化时的查询难度,不同城市之间只包含了不大于三次的列车或航班信息。
为了突出迪杰斯特拉算法,初始数据只包含了交通网中相邻城市之间的列车和航班信息。
这是考虑到,实际生活中几乎每个城市都会有直达的出行方式。
如果全部包含进去,对算法的测试会有影响。
按照功能,本程序有三个模块:1.修改城市之间的交通信息。
包括添加列车车次和航班、删除列车车次和航班信息。
2.最少出行费用的查询。
3.最短旅行时间的查询。
根据程序分工的需要,编写过程分为四个模块:1.构建邻接矩阵,由赵锦志完成。
按照查找最短旅行时间的子模块的需求,读取 train.txt 或plane.txt 中的内容构建存储列车信息的三维数组或航班的三维数组。
构建好的数组功能比较丰富,可以作为邻接矩阵使用。
按照最少出行费用的子模块的需求,读取相应 txt 文档,构建二维的数组,即邻接矩阵。
两种数组只有在改变 txt 文档里的内容时才会重新构建。
交通仿真模拟实训报告
一、实训背景随着我国城市化进程的加快,城市交通问题日益突出。
为提高城市交通管理水平,优化交通组织,减少交通拥堵,提升市民出行效率,交通仿真模拟技术应运而生。
本次实训旨在通过交通仿真模拟软件,对城市交通系统进行模拟、分析和优化,以期为我国城市交通发展提供有益参考。
二、实训目的1. 掌握交通仿真模拟软件的基本操作和功能;2. 了解城市交通系统基本原理,熟悉交通仿真模拟技术;3. 通过模拟实验,分析城市交通问题,提出解决方案;4. 提高实际操作能力,培养团队协作精神。
三、实训内容1. 交通仿真模拟软件简介本次实训使用的交通仿真模拟软件为VISSIM(Visual Simulation System),是一款广泛应用于交通领域的高性能仿真软件。
VISSIM具有以下特点:(1)基于微观数据,模拟真实交通场景;(2)支持多种交通流模型,可进行多场景仿真;(3)可视化界面,便于观察和分析交通状况;(4)可进行交通参数调整,模拟不同交通策略。
2. 城市交通系统分析(1)交通流分析:通过模拟实验,分析不同交通流模型对交通状况的影响,如交通拥堵、排队长度、平均速度等;(2)道路网络分析:模拟不同道路网络结构对交通状况的影响,如道路宽度、交叉口设计等;(3)交通设施分析:模拟不同交通设施对交通状况的影响,如交通信号灯、停车设施等;(4)交通策略分析:模拟不同交通策略对交通状况的影响,如交通需求管理、公共交通优先等。
3. 案例分析本次实训选取了某城市核心区域作为研究对象,模拟该区域的交通状况。
主要内容包括:(1)道路网络建模:根据实际道路情况,构建道路网络模型;(2)交通流模拟:设置交通流参数,模拟不同交通状况下的交通流;(3)交通设施配置:根据实际交通设施情况,配置交通信号灯、停车设施等;(4)交通策略优化:通过调整交通参数和设施配置,优化交通状况。
四、实训结果与分析1. 交通流分析通过模拟实验,发现以下问题:(1)高峰时段,交通拥堵严重,排队长度较长;(2)道路网络结构不合理,部分路段存在交通瓶颈;(3)交通信号灯设置不合理,导致部分交叉口拥堵。
数据结构—全国交通咨询模拟系统实验报告5
全国交通咨询模拟1051210137罗媛一、设计目的掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。
得到软件设计技能的训练。
二、问题描述交通咨询模拟。
根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。
三、基本要求1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;2、对城市间的交通工具:火车。
对列车时刻表进行编辑:里程、和列车班次的添加、修改、删除;3、提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具,可以不考虑回程;4、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟列车何时到达何地。
四、具体实现1、思路(1) 数据存储。
城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
在实验中本想用文本储存数据,但操作不熟悉,而是改用图的邻接矩阵储存原始信息,而后用数组进行添加删改(2) 数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为无向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的时间)或旅费。
(3) 数据的存储结构。
采用邻接表和邻接矩阵都可作为数据的存储结构,这里建议采用邻接矩阵作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
添加、修改、删除功能可用菜单方式或命令提示方式。
只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面,具体实现由学生自行设计,也可参考有关程序(届时在网上提供)。
这些工作有不小的工作量。
(5) 最优决策功能模块① 读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对方城市到达该元素所代表城市的所有信息;表头数组中的元素所对应的单链表存放与该元素所代表的城市有交通联系的城市(代码、里程、列车车次)。
数据结构全国交通咨询模拟系统实习报告【范本模板】
数据结构课程设计报告全国交通咨询模拟管理系统学院:计算机学院姓名:班级:学号:指导老师日期:1.需求分析出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询.要求:(1)提供对城市信息进行编辑(如添加或删除)的功能.(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能.(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
2.设计2。
1 设计思想(1)数据结构设计该系统存储结构运用到数组和结构体。
该结构分别存储火车列次,航班,出发点与目的地以及所需要走的路程和所用费用。
主要用到的数据结构有图中的交通网的各种信息的邻接矩阵的存储。
最短路径使用迪杰斯特拉算法编程求算得出最近或最便宜路径.火车列次,航班的存储结构:struct Tvaval{ //火车或飞机的存储结构//char id[20];//火车或飞机航班的代码//char start[20];//出发地//char end[20]; //目的地//float time; //路途时间//float price;//价钱//};(2)算法设计在求最短路径使用到的算法是迪杰斯特拉算法,算法步骤如下:1、起始点(V0)与其相邻点的权值(即当前最短路径).2、求出当前最短路径中的最小值即是该起始点(V0)与另一点(Vi)的最短路径。
3、V0到Vi的距离加上Vi到Vj的距离小于V0到Vj则将V0到Vi的距离加上Vi到Vj的距离记为V0到Vj当前最短路径,循环第二、三步。
如此得到V0到各点的最短路径,进而可以得到想要的一条。
系统主干功能的实现是用一个swich语句来实现多功能的选取以及程序的退出;主要有:1:修改地图,2:编辑火车时刻表,3:编辑飞机航班表,4:选择出游路线,5:退出;继而通过选中其中的数字来实现自己的目的;然后再引用程序再用一个switch case语句来实现1 2 3选项中的添加删除以及退出功能,然后在4中再用if语句来实现自己的需求考虑.可以随时退出程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全国交通咨询模拟系统实验报告Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT一、问题描述全国交通咨询模拟:处于对不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
二、1、根据题目中的基本要求分析,可以创建系统概念模型,流程设计框图如下:班次辑结构拆分:而为了便于数据的存储、添加、删除等操作,我选择了储存文件对这些数据进行了存储。
将每个信息量放在不同的文件中,可以更有效、直观地对这些数据进行处理。
流程图中的7个主要功能模块在主函数中,采用输入选项进入子菜单,但是其他操作都是在路线添加好后进行的,并且为了每一项功能进行完后,系统可以及时回到主交互界面,我采用的是无限循环形式,即while(1)。
以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。
三、主控及功能模块层次结构:1、模块说明:本系统分为个模块1、)主函数2、)添加城市3、)查找城市并返回序号4、)删除城市5、)添加列车6、)添加航班7、)删除列车或航班8、)找出最小费用路线9、)初始化系统数据(读入内存)10、)找出最快路线11、)计算最快路线耗费的时间并打印12、)计算最小费用路线13、)主界面14、)存储信息到文件15、)退出、2、下面是各模块示意图:基本操作:函数变量声明:#include <>#include <>#define ERR 0#define OK 1#define Dij_MAXN 33#define MAX_VERTEX_NUM 31#define MAX_STRING_NUM 10#define MAX_TRAFFIC_NUM 10const char CityFile[] ="D:\\";const char TrainFile[] ="D:\\";const char FlightFile[] ="D:\\";typedef short int CityType;typedef struct TrafficNode{char name[MAX_STRING_NUM]; rainNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].TrainNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Train[j].name,CityName[i],CityName[AdjList[i].Train[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Train[j].StartTime/60, AdjList[i].Train[j].StartTime%60,AdjList[i].Train[j].StopTime/60,AdjList[i].Train[j].StopTime%60,AdjList[i].Train[j].Cost);}}fclose(fp);total=0;fp=fopen(FlightFile,"w");for (i=0;i<CityNum;i++){total+=AdjList[i].FlightNum;}fprintf(fp,"%d\n",total);for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++){fprintf(fp,"%s %s %s ", AdjList[i].Flight[j].name,CityName[i],CityName[AdjList[i].Flight[j].EndCity]);fprintf(fp,"%2d:%2d %2d:%2d %d\n", AdjList[i].Flight[j].StartTime/60, AdjList[i].Flight[j].StartTime%60,AdjList[i].Flight[j].StopTime/60,AdjList[i].Flight[j].StopTime%60,AdjList[i].Flight[j].Cost);}}fclose(fp);return 1;}(4)添加城市:int InsertCity (char *Name){strcpy(CityName[CityNum],Name);AdjList[CityNum].city=CityNum;AdjList[CityNum].FlightNum=0;AdjList[CityNum].TrainNum=0;CityNum++;return 1;}(5)删除城市:int DelCity (char *Name){int city,i,j;city=SeekCity(Name);for (i=city;i<CityNum-1;i++){strcpy(CityName[i],CityName[i+1]);AdjList[i].FlightNum=AdjList[i+1].FlightNum;AdjList[i].TrainNum=AdjList[i+1].TrainNum;for (j=0;j<AdjList[i].FlightNum;j++){AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost;AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity;strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name);AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime;}}CityNum--;return 1;}(6)添加火车路线:int InsertTrain (char *train,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost){int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Train[AdjList[i].TrainNum].Cost=cost;AdjList[i].Train[AdjList[i].TrainNum].EndCity=j;AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime;AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime;strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);AdjList[i].TrainNum++;return 1;}(7)添加航班路线:int InsertFlight(char *flight,char *StartCity,char *EndCity,int StartTime,int EndTime,int cost){int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j;AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime;AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime;strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight);AdjList[i].FlightNum++;return 1;}(8)删除路线:int DelPath (char *name){int i,j,flag=0;for (i=0;i<CityNum;i++){for (j=0;j<AdjList[i].FlightNum;j++)if (strcmp(AdjList[i].Flight[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].FlightNum-1;j++){AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost;AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity;strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name); AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime;}AdjList[i].FlightNum--;break;}for (j=0;j<AdjList[i].TrainNum;j++)if (strcmp(AdjList[i].Train[j].name,name)==0){flag=1;break;}if (flag){for (;j<AdjList[i].TrainNum-1;j++){AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost;AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity;strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name);AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime;AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime;}AdjList[i].TrainNum--;break;}}return 1;}(9)打印最小费用路线:void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN],int PreCity[Dij_MAXN],intp_end,int TravelType){int track[Dij_MAXN];int i=0,j,k,min,tmp,end,cost=0;int startH, startM, endH, endM;rainNum;k++)if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost){min=AdjList[track[i]].Train[k].Cost;tmp=k;}printf("%s ",AdjList[track[i]].Train[tmp].name);startH = AdjList[track[i]].Train[tmp].StartTime/60 ;startM =AdjList[track[i]].Train[tmp].StartTime%60;endH = AdjList[track[i]].Train[tmp].StopTime/60 ;endM = AdjList[track[i]].Train[tmp].StopTime%60 ;if( !(startH/10) ){printf("0");}printf("%d:",startH);if( !(startM/10) ){printf("0");}printf("%d -- ",startM);if( !(endH/10) ){printf("0");}printf("%d:",endH);if( !(endM/10) ){printf("0");}printf("%d\n",endM);rain[tmp].StartTime/60,AdjList[track[i]].Train[tmp].StartTime%60,AdjList[track[i]].Tr ain[tmp].StopTime/60,AdjList[track[i]].Train[tmp].StopTime%60);}}else{for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<AdjList[track[i]].FlightNum;k++)rain[k].EndCity改为AdjList[track[i]].Flight[k].EndCity!/*if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){ */if(AdjList[track[i]].Flight[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){min=AdjList[track[i]].Flight[k].Cost;tmp=k;}printf("%s",AdjList[track[i]].Flight[tmp].name);startH =AdjList[track[i]].Flight[tmp].StartTime / 60 ;startM =AdjList[track[i]].Flight[tmp].StartTime % 60;endH =AdjList[track[i]].Flight[tmp].StopTime / 60 ;endM =AdjList[track[i]].Flight[tmp].StopTime % 60 ;if( !(startH/10) ){printf("0");}printf("%d:",startH);if( !(startM/10) ){printf("0");}printf("%d -- ",startM);if( !(endH/10) ){printf("0");}printf("%d:",endH);if( !(endM/10) ){printf("0");}printf("%d\n",endM);light[tmp].StartTime / 60,AdjList[track[i]].Flight[tmp].StartTime %60,AdjList[track[i]].Flight[tmp].StopTime / 60,AdjList[track[i]].Flight[tmp].StopTime % 60);}}printf("\n%s: DESTINATION!",CityName[track[0]]);printf("\nMin Cost : %d\n",cost);}(10)找出最小费用路线void Dijkstra(int matx[Dij_MAXN][Dij_MAXN],int p_start,int p_end,int TravelType) {int PreCity[Dij_MAXN]; .\n");return -1;}fscanf(fp,"%d",&CityNum);for (i=0;i<CityNum;i++){fscanf(fp,"%s",&CityName[i]);AdjList[i].city=i;AdjList[i].TrainNum=0;AdjList[i].FlightNum=0;}fclose(fp);fp=fopen(TrainFile,"r");if (!fp){printf("\nError:Cannot Open Train File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Train[AdjList[j].TrainNum].Cost=cost;AdjList[j].TrainNum++;}fclose(fp);fp=fopen(FlightFile,"r");if (!fp){printf("\nError:Cannot Open Flight File...\n");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&stmp1);fscanf(fp,"%s",&stmp2);fscanf(fp,"%s",&stmp3);j=SeekCity(stmp2);AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1);fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute);AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost);AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost;AdjList[j].FlightNum++;}fclose(fp);return 1;}(12)找出最快路线:int SearchMinTime (CityType City,CityType EndCity,int CurTime,int curPathNo,int TravelType){int i;if (City==EndCity){if (MinTime>CurTime-StartTime){for (i=0;i<=curPathNo;i++){MinPath[i].City=Path[i].City;MinPath[i].TraNo=Path[i].TraNo;curPath=curPathNo;}MinTime=CurTime-StartTime;}}else{curPathNo++;Path[curPathNo].City=City;if (!TravelType){for (i=0;i<AdjList[City].TrainNum;i++){if((AdjList[City].Train[i].StartTime>=(CurTime%1440))&&(AdjList[City].Train[i].StopT ime+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTim e+(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Train[i].StartTime<(CurTime%1440))&&(AdjList[City].Train[i].StopTi me+(CurTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTim e+(CurTime/1440+1)*1440,curPathNo,TravelType);}}}else{for (i=0;i<AdjList[City].FlightNum;i++){if((AdjList[City].Flight[i].StartTime>=CurTime)&&(AdjList[City].Flight[i].StopTime+(C urTime/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTi me+(CurTime/1440)*1440,curPathNo,TravelType);}if((AdjList[City].Flight[i].StartTime<CurTime)&&(AdjList[City].Flight[i].StopTime+(Cur Time/1440)*1440-StartTime<MinTime)){Path[curPathNo].TraNo=i;SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTi me+(CurTime/1440+1)*1440,curPathNo,TravelType);}}}}return 1;}(13)计算最快路线所需时间并打印:int CalcMinTime (int StartCity,int EndCity,int TravelType){int i;int startH, startM, endH, endM;ity=StartCity;if (!TravelType){for (i=0;i<AdjList[StartCity].TrainNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Train[i].StartTime;SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity,AdjList[StartCity].Train[i ].StopTime,0,TravelType);}}else{for (i=0;i<AdjList[StartCity].FlightNum;i++){Path[0].TraNo=i;StartTime=AdjList[StartCity].Flight[i].StartTime;SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity,AdjList[StartCity].Flight[ i].StopTime,0,TravelType);}}if (MinTime==32767){printf("\nNo access to that destination!");return 0;}rain[MinPath[0].TraNo].StartTime;light[MinPath[0].TraNo].StartTime;printf("\nPath:\n");for (i=0;i<=curPath;i++){if (!TravelType)printf("%s : %s",CityName[MinPath[i].City],AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name); elseprintf("%s : %s",CityName[MinPath[i].City],AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name);startH =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime / 60 ;startM =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime % 60 ;endH =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime / 60 ;endM =AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime % 60 ;if( !(startH/10) ){printf("0");}printf("%d:",startH);if( !(startM/10) ){printf("0");}printf("%d -- ",startM);if( !(endH/10) ){printf("0");}printf("%d:",endH);if( !(endM/10) ){printf("0");}printf("%d\n",endM);rainNum){min=32767;end=AdjList[i].Train[j].EndCity;while(end==AdjList[i].Train[j].EndCity&&j<AdjList[i].TrainNum){if (AdjList[i].Train[j].Cost<min){min=AdjList[i].Train[j].Cost;}j++;}ma[i][end]=min;}}}else{for (i=0;i<CityNum;i++){min=32767;j=0;while (j<AdjList[i].FlightNum){min=32767;end=AdjList[i].Flight[j].EndCity;while(end==AdjList[i].Flight[j].EndCity&&j<AdjList[i].FlightNum){if (AdjList[i].Flight[j].Cost<min){min=AdjList[i].Flight[j].Cost;}j++;}ma[i][end]=min;}}}Dijkstra(ma,StartCity,EndCity,TravelType);return 1;}五、功能模块间函数的调用关系,如下图所示:1、主界面:2、添加城市:输入命令1后,按提示输入城市名,而后返回主界面原city文件:添加城市后的city文件:3、删除城市:输入命令2后,按提示输入城市名,而后返回主界面4、添加路线:输入命令3后,按提示依次输入起始站、终点站、类型、起始时刻、到达时刻、票价等信息,而后返回主界面添加路线后的train文件:5、删除路线:输入命令4后,按提示输入,而后返回主界面删除路线后的train文件:6、查找最小费用花费:输入命令5后,按提示输入起始城市、终点城市、类型,而后返回主界面结果正确!7、查找最小时间花费:输入命令6后,按提示输入城市名,而后返回主界面结果正确!8、退出:输入命令0后,退出系统七、课程设计小结:1、实验过程中的注意点1)遇到逻辑问题,然后设断点,调试跟踪看哪步出了问题.比如说全局变量和局部变量设置出现问题,导致运行过程各变量的取值不对。