-
Notifications
You must be signed in to change notification settings - Fork 0
/
SmithJacob_ProjectFinal.cpp
158 lines (130 loc) · 3.23 KB
/
SmithJacob_ProjectFinal.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
#include <fstream>
#include <assert.h>
#include <random>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <limits>
#include <time.h>
#include <math.h>
#include <list>
#include <algorithm>
using namespace std;
#define JSRand (double)rand()/RAND_MAX
#define num_angles 180
#define time_periods 12
#define pop_size 10
#define iterations 100
class Policy{
public:
int calc_fitness(list<int>);
void generate_population();
void binary_elim();
void mutate(list<int>&);
void run();
void initialize_light();
void print_light();
void print_fitness();
Policy();
private:
list<int> population[pop_size];
int light_intensity [time_periods][num_angles];
};
Policy::Policy(){
initialize_light();
cout << "Light intensity grid" << endl;
print_light();
run();
}
void Policy :: initialize_light(){
for (int i=0; i < time_periods; i++){
int offset = i;
for(int j = 0; j < num_angles; j++){
light_intensity[i][j] = num_angles + offset - j;
}
}
for(int i = 0; i < time_periods; i++){
for(int j = 0; j < num_angles; j++){
if(light_intensity[i][j] > num_angles){
int difference = light_intensity[i][j] - num_angles;
light_intensity[i][j] = num_angles - difference;
}
}
}
}
int Policy :: calc_fitness(list<int> summation){
int fitness = 0;
list<int>::const_iterator iterator = summation.begin();
for(int i=0; i < time_periods; i++){
fitness += light_intensity[i][*iterator];
++iterator;
}
return fitness;
}
// Generates lists of numbers ranging 0-num_angles index into light array
void Policy :: generate_population(){
srand(time(NULL));
for (int i=0; i < pop_size; i++){
list<int> temp;
for (int i=0; i< time_periods; i++){
temp.push_back(rand()%num_angles);
}
population[i] = temp;
}
for(int i = 0; i < pop_size; i++){
list<int> temp = population[i];
list<int>::const_iterator index;
}
}
void Policy::binary_elim(){
random_shuffle(std::begin(population),std::end(population));
for (int i=0; i < pop_size; i = i+2){
double fitness_a = calc_fitness(population[i]);
double fitness_b = calc_fitness(population[i+1]);
if (fitness_a > fitness_b){
population[i+1] = population [i];
mutate(population[i+1]);
}
else {
population[i] = population [i+1];
mutate(population[i]);
}
}
random_shuffle(std::begin(population),std::end(population));
}
void Policy::mutate(list<int>& path){
int path_a = 1 + rand()%time_periods;
int path_b = 1 + rand()%time_periods;
auto first = next(path.begin(), path_a);
auto second = next(path.begin(), path_b);
iter_swap(first, second);
}
void Policy :: print_light(){
for(int i = 0; i < time_periods; i++){
for(int j = 0; j < num_angles; j++){
cout << light_intensity[i][j] << " ";
}
cout << endl;
}
cout << " " << endl;
}
void Policy :: print_fitness(){
cout << "Fitness values ";
for(int i=0; i< pop_size;i++){
cout << calc_fitness(population[i]) << " ";
}
cout<<endl;
}
void Policy :: run(){
generate_population();
for (int i = 0; i < iterations; i++){
print_fitness();
binary_elim();
}
}
int main(){
Policy my_policy;
return 0;
}