Added LinearRankSelection.
[genetic.git] / src / mutation / mutation.h
index 014ca7066ed0e76b30d6fe7ad5c6ee9d7948ef1b..a35b312b60d637359e7e5d028c79be6bdd5a730e 100644 (file)
@@ -9,34 +9,60 @@
 using namespace std;
 
 namespace genetic {
-//     namespace crossover {
+//     namespace mutation {
+        /**
+         * Mutations class. Applies mutation on Chromosome's.
+         */
         template < typename _Chromosome>
         class Mutation {
         public:
+            /**
+             * Type of probability of mutation chance
+             */
             typedef double MutationChanceType;
+
+            /**
+             * Type representing Chromosome Gene
+             */
+            typedef typename _Chromosome::GeneType GeneType;
         protected:
+            /**
+             * Chance with which mutation can occur. (0 = 0%, 1 = 100%)
+             */
             MutationChanceType chance;
 
         public:
+            /**
+             * Class constructor. Initializes class variables.
+             *
+             * @param chance Chance on which Mutation can occur.
+             */
             Mutation(MutationChanceType chance) :
                 chance(chance) {
             }
 
+            /**
+             * Applies with defined probability mutation on the given generation
+             * of Chromosome's.
+             *
+             * @param _generation Generation for which the mutation should be applied
+             * @return new Generation of Chromosome's that passed the mutation
+             */
             Generation<_Chromosome> mutate(Generation<_Chromosome> _generation) {
-                const unsigned int generationSize = _generation.get().size();
-                const unsigned int chromosomeSize = _generation.get()[0].get().size();
+                const unsigned int generationSize = _generation.size();
+                const unsigned int chromosomeSize = _generation[0].size();
                 vector<_Chromosome> newGeneration;
 
                 for (unsigned int i = 0; i < generationSize; i++) {
                     MutationChanceType random = (rand() % 10000) / 10000.0;
-//                     cout << " Mutation chance: " << chance << ", random: " << random << "\n";
-                    newGeneration.push_back(_generation.get()[i]);
 
+                    _Chromosome chromosome = _generation[i];
                     if (random < this->chance) {
-//                         cout << " > Mutated!\n";
-                        unsigned int which = (rand() % chromosomeSize);
-                        newGeneration[i].get()[which] = !newGeneration[i].get()[which].get();
+                        unsigned int mutatedGene = (rand() % chromosomeSize);
+
+                        chromosome[mutatedGene] = GeneType(!chromosome[mutatedGene].get());
                     }
+                    newGeneration.push_back(chromosome);
                 }
                 return Generation<_Chromosome>(newGeneration);
             }