Made Algorithm functions more generic.
[genetic.git] / src / algorithm.h
index 894f4880019034d0e2004bca4e45cfff4d49ecfd..9b2e3bea75b3bca8717c2ee6c72b22b830975708 100644 (file)
@@ -19,7 +19,7 @@ namespace genetic {
     /**
      * Genetic Algorithm itself
      */
-    template < typename _Chromosome, typename _Selection, typename _Crossover, typename _Mutation >
+    template < typename _Chromosome, typename _Selection, typename _Crossover, typename _Mutation, typename _Fitness = Fitness<_Chromosome, typename _Selection::FitnessValueType > >
     class Algorithm {
     public:
         /**
@@ -38,7 +38,7 @@ namespace genetic {
          * It is a reference, because Fitness is purely virtual class and we
          * can't have instance of it. It must be one of derived classes.
          */
-        Fitness<_Chromosome, FitnessValueType>& fitness;
+        _Fitness& fitness;
 
         /**
          * Crossover function
@@ -79,7 +79,7 @@ namespace genetic {
          */
         Algorithm(
             generator::Generation<_Chromosome>& _generator,
-            Fitness<_Chromosome, FitnessValueType>& _fitness,
+           _Fitness& _fitness,
             double crossoverChance,
             double mutationChance) :
                 generator(_generator),
@@ -130,12 +130,12 @@ namespace genetic {
 
         /**
          * Displays average fitness value of the entire generation.
-         * @todo make it more generic
          */
         void showAvgFitness() {
             double avg = 0;
             for (unsigned int i = 0; i < this->generation.get().size(); i++) {
-                WSTI<_Chromosome, FitnessValueType> fit(this->generation.get()[i], 0.5, 2.5);
+                _Fitness fit(this->generation.get()[i]);
+                fit.parseArguments(fitness.getArguments());
                 avg += fit.calculate();
             }
             cout << " " << avg / this->generation.get().size();
@@ -143,13 +143,13 @@ namespace genetic {
 
         /**
          * Displays best fitness value of the entire generation.
-         * @todo make it more generic, currently has hardcoded WSTI Fitness
-         *      class, due its additional arguments
          */
         void showBestFitness() {
             double best = -100000;
             for (unsigned int i = 0; i < this->generation.get().size(); i++) {
-                WSTI<_Chromosome, FitnessValueType> fit(this->generation.get()[i], 0.5, 2.5);
+                _Fitness fit(this->generation.get()[i]);
+                fit.parseArguments(fitness.getArguments());
+
                 double tmp = fit.calculate();
                 if (tmp > best) {
                     best = tmp;