您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 救护车调度模拟系统课程设计报告
数据结构课程设计说明书学院:信息科学与工程学院班级:计算机11-3完成人:姓名:徐海杰学号:201101050323姓名:薛德利学号:201101050324指导教师:山东科技大学2010年××月××日实验题目救护车调度模拟系统需求分析1.问题描述设计实现一个用事件驱动的“救护车调度”离散模型,模拟120急救中心响应每个病人的呼救信号统一调度救护车运行的情况。我们对问题作适当简化,假设:某城市共有m个可能的呼救点(居民小区、工厂、学校、公司、机关、单位等),分布着n所医院(包含在m个点中),有k辆救护车分派在各医院待命,出现呼救病人时,由急救中心统一指派救护车接送至最近的医院救治。救护车完成一次接送任务后即消毒,并回原处继续待命。假定呼救者与急救中心、急救中心与救护车之间的通讯畅通无阻,也不考虑道路交通堵塞的影响。可以用m个顶点的无向网来表示该城市的各地点和道路。时间可以分钟为单位,路段长可表示为救护车行驶化费的分钟数。2.要求模拟每一起病人呼救—派车往救—接人回院的过程:显示每辆救护车的状态(待命、往救、送院{可能还有返点})和每个病人的状态(待派车、待接、送院途中),显示各医院的待命救护车队列,实时显示当前的病人平均接送时间和平均派车延迟时间以及已送达病人数。救护车应按最快的路线接送病人。呼救事件发生的间隔时间和地点都是随机的(其发生频度先给一个省缺值,可实时调整)。点数m、点名、路段数e和每段长度以及医院点的名称都由教师以文本文件形式给出,格式为:mneABCDEFGH……(m个点名称,大小写代表不同点)AEGHK……(n个医院名称)AB11,AC15,EG9,……FK24,(e条路段及长度)救护车总数及分派方案在运行前从键盘输入。3.提示可以设3种事件:病人呼救,救护车到病人家,救护车到医院。一个事件队列,一个呼救等待队列,n个救护车待命队列。初始化时设置第一个病人呼救事件插入事件队列,以启动系统运行。处理病人呼救事件时,将这个呼救排入呼救等待队列,同时产生下一个病人呼救事件。无向网可用邻接多重表。求出每个医院到其他各点的最短路径,每个点设一个由近到远的医院列表。参考教科书中第3章第5节:离散事件模拟。设计说明#includestdio.h#includestdlib.h#includetime.h#includemath.h#includeconio.h#includewindows.h#defineTRUE1#defineFALSE0#defineOK1#defineOVERFLOW_-2#defineINFINITY_9999#defineMAX_VERTEX_NUM52#defineStatusint#defineVertexTypeint//定点类型//**********************定义结构体**********************//typedefstruct//医院{charhospital_name;inthospital_Num;}hospital_stc;hospital_stchospitals[10];typedefstruct//呼救{intNum;intname;}Call_stc;Call_stccall_vex[52];typedefstruct//呼救地点与医院距离矩阵{intdistance;intNum;intname;}Call_Hos_stc;Call_Hos_stcHos_Call_matrix[10][52];Call_Hos_stcCall_Hos_matrix[52][10];typedefstruct//地点{charvex_name;intvex_Num;}Node_stc;Node_stcvertices[52];typedefstruct//路段{charv1_name;charv2_name;intv1_Num;intv2_Num;intdistance_v12;}section_Node;section_Nodesections[90];typedefstructArcCell//路径矩阵{intadj;intw;}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedefstruct{VertexTypevexs[MAX_VERTEX_NUM];AdjMatrixarcs;intvexnum,arcnum;}MGraph;MGraphG;typedefstructambulance//救护车{intNum;intNowStatus;chartermini_name;intwait_time;}CHE;typedefstructQNode{CHEche;structQNode*next;}QNode,*QueuePtr;typedefstruct//救护车队列{QueuePtrfront;QueuePtrrear;}LinkQueue;LinkQueueAmbuQueue[10];typedefstructevent//事件{intAidNo;intCallTime;intDealTime;intEventType;charOccurName;intOccur_GNum;intinterval;intHos_Num;intChe_Num;structevent*next;}EVENT;EVENT*EventList;EVENT*CallWaitList;//**********************定义变量**********************//intshort_path_matrix[99][99];//最短路径矩阵intVexNum,HosNum,ArcNum,CheNum,Call_VexNum;//地点数,医院数,路段数,救护车数,呼救地点数;intnum[20];intnearest_Hos[99];//最近医院intfreqMOD=0,delayMOD=500;intAidEvent_Num=0;intEndTime=999;//结束时间intCurrentTime;//当前时间intServicedNum;//已送达病人数intTotalDelayTime,TotalWaitTime,TotalDealTime,road_length;//总延迟,等待,处理事件,路段长度floatDelayAverage,WaitAverage,DealAverage;//平均延迟,等待,处理//**********************定义函数**********************//voidstart();voidready();intGName_GNum(MGraph,char);voidreadfile();//读文件函数voidCreateGraph(MGraph*);//创建矩阵voidarrange_ambulances();//安排救护车voidInitAmbu();//初始化救护车队列StatusInitQueue(LinkQueue*);//初始化StatusEnQueue(LinkQueue*,CHE);//进队StatusDeQueue(LinkQueue*);//出队CHEGetAmbu(LinkQueue);StatusIsEmptyQueue(LinkQueue);//判断队列是否为空StatusDisplay_Queue(LinkQueue);//显示队列EVENT*InsertEvent(EVENT*,EVENT);//插入事件队列EVENT*DeleteEvent(EVENT*);//删除事件EVENTGetEvent(EVENT*);//获取事件voidEvent_Call();//事件函数voidEvent_ArriveHome();voidEvent_ArriveHos();voidDisplay_WaitingAmbu();//显示函数voidDisplay_Patient_Status(EVENT*,EVENT*);voidDisplay_Ambulance_Status(EVENT*);voidDisplay_All();intmain()//主函数{system(cls);//清屏loop:printf(请输入结束时间(h=999):\n);scanf(%d,&EndTime);if(EndTime999){printf(无效输入,请再次输入!\n);gotoloop;}ready();InitAmbu();start();}voidready(){intl,k,i,j,not_hos,temp;intP[MAX_VERTEX_NUM][MAX_VERTEX_NUM],D[MAX_VERTEX_NUM];system(cls);readfile();//读文件arrange_ambulances();//安排救护车CreateGraph(&G);//创建矩阵G.vexnum=VexNum;G.arcnum=ArcNum;for(k=0;k=G.vexnum-1;k++)//最短路径{Short_Path(G,k,P,D);for(i=0;i=G.vexnum-1;i++){short_path_matrix[k][i]=D[i];}}printf(\nPressanykeytocontinue...\n);getch();system(cls);for(i=0,k=0;i=G.vexnum-1;i++)//筛选出呼救地点和医院地点{not_hos=0;for(j=0;j=HosNum-1;j++){if(i!=hospitals[j].hospital_Num)not_hos++;elsebreak;}if(not_hos==HosNum){call_vex[k].Num=i;call_vex[k].name=vertices[call_vex[k].Num].vex_name;k++;}}for(i=0;i=HosNum-1;i++)//医院距离呼救地点距离{for(j=0,l=0;j=VexNum-1;j++){not_hos=0;for(k=0;k=HosNum-1;k++){if(j!=hospitals[k].hospital_Num)not_hos++;elsebreak;}if(not_hos==HosNum){Hos_Call_matrix[i][l].distance=short_path_matrix[hospitals[i].hospital_Num][j];Hos_Call_matrix[i][l].name=call_vex[l].name;Hos_Call_matrix[i][l].Num=call_vex[l].Num;l++;}}}for(i=0;i=Call_VexNum-1;i++)//呼救地点距离医院的距离{for(j=0;j=HosNum-1;j++){Call_Hos_matrix[i][j].distance=Hos_Call_matrix[j][i].distance;Call_Hos_matrix[i][j].name=hospitals[j].hospital_name;Call_Hos_matrix[i][j].Num=hospitals[j].hospital_Num;}}for(k=0;k=Call_VexNum-1;k++)//按距离排序{for(i=1;i=HosNum-1;i++)for(j=0;j=HosNum-2;j++){if(Call_Hos_matrix[k][j].distanceCall_Hos_matrix[k][j+1].distance){temp=Call_Hos_matrix[k][j].distance;Call_Hos_matrix[k][j].distance
本文标题:救护车调度模拟系统课程设计报告
链接地址:https://www.777doc.com/doc-2418444 .html