机场航空管制模拟实验报告汇总.doc

上传人:牧羊曲112 文档编号:4034608 上传时间:2023-04-01 格式:DOC 页数:28 大小:453.50KB
返回 下载 相关 举报
机场航空管制模拟实验报告汇总.doc_第1页
第1页 / 共28页
机场航空管制模拟实验报告汇总.doc_第2页
第2页 / 共28页
机场航空管制模拟实验报告汇总.doc_第3页
第3页 / 共28页
机场航空管制模拟实验报告汇总.doc_第4页
第4页 / 共28页
机场航空管制模拟实验报告汇总.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《机场航空管制模拟实验报告汇总.doc》由会员分享,可在线阅读,更多相关《机场航空管制模拟实验报告汇总.doc(28页珍藏版)》请在三一办公上搜索。

1、机场航空管制模拟实验报告实验题目假设机场有一条跑道,每架飞机需花费一定时间着陆,花费一定时间起飞,飞机的起降满足一定的概率。一般来讲,机场存在两个队列,一个等待着陆的飞机队列和一个等待起飞的飞机队列,同样等待时间下,等待着陆的飞机比准备起飞的飞机具有更高的优先级。试编写程序模拟这个机场的运行。要求使用队列或优先队列实现;要求可以变换起飞和着陆频率来模拟一天中的飞行高峰期和空闲期;要求可以改变着陆和起飞时间以模拟不同的效果。1. 实验内容分析1.1实验目的实验模拟了机场的航空管制,通过程序,来模拟管理飞机的起飞与着陆。它要求我们考虑起飞与着陆的优先级不同,以及根据飞机起飞/着陆时间,起飞/着陆频

2、率模拟机场一天的运营情况。并计算出跑道的繁忙程度、着陆飞机的总的等待时间和平均等待时间、起飞飞机的总的等待时间和平均等待时间, 计算每架飞机花费在一个队列中的平均时间。1.2内容分析系统主要模拟了机场一天的运营。所以,需要一个计时器(以分钟计时)来计算机场的运营时间。同时,为了管理飞机的起飞与着陆,需要两个队列来存放着陆和起飞的飞机。设计用户输入的数据为:机场开始、结束运营时间;高峰期开始、结束时间;空闲期开始、结束时间;着陆飞机最长等待时间;高峰期、空闲期以及一般时期每小时起飞、着陆的飞机数,飞机起飞、着陆需要的时间。考虑到机场的高峰期,与空闲期,设计了Workslot类,设定不同时期的飞机

3、起飞、着陆率。设计Timer类,其主要方法是实现计时功能和返回当前工作时间。Plane类主要功能是记录飞机开始等待时间,开始工作时间以及起飞、着陆所需时间。飞机起飞/着陆都需要花费一定的时间,并不是马上就完成的。所以在起飞/着陆服务函数中,不仅要调用spend(),还需要判断takeoff/landing是否结束。当t.now-startworktimeworkTime时,说明飞机还在准备着陆/起飞,占用了跑道。当t.now-startworktime=workTime时,表示飞机着陆/起飞成功。调用pop方法,从队列中删除一架等待服务的飞机,并获取当前时间,减去飞机接受服务的时间,得到该飞机

4、的等待服务时间。我们就可以计算出所有飞机的等待服务时间。等待起飞/着陆队列总长度,等待服务总时间,以及服务起飞/着陆的飞机总数,我们就可以得出起飞/着陆飞机的平均等待时间,平均等待队列长度。同时根据当天的的工作时间,跑道的忙碌时间,可以计算得到跑道的繁忙程度。1.3程序基本流程图 1 实验基本流程1.4基本数据结构,类设计1.4.1类 Airport输入:变量名注释Timer t; 计时器Struct Busy b; 跑道是否忙碌int takeoffTime; 飞机起飞所需时间int landingTime; 飞机着陆所需时间int startworkTime; 机场当天开始运营时间int

5、endworkTime;机场当天结束运营时间Class Workslot highslot; 高峰时间段Class Workslot lowslot; 空闲时间段Class Workslot otherslot; 一般时间段deque takeoffq; 等待起飞飞机队列deque landingq; 等待着陆飞机队列int workTime; 跑道忙碌时间int TwaitTime; 总起飞等待时间int LwaitTime; 总着陆等待时间int takeoffwaitTime; 所有起飞飞机总等待时间int landingwaitTime; 所有着陆飞机总等待时间int maxlandi

