-
Notifications
You must be signed in to change notification settings - Fork 0
/
ChromosomeBase.h
120 lines (90 loc) · 3 KB
/
ChromosomeBase.h
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
#ifndef MYGA_CHROMOSOMEBASE_H
#define MYGA_CHROMOSOMEBASE_H
#include <ostream>
#include <vector>
using std::vector;
template<typename Gene>
class ChromosomeBase{
public:
vector<Gene> Genetic_Material;
static const int CHROMOSOME_LENGTH = 3;
ChromosomeBase(Gene min, Gene max);
inline void set_fitness(const double& c) { solution_fitness = c;}
inline double get_fitness() const {return solution_fitness;}
void set_accumulated_fitness(double accumulatedFitness);
double get_accumulated_fitness() const;
//Operator overloading for sorting purpose
bool operator<(const ChromosomeBase &rhs) const;
bool operator>(const ChromosomeBase &rhs) const;
bool operator<=(const ChromosomeBase &rhs) const;
bool operator>=(const ChromosomeBase &rhs) const;
double get_norm_fitness() const;
void set_norm_fitness(double normalizedSolutionFitness);
protected:
//Gene genes[CHROMOSOME_LENGTH];
Gene min;
Gene max;
private:
double solution_fitness;
double normalized_solution_fitness;
double accumulated_fitness;
virtual void init_rand() = 0;
virtual void mutation(int point) = 0;
template<typename G>
friend std::ostream &operator<<(std::ostream &os, const ChromosomeBase<G> &base);
virtual std::ostream& print(std::ostream&) const;
friend class GeneticAlgorithm;
};
template<typename Gene>
std::ostream& ChromosomeBase<Gene>::print(std::ostream& os) const{
os<<"[";
for(int i = 0; i<(CHROMOSOME_LENGTH); i++){
os << Genetic_Material[i] << ", ";
}
os << solution_fitness <<"]";
return os;
}
template<typename Gene>
std::ostream &operator<<(std::ostream &os, const ChromosomeBase<Gene> &base) {
return base.print(os);
}
template<typename Gene>
ChromosomeBase<Gene>::ChromosomeBase(Gene min, Gene max) {
accumulated_fitness = 0;
normalized_solution_fitness = 0;
this->min = min;
this->max = max;
}
template<typename Gene>
bool ChromosomeBase<Gene>::operator<(const ChromosomeBase &rhs) const {
return solution_fitness < rhs.solution_fitness;
}
template<typename Gene>
bool ChromosomeBase<Gene>::operator>(const ChromosomeBase &rhs) const {
return rhs < *this;
}
template<typename Gene>
bool ChromosomeBase<Gene>::operator<=(const ChromosomeBase &rhs) const {
return rhs >= *this;
}
template<typename Gene>
bool ChromosomeBase<Gene>::operator>=(const ChromosomeBase &rhs) const {
return *this >= rhs;
}
template<typename Gene>
double ChromosomeBase<Gene>::get_accumulated_fitness() const {
return accumulated_fitness;
}
template<typename Gene>
void ChromosomeBase<Gene>::set_accumulated_fitness(double accumulatedFitness) {
accumulated_fitness = accumulatedFitness;
}
template<typename Gene>
double ChromosomeBase<Gene>::get_norm_fitness() const {
return normalized_solution_fitness;
}
template<typename Gene>
void ChromosomeBase<Gene>::set_norm_fitness(double normalizedSolutionFitness) {
normalized_solution_fitness = normalizedSolutionFitness;
}
#endif //MYGA_CHROMOSOMEBASE_H