1 #ifndef __CROSSOVER_CROSSOVER_H
2 #define __CROSSOVER_CROSSOVER_H
4 #include "chromosome.h"
5 #include "generation.h"
10 // namespace crossover {
11 template < typename _Chromosome >
14 typedef double CrossoverChanceType;
15 typedef typename _Chromosome::GeneType GeneType;
17 CrossoverChanceType chance;
19 _Chromosome do_cross(_Chromosome first, _Chromosome second, unsigned int splitPlace) {
20 const unsigned int chromosomeSize = first.get().size();
23 // for (unsigned int i = 0; i < chromosomeSize; i++) {
24 // cout << first.get()[i].get();
27 // for (unsigned int i = 0; i < chromosomeSize; i++) {
28 // cout << second.get()[i].get();
30 // cout << "\n--------";
31 // for (unsigned int i = 0; i < chromosomeSize; i++) {
32 // if (i == splitPlace) {
40 vector<GeneType> crossedChromosome;
41 for (unsigned int i = 0; i < chromosomeSize; i++) {
43 crossedChromosome.push_back(first.get()[i].get());
46 crossedChromosome.push_back(second.get()[i].get());
51 // for (unsigned int i = 0; i < chromosomeSize; i++) {
52 // cout << crossedChromosome[i].get();
56 return _Chromosome(crossedChromosome);
60 Crossover(CrossoverChanceType chance) :
64 Generation<_Chromosome> cross(Generation<_Chromosome> _generation) {
65 const unsigned int generationSize = _generation.get().size();
66 vector<_Chromosome> newGeneration;
68 for (unsigned int i = 0; i < generationSize; i++) {
69 CrossoverChanceType random = (rand() + 1 % 10000) / 10000.0;
70 _Chromosome chromosome = _generation.get()[i];
71 if (random < this->chance) {
72 const unsigned int chromosomeSize = chromosome.get().size();
73 const unsigned int splitPlace = rand() % chromosomeSize;
74 unsigned int pairedChromosome = 0;
77 * Search for different Chromosome, and crossover them together
80 pairedChromosome = rand() % generationSize;
81 } while(pairedChromosome == i);
83 chromosome = do_cross(chromosome, _generation.get()[pairedChromosome], splitPlace);
85 newGeneration.push_back(chromosome);
88 return Generation<_Chromosome>(newGeneration);
94 #endif /* __CROSSOVER_CROSSOVER_H */