高速公路客运活动仿真程序.doc
高速公路客运活动仿真程序 设计说明书一、 问题描述 1.本问题目的是进行西安到宝鸡高速公路运作的仿真。在西安市到宝鸡市之间的高速公路是一条主要的线路之一,经过简化后的客运路线端点、中途停靠点和里程如下图所示(括号里是简称,里程的单位是公里)。从西安到宝鸡的高速公路上有两种车:沃尔沃和依维柯,车中有两种最主要的属性:速度和容量。汽车每天在一定的时间区间内会在两地间互相行驶。在西安和宝鸡两地每时每刻都会产生乘客,在西安和宝鸡之间有XY, XP, WG, CP, GZ五个中间站,乘客会选择在五个站中的任意一站和终点站下车,中途只许下车不许上车。从西安到宝鸡的车到了宝鸡自动排在从宝鸡到西安的车的车队末尾。宝鸡(BJ) 蔡家坡(CP) 兴平(XP) 西安(XN)242162212422 虢镇(GZ) 武功(WG) 咸阳(XY)2.限定条件(1)从 XN 始发至 BJ 的客车和从 BJ 始发至 XN 的客车均有两种车型:沃尔沃(限定乘客人数为 40 人);依维柯(限定乘客人数为 21 人)。沃尔沃的速度为 2 公里/分钟,依维柯的速度为 1.4 公里/分钟。(2)起始状态时,XN 拥有沃尔沃和依维柯客车分别为 XN W 和 XNY 辆,BJ 拥有沃尔沃和依维柯客车分别为 BJ W 和 BJ Y 辆。(3)从 XN 至 BJ 和从 BJ 至 XN 的沃尔沃,均为上午 8:30 开始,每小时一班,最后一班为下午 5:30;从 XN 至 BJ 和从 BJ 至 XN 的依维柯,均为上午 8:00 开始,每20 分钟一班,最后一班为下午 6:00。(4)从 XN 至 BJ 的客车到达 BJ 后,即成为从 BJ 至 XN 的客车,排在当时 BJ 同类车型的队尾,再按(3)确定发车时间;从 BJ 至 XN 的客车到达 XN 后的规则相同。(5)只考虑途中只有乘客下车、没有乘客上车的情况。(6)有乘客下车时,不论方向与车型,停车时间统一为 2 分钟。(7)乘坐从 XN 至 BJ 客车的乘客,其下车点为 XY、XP、WG、CP、GZ 和 BJ 的可能性分别为 P_XBXY 、P_XBXP 、P_XBWG 、P_XBCP 、P_XBG Z 和 P_XBB J。这些可能性之和为 1;乘坐从 BJ 至 XN 客车的乘客,其下车点为 GZ、CP、WG、XP、XY和 XN 的可能性分别为 P_BXGZ、P_BXCP 、P_BXWG 、P_BX XP 、P_BX XY 和 P_BX XN 。这些可能性之和为 1。3.须仿真的客运活动(1)从上午 7:30 开始到下午 5:59 为止,每分钟分别在 XN 和 BJ 随机产生去往 BJ 和 XN 方向的新到达的乘客。每分钟到达的人数范围为 0PN 人。(2)按照限定条件(7)的规定,随机产生新到达的乘客的目的地。(3)乘客按到达的先后顺序上最近一辆(依照限定条件(3)的规定)始发的客车,若该车客满则等候下一辆始发的客车。(4)若客车到达中途停靠站时有乘客在此下车,按限定条件(5)和(6)处理,否则不停车继续行驶。4.仿真时的可变参数(1)XN 和 BJ 在仿真开始时拥有的客车数量 XNW 、 Y 、 W 和 BJ Y 。XN BJ可先按 XNW =5,XNY =12,BJ W =4,BJ Y =15 进行,然后自己可以改变其中一个或多个,来观察不同起始状态对仿真结果的影响。(2)确定乘客目的地的可能性 P_XBXY 、P_XBXP 、P_XBWG 、P_XBCP 、P_XBG Z 和 P_XBB J,以及 P_BXGZ、P_BX CP 、P_BXWG 、P_BX XP 、P_BX XY 和 P_BXXN 。应注意乘客去往远一些的目的地的可能性,通常大于去往近一些的目的地的可能性。(3)每分钟到达的人数上限 PN 。可先按 PN =2 进行,然后自己可以改变,来观察不同。5.经过分析在仿真系统中应至少包括如下功能(1)始发站控制产生相应的客车(根据预先给定的汽车的属性);(2)始发站控制产生相应的乘客;(3)乘客来到车站以后选择合适的车,上车;(4)汽车到了发车时间,发车;(5)汽车在公路上行驶(包括在中间站停车);(6)汽车到终点站,并准备再次发车,执行(4);(7)乘客到站下车。二、 建立模型1定义结构typedef struct Quenode int get_off6; int nop; char plate; char *model; struct Quenode *next; Quenode; /typedef struct quefr Quenode *front,*rear; quefr; /quefr *Createqueue(char *x,int m,char *m1) Quenode *h=NULL,*p=NULL;quefr *q=NULL;h=(Quenode*)malloc(sizeof(Quenode); q=(quefr*)malloc(sizeof(quefr);h->plate=*(x+0);h->nop=0;h->model=m1;q->front=h;q->rear=h;for(int i=1;i<m;i+) p=(Quenode*)malloc(sizeof(Quenode); p->plate=*(x+i); p->nop=0; p->model=m1; p->next=NULL; q->rear->next=p; q->rear=p; return q; /Quenode *deque(quefr *q) Quenode *p,*p1;p1=q->front;p=q->front->next;q->front=p;return p1; /void enque(quefr *q,Quenode *e) q->rear->next=e;q->rear=e; 其中包括了客车运行的所有状态:车牌号(plate),车型(modle),客车每个停靠点下车人数(get_off6),客车的座位数,上车的总人数(nop)。2 定义车型,创建队列链表charw15='a','b','c','d','e' /西安站依维柯客车型号 char y112='A','B','C','D','E','F','G','H','I','J','K','L' /西安站沃尔沃客车型号 charw24='f','g','h','i' /宝鸡站依维柯客车型号 char y215='M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','' /宝鸡站沃尔沃客车型号q1=Createqueue(y1,12,mod1); q2=Createqueue(w1,5,mod2); q3=Createqueue(y2,15,mod1);q4=Createqueue(w2,4,mod2); /创建4个队列3 时间与刷屏显示while(1)Sleep(1000);system("cls"); if(M=59)H+=1;M=00; elseM+=1; 三、 仿真流程源程序清单/ 2013软件技术大作业.cpp : 定义控制台应用程序的入口点。/定义1秒等于1分钟/客车提前10分钟上车#include"stdafx.h"#include <iostream>#include "stdlib.h"#include "windows.h"#include <thread>#include <vector>#include <random>using namespace std;/double w_s=2.0; /沃尔沃速度double y_s=1.4; /依维柯速度int w=40,y=21; /车内座位数char *mod1="依维柯" /车型char *mod2="沃尔沃"double n16=0.1,0.13,0.16,0.16,0.20,0.25; /自定义西安到宝鸡,乘客在每站下车的概率double n26=0.1,0.13,0.16,0.16,0.20,0.25; / 宝鸡到西安,乘客在每站下车的概率/typedef struct Quenode /队列链表结点int get_off6; /每站下车的人数 int nop; /上车的总人数char plate; /车牌号char *model; /车型struct Quenode *next;Quenode; /Typedefstructquefr /队列链表的头指针和尾指针Quenode *front,*rear;quefr; /quefr*Createqueue(char*x,intm,char*m1) /创建队列链表 Quenode *h=NULL,*p=NULL;quefr *q=NULL;h=(Quenode*)malloc(sizeof(Quenode); /分配容量q=(quefr*)malloc(sizeof(quefr);h->plate=*(x+0);h->nop=0;h->model=m1;q->front=h;q->rear=h;for(int i=1;i<m;i+)p=(Quenode*)malloc(sizeof(Quenode);p->plate=*(x+i);p->nop=0;p->model=m1;p->next=NULL;q->rear->next=p;q->rear=p;return q; /Quenode *deque(quefr *q) /弹出队首元素Quenode *p,*p1;p1=q->front;p=q->front->next;q->front=p;return p1;/voidenque(quefr *q,Quenode *e) /在队尾进入元素q->rear->next=e;q->rear=e;/void Number_waiting_Y(Quenode*p1,Quenode*p3,int *h,int *m) /依维柯在西安站和宝鸡站情况 bool f1=0,f2=0;if(y>p1->nop)srand(unsigned)time(NULL);p1->nop+=(rand()%2); /到西安站候车人数 if(p1->nop<y)cout<<"西安站的依维柯客车"<<"("<<"型号"<<p1->plate<<")"<<"正在站内!"<<"还剩:"<<y-p1->nop<<"张票额"<<endl; if(p1->nop=y) cout<<"开往宝鸡方向的"<<"("<<"型号"<<p1->plate<<")"<<"依维柯客车"<<"票额已卖完"<<endl;f1=1; if(y>p3->nop)srand(unsigned)time(NULL);p3->nop+=(rand()%2+1); /到宝鸡站候车人数if(p3->nop<y)cout<<"宝鸡站的依维柯客车"<<"("<<"型号"<<p3->plate<<")"<<"正在站内!"<<"还剩:"<<y-p3->nop<<"张票额"<<endl; if(p3->nop=y) cout<<"开往西安方向的"<<"("<<"型号"<<p1->plate<<")"<<" 依维柯客车"<<"票额已卖完"<<endl;f2=1; if(*h>=8)&&(*m=0|*m=20|*m=40)|(f1=1&&f2=1) /依维柯发车时间 int i;for(i=0;i<6;i+)p1->get_offi=p1->nop*n1i;p3->get_offi=p3->nop*n2i;p1->get_off6+=2;p3->get_off6+=2;cout<<endl<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<endl;/void Number_waiting_W(Quenode*p2,Quenode*p4,int *h1,int *m1) /沃尔沃在西安站和宝鸡站的情况bool f1=0,f2=0;if(y>p2->nop)srand(unsigned)time(NULL);p2->nop+=(rand()%2+1); /到西安站候车人数if(p2->nop<y)cout<<"西安站的沃尔沃客车"<<"("<<"型号"<<p2->plate<<")"<<"正在站内!"<<"还剩:"<<y-p2->nop<<"张票额"<<endl; if(p2->nop=y) cout<<"开往宝鸡方向的"<<"("<<"型号"<<p2->plate<<")"<<"沃尔沃客车"<<"票额已卖完"<<endl;f1=1; if(y>p4->nop)srand(unsigned)time(NULL);p4->nop+=(rand()%2+1); /到宝鸡站候车人数if(p4->nop<y)cout<<"宝鸡站的沃尔沃客车"<<"("<<"型号"<<p4->plate<<")"<<"正在站内!"<<"还剩:"<<y-p4->nop<<"张票额"<<endl; if(p4->nop=y) cout<<"开往西安方向的"<<"("<<"型号"<<p4->plate<<")"<<"沃尔沃客车"<<"票额已卖完"<<endl;f2=1; if(*h1)*60+*m1)%20=0&&(*h1)>=8)|(f1=1&&f2=1)int i;for(i=0;i<6;i+)p2->get_offi=p2->nop*n1i;p4->get_offi=p4->nop*n2i;p2->get_off6+=2;p4->get_off6+=2; /车内人数cout<<endl<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<'*'<<endl;/char ModelPut(char *md)for(int i=0;i<6;i+)cout<<*(md+i);return 0;/bool DIS1(Quenode *p,quefr *q,double dis) /西安到宝鸡if(dis<20.6) /定义一个范围表示是否到站,dis表示距离cout<<ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离咸阳还有"<<22-dis<<"公里"<<'('<<"车上有"<<p->nop<<"人"<<')'<<endl;if(dis>20.6&&dis<=22)if(p->get_off0!=0)p->nop=p->nop-p->get_off0;cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在咸阳站有"<<p->get_off0<<"人下车" cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在咸阳无人下车,咸阳站不停!"<<endl;return 0;if(dis<44.6&&dis>22)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离兴平还有"<<double(46-dis)<<"公里"<<'('<<"车上有"<<p->nop<<"人"<<')'<<endl;if(dis>44.6&&dis<=46)if(p->get_off1!=0)p->nop=p->nop-p->get_off1; cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在兴平站有"<<p->get_off1<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在兴平无人下车,兴平站不停!"<<endl;return 0;if(dis<65.6&&dis>46)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离武功还有"<<double(67-dis)<<"公里"<<'('<<"车上有"<<p->nop<<"人"<<')'<<endl;if(dis>65.6&&dis<=67)if(p->get_off2!=0)p->nop=p->nop-p->get_off2; cout<<"车牌号"<<p->plate<<"的"<< ModelPut(p->model)<<"客车在武功站有"<<p->get_off2<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在武功无人下车,武功站不停!"<<endl;if( dis<127.6&&dis>67)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离蔡家坡还有"<<double(129-dis)<<"公里"<<'('<<"车上有"<<p->nop<<"人"<<')'<<endl;if(dis>127.6&&dis<=129)if(p->get_off3!=0)p->nop=p->nop-p->get_off3; cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在蔡家坡站有"<<p->get_off3<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在蔡家坡无人下车,蔡家坡站不停!"<<endl;if( dis<148.6&&dis>129)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离虢镇站还有"<<double(150-dis)<<"公里"<<'('<<"车上有"<<p->nop<<"人"<<')'<<endl;if(dis>148.6&&dis<=150)if(p->get_off4!=0)p->nop=p->nop-p->get_off4; cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在虢镇站有"<<p->get_off4<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在虢镇无人下车,虢镇站不停!"<<endl;if( dis<172.6&&dis>150)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离宝鸡还有"<<double(174-dis)<<"公里"<<'('<<"车上有"<<p->nop<<"人"<<')'<<endl;if(dis>172.6&&dis<=174)cout<<"车牌号"<<p->plate<<"的"<< ModelPut(p->model)<<"客车到站,有"<<p->get_off5<<"人下车"<<endl;enque(q,p);return 1;/bool DIS2(Quenode *p,quefr *q,double dis) /宝鸡到西安if(dis<22.6)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离虢镇有"<<double(24-dis)<<"公里"<<'('<<"车上有"<<"人"<<p->nop<<')'<<endl;if(dis>22.6&&dis<=24)if(p->get_off0!=0)p->nop=p->nop-p->get_off0;cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在虢镇站有"<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在虢镇无人下车,虢镇站不停!"<<endl;if(dis<43.6&&dis>24)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"离蔡家坡还有"<<double(45-dis)<<"公里"<<'('<<"车上有"<<"人"<<p->nop<<')'<<endl;if(dis>43.6&&dis<=45)if(p->get_off1!=0)p->nop=p->nop-p->get_off1;cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在蔡家坡站还有"<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在蔡家坡无人下车,蔡家坡站不停!"<<endl;if( dis<105.6&&dis>45)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"武功有"<<double(107-dis)<<"公里"<<'('<<"车上有"<<"人"<<p->nop<<')'<<endl;return 0;if(dis>105.6&&dis<=107)if(p->get_off2!=0)p->nop=p->nop-p->get_off2;cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在武功站有"<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在武功无人下车,武功站不停!"<<endl;if( dis<126.6&&dis>107)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"兴平还有"<<double(128-dis)<<"公里"<<'('<<"车上有"<<"人"<<p->nop<<')'<<endl;return 0;if(dis>126.6&&dis<=128)if(p->get_off3!=0)p->nop=p->nop-p->get_off3; cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在兴平站有"<<"人下车" cout<<"停车两分钟;" Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在兴平无人下车,兴平站不停!"<<endl;if( dis<150.6&&dis>128)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"咸阳还有"<<double(152-dis)<<"公里"<<'('<<"车上有"<<"人"<<p->nop<<')'<<endl;if(dis>150.6&&dis<=152)if(p->get_off4!=0)p->nop=p->nop-p->get_off4;cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在咸阳站有"<<"人下车"cout<<"停车两分钟;"Sleep(2000);elsecout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"在咸阳无人下车,咸阳站不停!"<<endl;if( dis<172.6&&dis>152)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"西安还有"<<double(174-dis)<<"公里"<<'('<<"车上有"<<"人"<<p->nop<<')'<<endl;if(dis>172.6&&dis<=174)cout<< ModelPut(p->model)<<"客车"<<'('<<"车牌号为"<<p->plate<<')'<<"到站,有"<<p->get_off5<<"人下车"<<endl;enque(q,p);return 1;void Dis_XBW(Quenode *p,quefr *q,int *h,int *m) /西安到宝鸡的沃尔沃bool t=0;while(1) double dis=0; dis=(*h)*60+(*m)-(8*60+30)*2.0; t=DIS1(p,q,dis); if(t=1)break; Sleep(5000);/void Dis_BXW(Quenode *p,quefr *q,int *h1,int *m1) /宝鸡到西安的沃尔沃 bool t=0;while(1) double dis=0; dis=(*h1)*60+(*m1)-(8*60+30)*2.0;/距离 t=DIS2(p,q,dis); if(t=1)break;Sleep(5000);/void Dis_XBY1(Quenode *p,quefr *q,int *h,int *m) /西安到宝鸡的依维柯8:00bool t=0;while(1)double dis=0; dis=(*h)*60+(*m)-(8*60+0)*1.4;t=DIS1(p,q,dis);if(t=1)break;Sleep(50