+++ /dev/null
-#ifndef __CROSSOVER_CROSSOVER_H
-#define __CROSSOVER_CROSSOVER_H
-
-#include "chromosome.h"
-#include "generation.h"
-
-using namespace std;
-
-namespace genetic {
-// namespace crossover {
- template < typename _Chromosome >
- class Crossover {
- public:
- /**
- * Type of probability of crossover chance
- */
- typedef double CrossoverChanceType;
-
- /**
- * Type representing Chromosome Gene
- */
- typedef typename _Chromosome::GeneType GeneType;
- protected:
- /**
- * Probability of Crossover (0 = 0%, 1 = 100%)
- */
- CrossoverChanceType chance;
-
- /**
- * Crossover two Chromosome's between themself.
- *
- * @param first first Chromosome to Crossover
- * @param second second Chromosome to Crossover
- * @param splitPlace Gene number on which the Genes should be swapped
- * @return new Chromosome crossed between given two
- */
- _Chromosome do_cross(_Chromosome first, _Chromosome second, unsigned int splitPlace) {
- const unsigned int chromosomeSize = first.size();
-
-// cout << " ";
-// for (unsigned int i = 0; i < chromosomeSize; i++) {
-// cout << first[i].get();
-// }
-// cout << "\n x ";
-// for (unsigned int i = 0; i < chromosomeSize; i++) {
-// cout << second[i].get();
-// }
-// cout << "\n--------";
-// for (unsigned int i = 0; i < chromosomeSize; i++) {
-// if (i == splitPlace) {
-// cout << "^";
-// }
-// else {
-// cout << "-";
-// }
-// }
-
- vector<GeneType> crossedChromosome;
- for (unsigned int i = 0; i < chromosomeSize; i++) {
- if (i < splitPlace) {
- crossedChromosome.push_back(first[i].get());
- }
- else {
- crossedChromosome.push_back(second[i].get());
- }
- }
-
-// cout << "\n ";
-// for (unsigned int i = 0; i < chromosomeSize; i++) {
-// cout << crossedChromosome[i];
-// }
-// cout << "\n";
-
- return _Chromosome(crossedChromosome);
- }
-
- public:
- /**
- * Class constructor. Initializes values.
- *
- * @param chance probability of Crossover (0 = 0%, 1 = 100%)
- */
- Crossover(CrossoverChanceType chance) :
- chance(chance) {
- }
-
- /**
- * Invokes Crossover calculations
- *
- * @param _generation Generation for which the crossover should be applied
- * @return new Generation of Chromosome's after the Crossover
- */
- Generation<_Chromosome> cross(Generation<_Chromosome> _generation) {
- const unsigned int generationSize = _generation.size();
- vector<_Chromosome> newGeneration;
-
- for (unsigned int i = 0; i < generationSize; i++) {
- CrossoverChanceType random = (rand() + 1 % 10000) / 10000.0;
- _Chromosome chromosome = _generation[i];
- if (random < this->chance) {
- const unsigned int chromosomeSize = chromosome.size();
- const unsigned int splitPlace = rand() % chromosomeSize;
- unsigned int pairedChromosome = 0;
-
- /**
- * Search for different Chromosome, and crossover them together
- */
- do {
- pairedChromosome = rand() % generationSize;
- } while(pairedChromosome == i);
-
- chromosome = do_cross(chromosome, _generation[pairedChromosome], splitPlace);
- }
- newGeneration.push_back(chromosome);
- }
-
- return Generation<_Chromosome>(newGeneration);
- }
- };
-// }
-}
-
-#endif /* __CROSSOVER_CROSSOVER_H */