Description: In this C++ code, Genetic Algorithm is used to schedule flights on different days on an airport which has different number of runways, pilots, routes, etc. Its functionality is described as follows:
     1. Input is read from a file called "Input.txt"
     2. Format of the file is:
                     First line contains P (no. of Planes)
                     P lines then follow, each containing the name of a plane
                     After that, there are 5 lines, each containing:
                              i) No. of Runways
                             ii) Pilots
                            iii) Routes
                            iv) Days
                             v) Runway Slots
     3. The output format is as follows:
                    On
y-axis are printed the Runway numbers R1, R2,....
                    On
x-axis (top) are printed the Runway Slots S1, S2, .....
C++ Code
#include<iostream>
#include<fstream>
#include<string>
#include<random>
#include<chrono>
#include<ctime>
using namespace std;
using namespace std::chrono;
string DAYS[7] = { "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday" };
string *PLANES;
struct Flight {
     string
Aircraft;
     int Pilot;
     int Route;
     int Conflicts;
};
void CHECK_FITNESS(Flight ***&Schedule, int Days, int Runways, int Slots) {
     int i, j, k, a, b, c, Day_Count,
Week_Count, Consecutive_Count, Same_Slot_Count;
     for (i = 0; i < Days; i++) {
           for (j = 0; j < Runways; j++)
{
                for (k = 0; k < Slots; k++) {
                     Schedule[i][j][k].Conflicts
= 0;
                }
           }
     }
     for (i = 0; i < Days; i++) {
           for (j = 0; j < Runways; j++)
{
                for (k = 0; k < Slots; k++) {
                     if (Schedule[i][j][k].Pilot !=
-1) {
                           Week_Count
= 1;
                           for (a = 0; a < Days; a++) {
                                Day_Count
= 0;
                                Same_Slot_Count
= 0;
                                Consecutive_Count
= 0;
                                for (b = 0; b < Runways; b++)
{
                                     for (c = 0; c < Slots; c++) {
                                           if (!(a == i && b == j
&& c == k)) {
                                                if (Schedule[i][j][k].Pilot ==
Schedule[a][b][c].Pilot) {
                                                     Week_Count++;
                                                     if (a == i)
                                                           Day_Count++;
                                                     if (a == i && c == k)
                                                           Same_Slot_Count++;
                                                     if (a == i && b == j
&& abs(c - k) == 1)
                                                           Consecutive_Count++;
                                                }
                                           }
                                     }
                                }
                          }
                           if (Day_Count > 2)
                                Schedule[i][j][k].Conflicts++;
                           if (Week_Count > 3)
                                Schedule[i][j][k].Conflicts++;
                           if (Consecutive_Count > 0)
                                Schedule[i][j][k].Conflicts++;
                           if (Same_Slot_Count > 0)
                                Schedule[i][j][k].Conflicts++;
                     }
                }
           }
     }
}
int CHECK_CONFLICTS(Flight ***Schedule, int Days, int Runways, int Slots) {
     int x = 0;
     for (int i = 0; i < Days; i++) {
           for (int j = 0; j < Runways; j++)
{
                for (int k = 0; k < Slots; k++) {
                     x
+= Schedule[i][j][k].Conflicts;
                }
           }
     }
     return x;
}
void CROSS_OVER(Flight ***&Schedule, int Days, int Runways, int Slots) {
     int a, b, c;
     for (int i = 0; i < Days; i++) {
           for (int j = 0; j < Runways; j++)
{
                for (int k = 0; k < Slots; k++) {
                     if
(Schedule[i][j][k].Conflicts>0) {
                           a
= rand() % Days;
                           b
= rand() % Runways;
                           c
= rand() % Slots;
                           if (Schedule[a][b][c].Pilot !=
-1 && Schedule[a][b][c].Conflicts == 0) {
                                Schedule[i][j][k].Pilot
= Schedule[a][b][c].Pilot;
                                Schedule[a][b][c].Aircraft
= Schedule[i][j][k].Aircraft;
                                swap(Schedule[i][j][k].Route,
Schedule[a][b][c].Route);
                          }
                     }
                }
           }
     }
}
void MUTATION(Flight ***&Schedule, int Days, int Runways, int Slots, int Pilots) {
     int P;
     for (int i = 0; i < Days; i++) {
           for (int j = 0; j < Runways; j++)
{
                for (int k = 0; k < Slots; k++) {
                     if
(Schedule[i][j][k].Conflicts>0) {
                           P
= rand() % Pilots;
                           while (P ==
Schedule[i][j][k].Pilot)
                                P
= rand() % Pilots + 1;
                           Schedule[i][j][k].Pilot
= P;
                     }
                }
           }
     }
}
void PRINT(Flight ***S, int
Days, int Runways, int Slots, ofstream &fout) {
     for (int i = 0; i < Days; i++) {
           fout
<< endl << DAYS[i] << endl << endl << endl;
           for (int s = 1; s <= Slots; s++)
                fout
<< "           S" << s;
           fout
<< endl << endl;
           for (int j = 0; j < Runways; j++)
{
                fout
<< "R" << j + 1;
                for (int k = 0; k < Slots; k++) {
                     if (S[i][j][k].Pilot != -1) {
                           fout
<< "  " << S[i][j][k].Aircraft << ", P" << S[i][j][k].Pilot
<< ", R" << S[i][j][k].Route;
                     }
                     else {
                           fout
<< "              ";
                     }
                }
                fout
<< endl << endl;
           }
           fout
<< endl << endl;
     }
}
int main() {
     Flight
***Schedule;
     int Planes, Days, Routes, Slots,
Pilots, Runways, R, S, z, Route, count, i, j, k, a, b, c, Day_Count,
Week_Count;
     ifstream
fin("Input.txt");
     fin
>> Planes;
     PLANES
= new string[Planes];
     for (int i = 0; i < Planes; i++)
           fin
>> PLANES[i];
     fin
>> Runways;
     fin
>> Pilots;
     fin
>> Routes;
     fin
>> Days;
     fin
>> Slots;
     Schedule
= new Flight**[Days];
     for (i = 0; i < Days; i++) {
           Schedule[i]
= new Flight*[Runways];
           for (j = 0; j < Runways; j++)
                Schedule[i][j]
= new Flight[Slots];
     }
     for (i = 0; i < Days; i++) {
           for (j = 0; j < Runways; j++)
{
                for (k = 0; k < Slots; k++) {
                     Schedule[i][j][k].Aircraft
= "X";
                     Schedule[i][j][k].Pilot
= -1;
                     Schedule[i][j][k].Route
= -1;
                     Schedule[i][j][k].Conflicts
= 0;
                }
           }
     }
     z
= (Routes / Days) + (Routes%Days);
     Route
= 1;
     for (i = 0; i < Days; i++) {
           for (j = 0; j < z;) {
                mt19937
gen(duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count());
                uniform_int_distribution<>
RD(0, Runways - 1);
                R
= RD(gen);
                uniform_int_distribution<>
SD(0, Slots - 1);
                S
= SD(gen);
                if (Schedule[i][R][S].Pilot ==
-1) {
                     Schedule[i][R][S].Aircraft
= PLANES[rand() % Planes];
                     Schedule[i][R][S].Pilot
= rand() % Pilots + 1;
                     Schedule[i][R][S].Route
= Route++;
                     Schedule[i][R][S].Conflicts
= 0;
                     j++;
                }
           }
           z
= (Routes / Days);
     }
     ofstream
fout("Genetic
Algorithm Result.txt");
     fout
<< "\t\t\t*****
ACTUAL SCHEDULE *****\n\n\n";
     PRINT(Schedule,
Days, Runways, Slots, fout);
     CHECK_FITNESS(Schedule,
Days, Runways, Slots);
     count
= 1;
     while (CHECK_CONFLICTS(Schedule,
Days, Runways, Slots) != 0) {
           CROSS_OVER(Schedule,
Days, Runways, Slots);
           if (++count >= 3) {
                count
= 0;
                MUTATION(Schedule,
Days, Runways, Slots, Pilots);
           }
           CHECK_FITNESS(Schedule,
Days, Runways, Slots);
     }
     fout
<< "\n\n\n\n\n\n\t\t*****
SCHEDULE SOLVED BY GENETIC ALGORITHM *****\n\n\n";
     PRINT(Schedule,
Days, Runways, Slots, fout);
     system("pause");
     return 0;
}
 22:38
22:38


No comments
Post a Comment