-
Notifications
You must be signed in to change notification settings - Fork 0
/
OneRunwayAirportSimulator.cpp
108 lines (91 loc) · 4.22 KB
/
OneRunwayAirportSimulator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "queueAsArray.h"
#include "class.h" // includes the Plane class.
using namespace std;
int main() {
srand(static_cast<unsigned>(time(0))); // Seed the random number generator
// User inputs.
unsigned int simulationTime;
int landingTime, takeoffTime, maxFuel, avgTimeBetweenLandings, avgTimeBetweenTakeoffs;
cout << "Enter the time required for one plane to land (minutes): ";
cin >> landingTime;
cout << "Enter the time required for one plane to take off (minutes): ";
cin >> takeoffTime;
cout << "Enter the average amount of time between the arrival of planes to the landing queue (minutes): ";
cin >> avgTimeBetweenLandings;
cout << "Enter the average amount of time between the arrival of planes to the takeoff queue (minutes): ";
cin >> avgTimeBetweenTakeoffs;
cout << "Enter the maximum time a plane can stay in the landing queue without running out of fuel (minutes): ";
cin >> maxFuel;
cout << "Enter the total time to simulate (minutes): ";
cin >> simulationTime;
// manually specified probability. Variability for takeoffs and landings set to 50%. This is to account for unexpected delays.
double landingVariability = avgTimeBetweenLandings * 0.5;
double takeoffVariability = avgTimeBetweenTakeoffs * 0.5;
queueType<Plane> landingQueue;
queueType<Plane> takeoffQueue;
unsigned int currentTime = 0;
// output variables.
unsigned int planesLanded = 0, planesTookOff = 0, planesCrashed = 0;
unsigned int totalLandingWait = 0, totalTakeoffWait = 0;
unsigned int nextLandingTime = currentTime + avgTimeBetweenLandings;
unsigned int nextTakeoffTime = currentTime + avgTimeBetweenTakeoffs;
while (currentTime < simulationTime) {
// Check for new arrivals
if (currentTime >= nextLandingTime) {
landingQueue.addQueue(Plane(currentTime));
nextLandingTime = currentTime + avgTimeBetweenLandings - landingVariability + (rand() % static_cast<int>(2 * landingVariability)); // sets variability to 50%.
}
if (currentTime >= nextTakeoffTime) {
takeoffQueue.addQueue(Plane(currentTime));
nextTakeoffTime = currentTime + avgTimeBetweenTakeoffs - takeoffVariability + (rand() % static_cast<int>(2 * takeoffVariability)); // sets variability to 50%.
}
// Process landing queue first
if (!landingQueue.isEmptyQueue()) {
Plane plane = landingQueue.front();
if (currentTime - plane.gettimeEntered() >= maxFuel) {
planesCrashed++;
landingQueue.deleteQueue();
}
else if (currentTime - plane.gettimeEntered() >= landingTime) {
planesLanded++;
totalLandingWait += currentTime - plane.gettimeEntered();
landingQueue.deleteQueue();
}
}
// processing takeoff queue if landing queue is empty. Priority Landing > takeoff.
else if (!takeoffQueue.isEmptyQueue()) {
Plane plane = takeoffQueue.front();
if (currentTime - plane.gettimeEntered() >= takeoffTime) {
planesTookOff++;
totalTakeoffWait += currentTime - plane.gettimeEntered();
takeoffQueue.deleteQueue();
}
}
currentTime++; // Increment the simulation clock
}
// Output simulation results
cout << "Total planes landed: " << planesLanded << endl;
cout << "Total planes took off: " << planesTookOff << endl;
cout << "Total planes crashed: " << planesCrashed << endl;
// Average Landing Wait.
double averageLandingWait;
if (planesLanded) {
averageLandingWait = static_cast<double>(totalLandingWait) / planesLanded;
}
else {
averageLandingWait = 0;
}
cout << "Average waiting time for landing: " << averageLandingWait << " minutes" << endl;
// Average Takeoff Wait.
double averageTakeoffWait;
if (planesTookOff) {
averageTakeoffWait = static_cast<double>(totalTakeoffWait) / planesTookOff;
}
else {
averageTakeoffWait = 0;
}
cout << "Average waiting time for takeoff: " << averageTakeoffWait << " minutes" << endl;
}