-
Notifications
You must be signed in to change notification settings - Fork 0
/
Schedule.hpp
126 lines (91 loc) · 3.54 KB
/
Schedule.hpp
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#ifndef SCHEDULE
#define SCHEDULE
#include<vector>
#include<unordered_map>
#include"Lecture.hpp"
#include"Room.hpp"
using namespace std;
//describes a whole week's schedule in time-space slots occupied by lectures
class Schedule{
//crossover occurs by randomly swapping some classes between two schedules
friend void crossover(Schedule&, Schedule&, int&);
//swap function used in assignment operator and other
friend void swap(Schedule&, Schedule&);
public:
//fitness divided by the whole population's fitness
double relativeFitness;
//cum probability of being selected in fitness proportionate
double cumulativeProb;
//default constructor
Schedule(
int,
const unordered_map<int, Room*>&,
const unordered_map<string, Course*>&,
const unordered_map<string, Teacher*>&,
const unordered_map<string, StudentSection*>&,
const vector<Lecture*>&
);
//copy constructor
Schedule(const Schedule&);
//assignment operator
Schedule& operator = (Schedule);
//destructor
~Schedule();
//initialize schedule with random slots
void initialize();
//mutation occurs by randomly swapping some classes within a schedule
void mutation();
const vector< vector<Lecture*> >& getSlots() const {return slots;}
const unordered_map<Lecture*, vector<int> >& getClasses() const {return classes;}
// const vector<int>& getConstraints() const {return constraints;}
double getFitness() const {return fitness;}
/*
FOR TESTING PURPOSE ONLY
*/
void printSchedule(bool) const;
private:
//day * time_slot * rooms
vector< vector<Lecture*> > slots;
//Lecture mapped to it's slots
unordered_map< Lecture*, vector<int> > classes;
//GA Parameters
const double mutationRate;
const double crossoverRate;
const int mutationSize;
const int crossoverSize;
//Aggregated objects
const unordered_map<int, Room*>&
rooms;
const unordered_map<string, Course*>&
courses;
const unordered_map<string, Teacher*>&
teachers;
const unordered_map<string, StudentSection*>&
sections;
const vector<Lecture*>&
lectures;
//used to calc fitness [true = that constraint is fulfilled]
mutable vector< vector< vector<bool> > >
lectureConstraints;
mutable vector< vector<bool> >
teacherConstraints;
mutable vector< vector<bool> >
sectionConstraints;
//schedule's score for complying with constraints
double fitness;
//seed value for schedule's random values
int seed;
//calculate score of schedule based on given constraints
void calculateFitness();
//checks each constraint for all classes and put true/false in the vector
void checkConstraints() const;
//adds all the entries in the bool vector, multiplies, and returns a single fitness value
double addConstraintsWeights();
Room* getRoomById(int) const;
// //helper functions to check section & teacher constraints
// int maxConsecutive(const vector< vector<int> >&) const;
// int maxDaily(const vector< vector<int> >&) const;
// int daysOff(const vector< vector<int> >&) const;
// bool oneAtATime(const vector< vector<int> >&) const;
};
#endif