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 >
15 * Type of probability of crossover chance
17 typedef double CrossoverChanceType;
20 * Type representing Chromosome Gene
22 typedef typename _Chromosome::GeneType GeneType;
25 * Probability of Crossover (0 = 0%, 1 = 100%)
27 CrossoverChanceType chance;
30 * Crossover two Chromosome's between themself.
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
37 _Chromosome do_cross(_Chromosome first, _Chromosome second, unsigned int splitPlace) {
38 const unsigned int chromosomeSize = first.size();
41 // for (unsigned int i = 0; i < chromosomeSize; i++) {
42 // cout << first[i].get();
45 // for (unsigned int i = 0; i < chromosomeSize; i++) {
46 // cout << second[i].get();
48 // cout << "\n--------";
49 // for (unsigned int i = 0; i < chromosomeSize; i++) {
50 // if (i == splitPlace) {
58 vector<GeneType> crossedChromosome;
59 for (unsigned int i = 0; i < chromosomeSize; i++) {
61 crossedChromosome.push_back(first[i].get());
64 crossedChromosome.push_back(second[i].get());
69 // for (unsigned int i = 0; i < chromosomeSize; i++) {
70 // cout << crossedChromosome[i];
74 return _Chromosome(crossedChromosome);
79 * Class constructor. Initializes values.
81 * @param chance probability of Crossover (0 = 0%, 1 = 100%)
83 Crossover(CrossoverChanceType chance) :
88 * Invokes Crossover calculations
90 * @param _generation Generation for which the crossover should be applied
91 * @return new Generation of Chromosome's after the Crossover
93 Generation<_Chromosome> cross(Generation<_Chromosome> _generation) {
94 const unsigned int generationSize = _generation.size();
95 vector<_Chromosome> newGeneration;
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;
106 * Search for different Chromosome, and crossover them together
109 pairedChromosome = rand() % generationSize;
110 } while(pairedChromosome == i);
112 chromosome = do_cross(chromosome, _generation[pairedChromosome], splitPlace);
114 newGeneration.push_back(chromosome);
117 return Generation<_Chromosome>(newGeneration);
123 #endif /* __CROSSOVER_CROSSOVER_H */