Fix building and installing package.
[genetic.git] / include / selection / selection.h
diff --git a/include/selection/selection.h b/include/selection/selection.h
new file mode 100644 (file)
index 0000000..dd6e846
--- /dev/null
@@ -0,0 +1,82 @@
+#ifndef __SELECTION_SELECTION_H
+#define __SELECTION_SELECTION_H
+
+#include "chromosome.h"
+#include "generation.h"
+#include "../fitness/fitness.h"
+
+using namespace std;
+
+namespace genetic {
+//     namespace selection {
+        /**
+         * Base Selection template class. It should be a base class for any
+         * custom selection functions.
+         */
+        template < typename _Chromosome >
+        class Selection {
+        public:
+            /**
+             * Type representing Fitness function
+             */
+            typedef Fitness<_Chromosome> GeneticFitness;
+
+            /**
+             * Value type returned by the Fitness function
+             */
+            typedef typename GeneticFitness::ValueType FitnessValueType;
+        protected:
+            /**
+             * Generation over which the Selection will be applied
+             */
+            Generation<_Chromosome> generation;
+
+            /**
+             * Fitness which will be used in selection
+             */
+            GeneticFitness& fitness;
+
+            /**
+             * Checks Fitness for the given Chromosome
+             *
+             * @param chromosome Chromosome for which the selection fitness is
+             *      checked.
+             * @return Value of the Fitness function
+             */
+            FitnessValueType checkChromosomeFitness(_Chromosome chromosome) {
+                this->fitness.chromosome = chromosome;
+                return fitness.calculate();
+            }
+
+            /**
+             * Selection calculations should be done here.
+             *
+             * @return new Generation of Chromosome's that passed the Selection
+             */
+            virtual Generation<_Chromosome> do_draw() = 0;
+
+        public:
+            /**
+             * Class constructor. Initializes required variables and constants
+             *
+             * @param _generation Generation over which the Selection will be
+             *      applied
+             * @param _fitness Fitness function to use in Selection
+             */
+            Selection(Generation<_Chromosome> _generation, GeneticFitness& _fitness) :
+                generation(_generation), fitness(_fitness) {
+            }
+
+            /**
+             * Invokes Selection calculations
+             *
+             * @return new Generation of Chromosome's that passed the Selection
+             */
+            Generation<_Chromosome> draw() {
+                return this->do_draw();
+            }
+        };
+//     }
+}
+
+#endif /* __SELECTION_SELECTION_H */