机场航空管制模拟实验报告汇总文档格式.docx
《机场航空管制模拟实验报告汇总文档格式.docx》由会员分享,可在线阅读,更多相关《机场航空管制模拟实验报告汇总文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
intstartworkTime;
机场当天开始运营时间
intendworkTime;
机场当天结束运营时间
ClassWorkslothighslot;
高峰时间段
ClassWorkslotlowslot;
空闲时间段
ClassWorkslototherslot;
一般时间段
deque<
Plane>
takeoffq;
等待起飞飞机队列
landingq;
等待着陆飞机队列
intworkTime;
跑道忙碌时间
intTwaitTime;
总起飞等待时间
intLwaitTime;
总着陆等待时间
inttakeoffwaitTime;
所有起飞飞机总等待时间
intlandingwaitTime;
所有着陆飞机总等待时间
intmaxlandingwaitTime;
最大着陆等待时间
intintakeoffNum;
进入起飞队列飞机数
intinlandingNum;
进入着陆队列飞机数
inttakeoffNum;
已经起飞飞机数
intlandingNum;
已经着陆飞机数
intt_rate;
用来保存起飞速率
intl_rate;
用来保存着陆速率
输出
备注
t.now
当前时间
inttakeoffNum
当前已起飞飞机数量
intlandingNum
当前已着陆飞机数量
intintakeoffNum
当前已入起飞队列飞机数
intinlandingNum
当前已入着陆队列飞机数
takeoffq
起飞队列,元素类型为飞机类型
landingq
着陆队列,元素类型为飞机类型
double(workTime/(endworkTime-startworkTime))
跑道的繁忙程度(用机场总工作时间与跑道忙碌时间之比来衡量)
doublelandingwaitTime
着陆飞机总的等待时间
double(landingwaitTime/landingNum)
着陆飞机平均等待时间
double(LwaitTime/landingNum)
着陆飞机在队列中的平均等待时间
doubletakeoffwaitTime
起飞飞机总的等待时间
double(takeoffwaitTime/takeoffNum)
起飞飞机平均等待时间
double(TwaitTime/takeoffNum)
起飞飞机在队列中的平均等待时间
intIntakeoffNum–takeoffNum
运营结束时,起飞队列中剩余飞机数量
成员
方法名
voidrun()
运行仿真
voidsetTimer()
设定计时器函数
voidsetTakeoffTime(intt1)
设定起飞所需时间函数
voidsetLandingTime(intt2)
设定着陆所需时间函数
voidsetMaxlandingwaitTime(intmlwd)
设定着陆飞机最大等待时间
voidsetStartworkTime(strings)
设定机场开始工作时间函数
voidsetEndworkTime(strings)
设定机场结束工作时间函数
voidsetHighslot(Worksloth)
设定高峰期机场属性
voidsetLowslot(Workslotl)
设定空闲期机场属性
voidsetOtherslot(Worksloto)
设定一般时段机场属性
1.4.2类Plane
成员:
intstartwaitTime
开始等待时间
intstartworkTime
开始起飞/着陆时间
intworkTime
起飞/着陆时间
1.4.3类Timer
intnow
计时器当前时间
voidspend()
计时累加函数
1.4.4类Workslot
intstartTime
该时间段开始时间
intendTime
该时间段结束时间
inttakeoffRate
起飞频率(每小时起飞数)
intlandingRate
着陆频率(每小时着陆数)
1.4.5结构Busy
boolis_takeoff
跑道中是否为起飞飞机
boolbusy
1.5基本函数功能
1.5.1类Simulation
setTimer():
setTakeoffTime(intt1):
setLandingTime(intt2):
setMaxlandingwaitTime(intmlwd):
setStartworkTime(strings):
setEndworkTime(strings):
setHighslot(Worksloth):
setLowslot(Workslotl):
setOtherslot(Worksloto):
run():
模拟飞机场运营。
display():
该函数主要用于计算一些值,并输出在屏幕上。
跑道的繁忙程度=workTime/(endworkTime-startworkTime)
着陆飞机平均等待时间=landingwaitTime/landingNum
着陆飞机在队列中的平均等待时间=LwaitTime/landingNum
起飞飞机总的等待时间=takeoffwaitTime
起飞飞机平均等待时间=takeoffwaitTime/takeoffNum
起飞飞机在队列中的平均等待时间=TwaitTime/takeoffNum
起飞队列中剩余未起飞飞机数量=intakeoffNum-takeoffNum
再使用输出语句输出这些值。
1.5.2类Plane
Plane()
用于初始化飞机的startwaitTime,startworkTime,workTime。
Plane(inta,intb,intc)
同上。
1.5.3类Timer
Timer()
初始化当前时间。
Timer(intn)
计时累加函数。
2.实验验证分析
2.1输入的形式和输入值的范围
类型
范围
输入示例
机场开始工作时间
string
0:
00~24:
00
2:
机场结束工作时间
12:
高峰期开始时间
高峰期结束时间
5:
空闲期开始时间
6:
空闲期结束时间
10:
着陆飞机最长等待时间
Int
0~
20
高峰期飞机起飞率
30
高峰期飞机着陆率
29
空闲期飞机起飞率
0~高峰期飞机起飞率
12
空闲期飞机着陆率
0~高峰期飞机着陆率
13
一般情况飞机起飞率
空闲期飞机起飞率~高峰期飞机起飞率
一般情况飞机着陆率
空闲期飞机着陆率~高峰期飞机着陆率
23
起飞所需时间
1~10
3
着陆所需时间
2
2.2输出的形式
控制台下运行,结果输出形式:
时间:
XX:
XXX号起飞飞机进入起飞队列
XXX号起飞飞机开始起飞;
等待时间:
XXmin
……
本日机场运营情况:
跑道的繁忙程度:
XX
着陆飞机总的等待时间:
XXh
着陆飞机平均等待时间:
XXmin
着陆飞机在着陆队列中的平均等待时间:
起飞飞机总的等待时间:
XXh
起飞飞机平均等待时间:
起飞飞机在起飞队列中的平均等待时间:
起飞队列中剩余未起飞飞机数量:
XX
2.3程序所能达到的功能
程序实现了如下的功能:
◆设置机场的工作时间
◆模拟机场的运营
◆模拟机场的高峰期和空闲期
◆计算出机场当天起飞/着陆的飞机数目
◆计算出等待队列(起飞/着陆)的平均长度
◆计算队列的平均等待时间
◆简单表示跑道的繁忙程度
2.4测试数据
第一组数据
第二组数据
第三组数据
9:
8:
17:
24:
15:
11:
3:
15
42
36
40
33
35
10
9
22
17
跑道的繁忙程度
0.755556
0.75
0.750694
12.3333h
15.8167h
66.0333h
17min
8min
11min
3min
5.68333h
18.4333h
139.25h
85min
44min
321min
21min
55min
起飞队列中剩余未起飞飞机数量
61架
148架
531架
3.调试分析
3.1遇到的问题及解决方法
3.1.1问题一
问题:
在模拟结果中只有起飞飞机或着陆飞机。
解决方案:
算法出现问题,重新写主程序。
3.1.1问题二
机场的忙碌情况大于1。
检查后发现,跑道功能工作时间的实现有问题,将代码进行改进。
3.1.1问题三
产生随机数太过规则。
发现是产生随机数的函数位置有问题,进行调整。
3.2技术难点分析
3.2.1难点一
一架飞机完成起飞/着陆花费一般超过一分钟,那么随着时间的累积,该如何来判断对当前飞机的服务结束了呢。
解决办法是给Plane类添加开始工作时间的参数,这样是要判断当前时间与开始工作时间的差值是否已到达起飞/着陆所耗时,即可判断起飞/着陆是否完成。
3.2.2难点二
单单用boolbusy数据记录跑道是否忙碌会出现:
当跑道忙碌时,不能判断跑道上运行的是起飞飞机还是着陆飞机这种情况。
因此,我构造了Busy结构,里面不仅包括对跑道是否忙碌的的记录(boolbusy)还包括对跑道上运行的是否为起飞飞机的记录(is_takeoff)。
这样就可以判断跑道上忙碌时运行的是哪种飞机了。
3.2.3难点三
由于未采用优先队列,故起飞和着陆队列是分别独立的,那么如何联系这两个队列是一大难点。
由于本题我们采用着陆飞机优先的思想。
故在跑道空闲的时候,先判断着陆队列是否为空,不为空就进行飞机着陆,为空则查看起飞队列是否为空,不为空则进行飞机起飞,为空则该时段不进行起飞。
这样就可以不在优先队列中实现着陆飞机优先的思想。
3.3印象最深刻的错误及修正方法
3.3.1问题1
着陆/起飞飞机的在队列中的平均等待时间与实际不符存在矛盾。
解决方法:
查看原先对是否有等待飞机的判断语句为:
if(takeoffq.size()>
2)
TwaitTime++;
if(landingq.size()>
LwaitTime++;
这时就遗漏了当队列只有一架飞机但由于跑道此时为忙碌,所以该飞机仍处于等待状态这种情况,故敬爱那个代码修改为:
1||(takeoffq.size()==1&
&
takeoffq.front().startworkTime==-1))
1||(landingq.size()==1&
landingq.front().startworkTime==-1))
更改前运行结果:
修正后运行结果:
3.3.2问题2
一开始的程序没有加入deQueue.h文件,而是直接用了#include<
deque>
,后面加入程序后一直没有调试成功。
调试过程:
有报错框可知,因为程序开始设定的时候用了模版类,因此。
队列类里也需要加入模版函数。
在队列类的函数调用过程中修改了需要用到的函数,确保其运行成功。
完善了队列类
3.3.3问题3
要求机场24:
00结束,但是程序只模拟到21:
23分左右,之后再无飞机产生。
而且之后的几小时内只有起飞飞机,无着陆飞机。
多次模拟,均是类似结果。
首先分析该问题产生的可能原因,由于这种结果的太过规律性,怀疑是产生的随机数的问题,因此对产生随机数的语句进行分析,发现是将srand((int)time(0))语句放在for循环内造成的,故将srand((int)time(0))语句放到for循环外面。
4.测试结果
4.1正常运行
4.1.1输入数据正确的情况:
4.1.2输入数据错误的情况:
4.2边界数据测试
输入全部为0
5.后期扩展
1.目前程序只模拟了一个跑道的情况,后期可以使用优先队列管理跑道,实现多跑道的飞机场运营模拟。
2.由于实验要求先处理完着陆队列再处理起飞队列,可能会导致模拟出来的情况与实际不符,期中可能要考虑更多因素,目前的实现上来说还有待提高。
6.源代码
6.1类设计
deQueue.h
#ifndefDEQUEUE
#defineDEQUEUE
#include<
iostream>
usingnamespacestd;
template<
typenameT>
classnode
{
public:
TnodeValue;
node<
T>
*next;
node():
next(NULL)
{}
node(constT&
item,node<
*nextNode=NULL):
nodeValue(item),next(nextNode)
};
classQueue
Queue();
voidpush_back(constT&
item);
voidpop_front();
T&
front();
constT&
front()const;
intsize()const;
boolempty()const;
private:
node<
*qfront,*qback;
intcount;
Queue<
:
Queue():
qfront(NULL),qback(NULL),count(0)
{}
voidQueue<
push_back(constT&
item)
*newNode=newnode<
(item,NULL);
if(qfront==NULL){
qfront=newNode;
qback=newNode;
}
else{
qback->
next=newNode;
count++;
}
pop_front()
if(empty())//count==0
cout<
<
"
Queuepop_front():
emptyqueue"
endl;
*tmp=qfront;
qfront=qfront->
next;
if(qfront==NULL)
qback=NULL;
deletetmp;
count--;
T&
Queue<
front()
if(empty())
Queuefront():
returnqfront->
nodeValue;
intQueue<
size()const
returncount;
boolQueue<
empty()const
returncount==0;
}
#endif
Timer.h
#ifndefTIMER
#defineTIMER
classTimer{
public:
intnow;
//计时器当前时间
Timer(){}
Timer(intn){
now=n;
voidspend(){//计时累加函数
now++;
Plane.h
#ifndefPLANE
#definePLANE
classPlane{
intstartwaitTime;
//开始等待时间
intstartworkTime;
//开始起飞/着陆时间
intworkTime;
//起飞/着陆时间
Plane(){}
Plane(inta,intb,intc){
startwaitTime=a;
startworkTime=b;
workTime=c;
Workslot.h
#include<
string>
#ifndefWORKSLOT
#defineWORKSLOT
classWorkslot{
intstartTime;
//该时间段开始时间
intendTime;
//该时间段结束时间
inttakeoffRate;
//起飞频率(每小时起飞数)
intlandingRate;
//着陆频率(每小时着陆数)
Workslot(){}
Workslot(stringsT,stringeT,inttR,intlR):
takeoffRate(tR),landingRate(lR){
intsmin=0;
intn1=sT.find_first_of('
'
);
if(n1==1)smin=(sT[0]-'
0'
)*60;
elseif(n1==2)smin=((sT[0]-'
)*10+(sT[1]-'
))*60;
elsecout<
InputStartTimeerror!
smin+=(sT[