高速公路客运活动仿真程序.docx
《高速公路客运活动仿真程序.docx》由会员分享,可在线阅读,更多相关《高速公路客运活动仿真程序.docx(28页珍藏版)》请在冰豆网上搜索。
![高速公路客运活动仿真程序.docx](https://file1.bdocx.com/fileroot1/2023-1/11/ef44040a-e8ff-4077-bbd0-fcc039102259/ef44040a-e8ff-4077-bbd0-fcc0391022591.gif)
高速公路客运活动仿真程序
高速公路客运活动仿真程序
设计说明书
一、问题描绘
1.本问题目的是进展西安到宝鸡高速公路运作的仿真。
在西安市到宝鸡市之间的高速公路是一条主要的线路之一,经过简化后的客运道路端点、中途停靠点和里程如以下图所示〔括号里是简称,里程的单位是公里〕。
从西安到宝鸡的高速公路上有两种车:
沃尔沃和依维柯,车中有两种最主要的属性:
速度和容量。
汽车每天在一定的时间区间内会在两地间互相行驶。
在西安和宝鸡两地每时每刻都会产生乘客,在西安和宝鸡之间有XY,XP,WG,CP,GZ五个中间站,乘客会选择在五个站中的任意一站和终点站下车,中途只许下车不许上车。
从西安到宝鸡的车到了宝鸡自动排在从宝鸡到西安的车的车队末尾。
宝鸡〔BJ〕蔡家坡〔CP〕兴平〔XP〕西安〔XN〕
24
21
62
21
24
22
虢镇〔GZ〕武功〔WG〕咸阳〔XY〕
〔1〕从XN始发至BJ的客车和从BJ始发至XN的客车均有两种车型:
沃尔沃〔限定乘客人数为40人〕;依维柯〔限定乘客人数为21人〕。
沃尔沃的速度为2公里/分钟,依维柯的速度为1.4公里/分钟。
〔2〕起始状态时,XN拥有沃尔沃和依维柯客车分别为XNW和XNY辆,BJ拥有沃尔沃和依维柯客车分别为BJW和BJY辆。
〔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_XBGZ和P_XBBJ。
这些可能性之和为1;乘坐从BJ至XN客车的乘客,其下车点为GZ、CP、WG、XP、XY和XN的可能性分别为P_BXGZ、P_BXCP、P_BXWG、P_BXXP、P_BXXY和P_BXXN。
这些可能性之和为1。
〔1〕从上午7:
30开始到下午5:
59为止,每分钟分别在XN和BJ随机产生去往BJ和XN方向的新到达的乘客。
每分钟到达的人数范围为0~PN人。
〔2〕按照限定条件〔7〕的规定,随机产生新到达的乘客的目的地。
〔3〕乘客按到达的先后顺序上最近一辆〔按照限定条件〔3〕的规定〕始发的客车,假设该车客满那么等候下一辆始发的客车。
〔4〕假设客车到达中途停靠站时有乘客在此下车,按限定条件〔5〕和〔6〕处理,否那么不停车继续行驶。
〔1〕XN和BJ在仿真开始时拥有的客车数量XNW、Y、W和BJY。
XNBJ可先按XNW=5,XNY=12,BJW=4,BJY=15进展,然后自己可以改变其中一个或多个,来观察不同起始状态对仿真结果的影响。
〔2〕确定乘客目的地的可能性P_XBXY、P_XBXP、P_XBWG、P_XBCP、P_XBGZ和P_XBBJ,以及P_BXGZ、P_BXCP、P_BXWG、P_BXXP、P_BXXY和P_BXXN。
应注意乘客去往远一些的目的地的可能性,通常大于去往近一些的目的地的可能性。
〔3〕每分钟到达的人数上限PN。
可先按PN=2进展,然后自己可以改变,来观察不同。
5.经过分析在仿真系统中应至少包括如下功能
〔1〕始发站控制产生相应的客车〔根据预先给定的汽车的属性〕;
〔2〕始发站控制产生相应的乘客;
〔3〕乘客来到车站以后选择适宜的车,上车;
〔4〕汽车到了发车时间,发车;
〔5〕汽车在公路上行驶〔包括在中间站停车〕;
〔6〕汽车到终点站,并准备再次发车,执行〔4〕;
〔7〕乘客到站下车。
二、建立模型
1定义构造
typedefstructQuenode
{
intget_off[6];
intnop;
charplate;
char*model;
structQuenode*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(inti=1;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;}
returnq;}
//
Quenode*deque(quefr*q)
{Quenode*p,*p1;
p1=q->front;
p=q->front->next;
q->front=p;
returnp1;}
//
voidenque(quefr*q,Quenode*e)
{q->rear->next=e;
q->rear=e;}
其中包括了客车运行的所有状态:
车牌号〔plate〕,车型〔modle〕,客车每个停靠点下车人数〔get_off[6]〕,客车的座位数,上车的总人数〔nop〕。
2定义车型,创立队列链表
charw1[5]={'a','b','c','d','e'};//西安站依维柯客车型号
chary1[12]={'A','B','C','D','E','F','G','H','I','J','K','L'};//西安站沃尔沃客车型号
charw2[4]={'f','g','h','i'};//宝鸡站依维柯客车型号
chary2[15]={'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;}
else{M+=1;}}
三、仿真流程
源程序清单
//2021软件技术大作业.cpp:
定义控制台应用程序的入口点。
//定义1秒等于1分钟
//客车提早10分钟上车
#include"stdafx.h"
#include
#include"stdlib.h"
#include"windows.h"
#include
#include
#include
usingnamespacestd;
//
doublew_s=2.0;//沃尔沃速度
doubley_s=1.4;//依维柯速度
intw=40,y=21;//车内座位数
char*mod1="依维柯";//车型
char*mod2="沃尔沃";
doublen1[6]={0.1,0.13,0.16,0.16,0.20,0.25};//自定义西安到宝鸡,乘客在每站下车的概率
doublen2[6]={0.1,0.13,0.16,0.16,0.20,0.25};//宝鸡到西安,乘客在每站下车的概率
//
typedefstructQuenode//队列链表结点
{
intget_off[6];//每站下车的人数
intnop;//上车的总人数
charplate;//车牌号
char*model;//车型
structQuenode*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(inti=1;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;
}
returnq;
}
//
//
Quenode*deque(quefr*q)//弹出队首元素
{
Quenode*p,*p1;
p1=q->front;
p=q->front->next;
q->front=p;
returnp1;
}
//
voidenque(quefr*q,Quenode*e)//在队尾进入元素
{
q->rear->next=e;
q->rear=e;
}
//
voidNumber_waiting_Y(Quenode*p1,Quenode*p3,int*h,int*m)
//依维柯在西安站和宝鸡站情况
{
boolf1=0,f2=0;
if(y>p1->nop)
{
srand((unsigned)time(NULL));
p1->nop+=(rand()%2);//到西安站候车人数
if(p1->nop{
cout<<"西安站的依维柯客车"<<"("<<"型号"<plate<<")"<<"正在站内!
"<<"还剩:
"<nop<<"张票额"<}
if(p1->nop==y)
{
cout<<"开往宝鸡方向的"<<"("<<"型号"<plate<<")"<<"依维柯客车"<<"票额已卖完"<}
}
if(y>p3->nop)
{
srand((unsigned)time(NULL));
p3->nop+=(rand()%2+1);//到宝鸡站候车人数
if(p3->nop{
cout<<"宝鸡站的依维柯客车"<<"("<<"型号"<plate<<")"<<"正在站内!
"<<"还剩:
"<nop<<"张票额"<}
if(p3->nop==y)
{
cout<<"开往西安方向的"<<"("<<"型号"<plate<<")"<<"依维柯客车"<<"票额已卖完"<}
}
if(((*h>=8)&&(*m==0||*m==20||*m==40))||(f1==1&&f2==1))//依维柯发车时间
{
inti;
for(i=0;i<6;i++)
{
p1->get_off[i]=p1->nop*n1[i];
p3->get_off[i]=p3->nop*n2[i];
}
p1->get_off[6]+=2;p3->get_off[6]+=2;
}
cout<}
//
voidNumber_waiting_W(Quenode*p2,Quenode*p4,int*h1,int*m1)//沃尔沃在西安站和宝鸡站的情况
{
boolf1=0,f2=0;
if(y>p2->nop)
{
srand((unsigned)time(NULL));
p2->nop+=(rand()%2+1);//到西安站候车人数
if(p2->nop{
cout<<"西安站的沃尔沃客车"<<"("<<"型号"<plate<<")"<<"正在站内!
"<<"还剩:
"<nop<<"张票额"<}
if(p2->nop==y)
{
cout<<"开往宝鸡方向的"<<"("<<"型号"<plate<<")"<<"沃尔沃客车"<<"票额已卖完"<}
}
if(y>p4->nop)
{
srand((unsigned)time(NULL));
p4->nop+=(rand()%2+1);//到宝鸡站候车人数
if(p4->nop{
cout<<"宝鸡站的沃尔沃客车"<<"("<<"型号"<plate<<")"<<"正在站内!
"<<"还剩:
"<nop<<"张票额"<}
if(p4->nop==y)
{
cout<<"开往西安方向的"<<"("<<"型号"<plate<<")"<<"沃尔沃客车"<<"票额已卖完"<}
}
if((((*h1)*60+*m1)%20==0&&(*h1)>=8)||(f1==1&&f2==1))
{
inti;
for(i=0;i<6;i++)
{
p2->get_off[i]=p2->nop*n1[i];
p4->get_off[i]=p4->nop*n2[i];
}
p2->get_off[6]+=2;p4->get_off[6]+=2;//车内人数
}
cout<}
//
charModelPut(char*md)
{
for(inti=0;i<6;i++)
{
cout<<*(md+i);
}
return0;
}
//
boolDIS1(Quenode*p,quefr*q,doubledis)//西安到宝鸡
{
if(dis<20.6)//定义一个范围表示是否到站,dis表示间隔
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"离咸阳还有"<<22-dis<<"公里"<<'('<<"车上有"<nop<<"人"<<')'<}
if(dis>20.6&&dis<=22)
{
if(p->get_off[0]!
=0)
{
p->nop=p->nop-p->get_off[0];
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在咸阳站有"<get_off[0]<<"人下车";
cout<<"停车两分钟;";
Sleep(2000);
}
else
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在咸阳无人下车,咸阳站不停!
"<}return0;
}
if(dis<44.6&&dis>22)
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"离兴平还有"<nop<<"人"<<')'<}
if(dis>44.6&&dis<=46)
{
if(p->get_off[1]!
=0)
{
p->nop=p->nop-p->get_off[1];
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在兴平站有"<get_off[1]<<"人下车";
cout<<"停车两分钟;";
Sleep(2000);}
else
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在兴平无人下车,兴平站不停!
"<}return0;
}
if(dis<65.6&&dis>46)
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"离武功还有"<nop<<"人"<<')'<}
if(dis>65.6&&dis<=67)
{
if(p->get_off[2]!
=0)
{
p->nop=p->nop-p->get_off[2];
cout<<"车牌号"<plate<<"的"<model)<<"客车在武功站有"<get_off[2]<<"人下车";
cout<<"停车两分钟;";
Sleep(2000);
}
else
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在武功无人下车,武功站不停!
"<}
}
if(dis<127.6&&dis>67)
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"离蔡家坡还有"<nop<<"人"<<')'<}
if(dis>127.6&&dis<=129)
{
if(p->get_off[3]!
=0)
{
p->nop=p->nop-p->get_off[3];
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在蔡家坡站有"<get_off[3]<<"人下车";
cout<<"停车两分钟;";
Sleep(2000);
}
else
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在蔡家坡无人下车,蔡家坡站不停!
"<}
}
if(dis<148.6&&dis>129)
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"离虢镇站还有"<nop<<"人"<<')'<}
if(dis>148.6&&dis<=150)
{
if(p->get_off[4]!
=0)
{
p->nop=p->nop-p->get_off[4];
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在虢镇站有"<get_off[4]<<"人下车";
cout<<"停车两分钟;";
Sleep(2000);
}
else
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"在虢镇无人下车,虢镇站不停!
"<}
}
if(dis<172.6&&dis>150)
{
cout<model)<<"客车"<<'('<<"车牌号为"<plate<<')'<<"离宝鸡还有"<nop<<"人"<<')'<}
if(dis>172.6&&dis<=174)
{
cout<<"车牌号"<plate<<"的"<model)<<"客车到站,有"<get_off[5]<<"人下车"<enque(q,p);
return1;
}
}
//
boolDIS2(Quenode*p,quefr*q,doubledis)//宝鸡到西安
{
if(dis