6、ngwaitTime;最大着陆等待时间int intakeoffNum; 进入起飞队列飞机数int inlandingNum; 进入着陆队列飞机数int takeoffNum; 已经起飞飞机数int landingNum; 已经着陆飞机数int t_rate;用来保存起飞速率int l_rate;用来保存着陆速率输出变量名备注t.now当前时间int takeoffNum当前已起飞飞机数量int landingNum当前已着陆飞机数量int intakeoffNum当前已入起飞队列飞机数int inlandingNum当前已入着陆队列飞机数deque takeoffq起飞队列,元素类型为飞机类

7、型deque landingq着陆队列,元素类型为飞机类型double(workTime/(endworkTime-startworkTime)跑道的繁忙程度(用机场总工作时间与跑道忙碌时间之比来衡量)double landingwaitTime着陆飞机总的等待时间double (landingwaitTime/landingNum)着陆飞机平均等待时间double (LwaitTime/landingNum)着陆飞机在队列中的平均等待时间double takeoffwaitTime起飞飞机总的等待时间double (takeoffwaitTime/takeoffNum)起飞飞机平均等待时间d

8、ouble (TwaitTime/takeoffNum)起飞飞机在队列中的平均等待时间int IntakeoffNum takeoffNum运营结束时,起飞队列中剩余飞机数量成员方法名备注void run()运行仿真void setTimer()设定计时器函数void setTakeoffTime(int t1)设定起飞所需时间函数void setLandingTime(int t2)设定着陆所需时间函数void setMaxlandingwaitTime(int mlwd)设定着陆飞机最大等待时间void setStartworkTime(string s)设定机场开始工作时间函数void

9、setEndworkTime(string s)设定机场结束工作时间函数void setHighslot(Workslot h)设定高峰期机场属性void setLowslot(Workslot l)设定空闲期机场属性void setOtherslot(Workslot o)设定一般时段机场属性1.4.2类Plane成员:方法名备注int startwaitTime开始等待时间int startworkTime开始起飞/着陆时间int workTime起飞/着陆时间1.4.3类Timer成员:方法名备注int now计时器当前时间void spend()计时累加函数1.4.4类Workslot

10、成员:变量名备注int startTime该时间段开始时间int endTime该时间段结束时间int takeoffRate起飞频率(每小时起飞数)int landingRate着陆频率(每小时着陆数)1.4.5结构 Busy成员:变量名备注bool is_takeoff跑道中是否为起飞飞机bool busy跑道是否忙碌1.5基本函数功能1.5.1 类SimulationsetTimer():设定计时器函数setTakeoffTime(int t1):设定起飞所需时间函数setLandingTime(int t2):设定着陆所需时间函数setMaxlandingwaitTime(int ml

11、wd):设定着陆飞机最大等待时间setStartworkTime(string s):设定机场开始工作时间函数setEndworkTime(string s):设定机场结束工作时间函数setHighslot(Workslot h):设定高峰期机场属性setLowslot(Workslot l):设定空闲期机场属性setOtherslot(Workslot o):设定一般时段机场属性run():模拟飞机场运营。display():该函数主要用于计算一些值,并输出在屏幕上。跑道的繁忙程度=workTime/(endworkTime-startworkTime)着陆飞机平均等待时间=landingw

12、aitTime/landingNum着陆飞机在队列中的平均等待时间=LwaitTime/landingNum起飞飞机总的等待时间=takeoffwaitTime起飞飞机平均等待时间=takeoffwaitTime/takeoffNum起飞飞机在队列中的平均等待时间=TwaitTime/takeoffNum起飞队列中剩余未起飞飞机数量=intakeoffNum-takeoffNum再使用输出语句输出这些值。1.5.2 类PlanePlane()用于初始化飞机的startwaitTime,startworkTime,workTime。Plane(int a,int b,int c)同上。1.5.3

13、 类TimerTimer()初始化当前时间。Timer(int n)同上。void spend()计时累加函数。2. 实验验证分析2.1输入的形式和输入值的范围变量名类型范围输入示例机场开始工作时间string0:0024:002:00机场结束工作时间string0:0024:0012:00高峰期开始时间string0:0024:002:00高峰期结束时间string0:0024:005:00空闲期开始时间string0:0024:006:00空闲期结束时间string0:0024:0010:00着陆飞机最长等待时间Int020高峰期飞机起飞率Int030高峰期飞机着陆率Int029空闲期飞机

14、起飞率Int0高峰期飞机起飞率12空闲期飞机着陆率Int0高峰期飞机着陆率13一般情况飞机起飞率Int空闲期飞机起飞率高峰期飞机起飞率20一般情况飞机着陆率Int空闲期飞机着陆率高峰期飞机着陆率23起飞所需时间Int1103着陆所需时间Int11022.2输出的形式控制台下运行,结果输出形式:时间: XX: XX X号起飞飞机进入起飞队列时间: XX: XX X号起飞飞机开始起飞; 等待时间: XXmin本日机场运营情况:跑道的繁忙程度: XX着陆飞机总的等待时间: XXh着陆飞机平均等待时间: XXmin着陆飞机在着陆队列中的平均等待时间: XXmin起飞飞机总的等待时间: XXh起飞飞机平

15、均等待时间: XXmin起飞飞机在起飞队列中的平均等待时间: XXmin起飞队列中剩余未起飞飞机数量: XX2.3程序所能达到的功能程序实现了如下的功能:u 设置机场的工作时间u 模拟机场的运营u 模拟机场的高峰期和空闲期u 计算出机场当天起飞/着陆的飞机数目u 计算出等待队列(起飞/着陆)的平均长度 u 计算队列的平均等待时间u 简单表示跑道的繁忙程度2.4测试数据第一组数据第二组数据第三组数据机场开始工作时间9:008:000:00机场结束工作时间12:0017:0024:00高峰期开始时间9:0015:009:00高峰期结束时间10:0017:0015:00空闲期开始时间11:308:0

16、03:00空闲期结束时间12:0011:008:00着陆飞机最长等待时间202015高峰期飞机起飞率423636高峰期飞机着陆率403335空闲期飞机起飞率121010空闲期飞机着陆率10912一般情况飞机起飞率202020一般情况飞机着陆率221722起飞所需时间333着陆所需时间333第一组数据第二组数据第三组数据跑道的繁忙程度 0.7555560.750.750694着陆飞机总的等待时间12.3333h15.8167h66.0333h着陆飞机平均等待时间17min8min11min着陆飞机在队列中的平均等待时间3min3min3min起飞飞机总的等待时间5.68333h18.4333h1

17、39.25h起飞飞机平均等待时间85min44min321min起飞飞机在队列中的平均等待时间44min21min55min起飞队列中剩余未起飞飞机数量61架148架531架3. 调试分析3.1遇到的问题及解决方法3.1.1问题一问题:在模拟结果中只有起飞飞机或着陆飞机。解决方案:算法出现问题,重新写主程序。3.1.1问题二问题:机场的忙碌情况大于1。解决方案:检查后发现,跑道功能工作时间的实现有问题,将代码进行改进。3.1.1问题三问题:产生随机数太过规则。解决方案:发现是产生随机数的函数位置有问题,进行调整。3.2技术难点分析3.2.1难点一一架飞机完成起飞/着陆花费一般超过一分钟,那么随

18、着时间的累积,该如何来判断对当前飞机的服务结束了呢。解决办法是给Plane类添加开始工作时间的参数,这样是要判断当前时间与开始工作时间的差值是否已到达起飞/着陆所耗时,即可判断起飞/着陆是否完成。3.2.2难点二单单用bool busy数据记录跑道是否忙碌会出现:当跑道忙碌时,不能判断跑道上运行的是起飞飞机还是着陆飞机这种情况。因此,我构造了Busy结构,里面不仅包括对跑道是否忙碌的的记录(bool busy)还包括对跑道上运行的是否为起飞飞机的记录(is_takeoff)。这样就可以判断跑道上忙碌时运行的是哪种飞机了。3.2.3难点三由于未采用优先队列,故起飞和着陆队列是分别独立的,那么如何

19、联系这两个队列是一大难点。由于本题我们采用着陆飞机优先的思想。故在跑道空闲的时候,先判断着陆队列是否为空,不为空就进行飞机着陆,为空则查看起飞队列是否为空,不为空则进行飞机起飞,为空则该时段不进行起飞。这样就可以不在优先队列中实现着陆飞机优先的思想。3.3印象最深刻的错误及修正方法3.3.1问题1问题:着陆/起飞飞机的在队列中的平均等待时间与实际不符存在矛盾。解决方法:查看原先对是否有等待飞机的判断语句为:if(takeoffq.size()2) TwaitTime+;if(landingq.size()2) LwaitTime+;这时就遗漏了当队列只有一架飞机但由于跑道此时为忙碌,所以该飞机

20、仍处于等待状态这种情况,故敬爱那个代码修改为:if(takeoffq.size()1 | (takeoffq.size()=1&takeoffq.front().startworkTime=-1) TwaitTime+;if(landingq.size()1 | (landingq.size()=1&landingq.front().startworkTime=-1) LwaitTime+;更改前运行结果:修正后运行结果:3.3.2问题2问题:一开始的程序没有加入deQueue.h文件,而是直接用了#include ,后面加入程序后一直没有调试成功 。调试过程:有报错框可知,因为程序开始设定的

21、时候用了模版类,因此。队列类里也需要加入模版函数。在队列类的函数调用过程中修改了需要用到的函数,确保其运行成功。 解决方法: 完善了队列类3.3.3问题3问题:要求机场24:00结束,但是程序只模拟到21:23分左右,之后再无飞机产生。而且之后的几小时内只有起飞飞机,无着陆飞机。多次模拟,均是类似结果。解决方法:首先分析该问题产生的可能原因,由于这种结果的太过规律性,怀疑是产生的随机数的问题,因此对产生随机数的语句进行分析,发现是将srand(int)time(0)语句放在for循环内造成的,故将srand(int)time(0)语句放到for循环外面。4. 测试结果4.1正常运行4.1.1输

22、入数据正确的情况:4.1.2输入数据错误的情况:4.2边界数据测试输入全部为05. 后期扩展1. 目前程序只模拟了一个跑道的情况,后期可以使用优先队列管理跑道,实现多跑道的飞机场运营模拟。2. 由于实验要求先处理完着陆队列再处理起飞队列,可能会导致模拟出来的情况与实际不符,期中可能要考虑更多因素,目前的实现上来说还有待提高。6. 源代码6.1类设计deQueue.h#ifndef DEQUEUE#define DEQUEUE#includeusing namespace std;template class node public: T nodeValue; node *next; node(

23、) : next(NULL) node(const T& item, node *nextNode = NULL) : nodeValue(item), next(nextNode) ;template class Queue public:Queue();void push_back(const T& item);void pop_front();T& front();const T& front() const;int size() const;bool empty() const; private:node *qfront,*qback;int count;template Queue:

24、Queue():qfront(NULL), qback(NULL), count(0)template void Queue:push_back(const T& item)node *newNode=new node(item, NULL);if(qfront=NULL)qfront=newNode;qback=newNode;elseqback-next=newNode;qback=newNode;count+;template void Queue:pop_front()if (empty() /count=0coutQueue pop_front(): empty queueendl;

25、node *tmp=qfront;qfront=qfront-next; if (qfront = NULL)qback = NULL;delete tmp;count-;template T& Queue:front()if (empty() )coutQueue front(): empty queuenodeValue;template int Queue:size() constreturn count;template bool Queue:empty() constreturn count=0; #endifTimer.h#ifndef TIMER#define TIMERclas

26、s Timerpublic:int now; /计时器当前时间Timer()Timer(int n)now=n;void spend() /计时累加函数now+;#endifPlane.h#ifndef PLANE#define PLANEclass Planepublic:int startwaitTime; /开始等待时间int startworkTime;/开始起飞/着陆时间int workTime; /起飞/着陆时间Plane()Plane(int a,int b,int c)startwaitTime=a;startworkTime=b;workTime=c;#endifWorksl

27、ot.h#include #include using namespace std;#ifndef WORKSLOT#define WORKSLOTclass Workslotpublic:int startTime; /该时间段开始时间int endTime; /该时间段结束时间int takeoffRate; /起飞频率(每小时起飞数)int landingRate; /着陆频率(每小时着陆数)Workslot()Workslot(string sT,string eT,int tR,int lR):takeoffRate(tR),landingRate(lR)int smin=0;int

28、 n1=sT.find_first_of(:);if(n1=1) smin=(sT0-0)*60;else if(n1=2) smin=(sT0-0)*10+(sT1-0)*60;else coutInput StartTime error!endl;smin+=(sTn1+1-0)*10+(sTn1+2-0);startTime=smin;int emin=0;int n2=eT.find_first_of(:);if(n2=1) emin=(eT0-0)*60;else if(n2=2) emin=(eT0-0)*10+(eT1-0)*60;else coutInput EndTime e

29、rror!endl;emin+=(eTn2+1-0)*10+(eTn2+2-0);endTime=emin;Workslot operator=(Workslot a)startTime=a.startTime;endTime=a.endTime;takeoffRate=a.takeoffRate;landingRate=a.landingRate;return *this;#endif6.2方法实现Airport.h#include #include #include #includedeQueue.h#include #include Workslot.h#include Plane.h#

30、include Timer.husing namespace std;#ifndef AIRPORT#define AIRPORTvoid chtime(int n)if(n%60/10!=0) cout时间: setw(2)n/60:setw(2)n%60;elsecout时间: setw(2)n/60:0n%60;struct Busybool is_takeoff; /跑道中是否为起飞飞机bool busy; /跑道是否忙碌;class Airportprivate:Timer t; /计时器Busy b; /跑道是否忙碌int takeoffTime; /飞机起飞所需时间int lan

31、dingTime; /飞机着陆所需时间int startworkTime; /机场当天开始运营时间int endworkTime; /机场当天结束运营时间Workslot highslot; /高峰时间段Workslot lowslot; /空闲时间段Workslot otherslot; /一般时间段Queue takeoffq; /等待起飞飞机队列Queue landingq; /等待着陆飞机队列int workTime; /跑道忙碌时间int TwaitTime; /总起飞等待时间int LwaitTime; /总着陆等待时间int takeoffwaitTime; /所有起飞飞机总等待

32、时间int landingwaitTime; /所有着陆飞机总等待时间int maxlandingwaitTime; /最大着陆等待时间int intakeoffNum; /进入起飞队列飞机数int inlandingNum; /进入着陆队列飞机数int takeoffNum; /已经起飞飞机数int landingNum; /已经着陆飞机数int t_rate;int l_rate;public:void setTimer() /设定计时器函数t.now=startworkTime;void setTakeoffTime(int t1) /设定起飞所需时间函数takeoffTime=t1;v

33、oid setLandingTime(int t2) /设定着陆所需时间函数landingTime=t2;void setMaxlandingwaitTime(int mlwd) /设定着陆飞机最大等待时间maxlandingwaitTime = mlwd;void setStartworkTime(string s) /设定机场开始工作时间函数int min=0;int n=s.find_first_of(:);if(n=1) min=(s0-0)*60;else if(n=2) min=(s0-0)*10+(s1-0)*60;elsecoutInput StartWorkTime erro

34、r!endl;return;min+=(sn+1-0)*10+(sn+2-0);startworkTime=min;void setEndworkTime(string s) /设定机场结束工作时间函数int min=0;int n=s.find_first_of(:);if(n=1) min=(s0-0)*60;else if(n=2) min=(s0-0)*10+(s1-0)*60;else coutInput EndWorkTime error!endl;return;min+=(sn+1-0)*10+(sn+2-0);endworkTime=min;void setHighslot(W

35、orkslot h) /设定高峰期机场属性highslot=h;void setLowslot(Workslot l) /设定空闲期机场属性lowslot=l;void setOtherslot(Workslot o) /设定一般时段机场属性otherslot=o;void run()/报表数据初始化workTime=0;/跑道忙碌时间takeoffwaitTime=0;landingwaitTime=0;TwaitTime=0;/起飞等待时间LwaitTime=0;/着陆等待时间takeoffNum=0;/已起飞飞机数量landingNum=0;/已着陆飞机数量intakeoffNum=0;

36、/进入起飞队列飞机数量inlandingNum=0;/进入着陆队列飞机数量b.busy=0;srand(int)time(0);/随机数初始化while(t.now = endworkTime) /飞机场模拟开始if(highslot.startTime t.now) /设置高峰期起飞、着陆率t_rate=highslot.takeoffRate;l_rate=highslot.landingRate;else if(lowslot.startTime t.now)t_rate=lowslot.takeoffRate;l_rate=lowslot.landingRate;elset_rate=

37、otherslot.takeoffRate;l_rate=otherslot.landingRate;if(rand()%100+1)*60.0/100 t_rate )Plane tp(t.now,-1,takeoffTime);takeoffq.push_back(tp);intakeoffNum+;chtime(t.now);cout setw(3)intakeoffNum号起飞飞机进入起飞队列endl;bool landing1=(!landingq.empty() & (landingq.size()*landingTime-t.now+landingq.front().startworkTime) maxlandingwaitTime) | landingq.empty();bool landing2=(landingq.size()+1)*landingTime-t.now+(landingq.empty()? t.

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号