Fix building and installing package.
[genetic.git] / include / crossover / crossover.h
1 #ifndef __CROSSOVER_CROSSOVER_H
2 #define __CROSSOVER_CROSSOVER_H
3
4 #include "chromosome.h"
5 #include "generation.h"
6
7 using namespace std;
8
9 namespace genetic {
10 //     namespace crossover {
11         template < typename _Chromosome >
12         class Crossover {
13         public:
14             /**
15              * Type of probability of crossover chance
16              */
17             typedef double CrossoverChanceType;
18
19             /**
20              * Type representing Chromosome Gene
21              */
22             typedef typename _Chromosome::GeneType GeneType;
23         protected:
24             /**
25              * Probability of Crossover (0 = 0%, 1 = 100%)
26              */
27             CrossoverChanceType chance;
28
29             /**
30              * Crossover two Chromosome's between themself.
31              *
32              * @param first first Chromosome to Crossover
33              * @param second second Chromosome to Crossover
34              * @param splitPlace Gene number on which the Genes should be swapped
35              * @return new Chromosome crossed between given two
36              */
37             _Chromosome do_cross(_Chromosome first, _Chromosome second, unsigned int splitPlace) {
38                 const unsigned int chromosomeSize = first.size();
39
40 //                 cout << "        ";
41 //                 for (unsigned int i = 0; i < chromosomeSize; i++) {
42 //                     cout << first[i].get();
43 //                 }
44 //                 cout << "\n      x ";
45 //                 for (unsigned int i = 0; i < chromosomeSize; i++) {
46 //                     cout << second[i].get();
47 //                 }
48 //                 cout << "\n--------";
49 //                 for (unsigned int i = 0; i < chromosomeSize; i++) {
50 //                     if (i == splitPlace) {
51 //                         cout << "^";
52 //                     }
53 //                     else {
54 //                         cout << "-";
55 //                     }
56 //                 }
57
58                 vector<GeneType> crossedChromosome;
59                 for (unsigned int i = 0; i < chromosomeSize; i++) {
60                     if (i < splitPlace) {
61                         crossedChromosome.push_back(first[i].get());
62                     }
63                     else {
64                         crossedChromosome.push_back(second[i].get());
65                     }
66                 }
67
68 //                 cout << "\n        ";
69 //                 for (unsigned int i = 0; i < chromosomeSize; i++) {
70 //                     cout << crossedChromosome[i];
71 //                 }
72 //                 cout << "\n";
73
74                 return _Chromosome(crossedChromosome);
75             }
76
77         public:
78             /**
79              * Class constructor. Initializes values.
80              *
81              * @param chance probability of Crossover (0 = 0%, 1 = 100%)
82              */
83             Crossover(CrossoverChanceType chance) :
84                 chance(chance) {
85             }
86
87             /**
88              * Invokes Crossover calculations
89              *
90              * @param _generation Generation for which the crossover should be applied
91              * @return new Generation of Chromosome's after the Crossover
92              */
93             Generation<_Chromosome> cross(Generation<_Chromosome> _generation) {
94                 const unsigned int generationSize = _generation.size();
95                 vector<_Chromosome> newGeneration;
96
97                 for (unsigned int i = 0; i < generationSize; i++) {
98                     CrossoverChanceType random = (rand() + 1 % 10000) / 10000.0;
99                     _Chromosome chromosome = _generation[i];
100                     if (random < this->chance) {
101                         const unsigned int chromosomeSize = chromosome.size();
102                         const unsigned int splitPlace = rand() % chromosomeSize;
103                         unsigned int pairedChromosome = 0;
104
105                         /**
106                          * Search for different Chromosome, and crossover them together
107                          */
108                         do {
109                              pairedChromosome = rand() % generationSize;
110                         } while(pairedChromosome == i);
111
112                         chromosome = do_cross(chromosome, _generation[pairedChromosome], splitPlace);
113                     }
114                     newGeneration.push_back(chromosome);
115                 }
116
117                 return Generation<_Chromosome>(newGeneration);
118             }
119         };
120 //     }
121 }
122
123 #endif /* __CROSSOVER_CROSSOVER_H */