Improve comments and documentation.
[genetic.git] / src / fitness / wsti.h
1 #ifndef __FITNESS_WSTI_H
2 #define __FITNESS_WSTI_H
3
4 #include <cmath>
5
6 #include "../gene.h"
7
8 #include "fitness.h"
9
10 using namespace std;
11
12 namespace genetic {
13     /**
14      * Just an example Fitness function based on WSTI version.
15      */
16     template <typename _Chromosome, typename _Value = double>
17     class WSTI : public Fitness<_Chromosome, _Value> {
18     protected:
19         /**
20          * Value of the begining of the Fitness function domain
21          */
22         float span_start;
23
24         /**
25          * Value of the end of the Fitness function domain
26          */
27         float span_end;
28
29         /**
30          * Calculates fenotype of the current Chromosome
31          */
32         _Value fenotype() {
33             int _fenotype = 0;
34             int ratio = 1;
35             for (unsigned int i = 0; i < this->chromosome.get().size(); i++) {
36                 _fenotype = _fenotype + this->chromosome.get()[i].get() * ratio;
37                 ratio = ratio * 2;
38             }
39 //             cout << "Fenotyp: " << _fenotype << "\n";
40             return _fenotype;
41         }
42
43         /**
44          * Calculates fenotype of the current Chromosome
45          */
46         _Value calculateFenotype() {
47             const unsigned int power2N = 1 << this->chromosome.get().size();
48             return span_start + (span_end - span_start) * this->fenotype() / power2N;
49         }
50
51         /**
52          * Calculates fitness value of the current Chromosome
53          */
54         _Value do_calculate() {
55             _Value fenotype = this->calculateFenotype();
56             return (exp(fenotype) * sin(3.1415 * fenotype) + 1) / fenotype;
57         }
58     public:
59         /**
60          * Class constructor. Initializes class with requied values.
61          *
62          * @param start begining of the Fitness function domain
63          * @param end end of the Fitness function domain
64          */
65         WSTI(float start, float end)
66             : span_start(start), span_end(end) {
67         }
68
69         /**
70          * Class constructor. Initializes class with requied values.
71          *
72          * @param _chromosome Chromosome, for which value will be calculated
73          * @param start begining of the Fitness function domain
74          * @param end end of the Fitness function domain
75          */
76         WSTI(_Chromosome& _chromosome, float start, float end)
77             : Fitness<_Chromosome>(_chromosome), span_start(start), span_end(end) {
78         }
79     };
80 }
81
82 #endif /* __FITNESS_WSTI_H */