Apply small optimizations.
authorRafał Długołęcki <rafal@dlugolecki.net.pl>
Sun, 5 Apr 2015 16:44:21 +0000 (18:44 +0200)
committerRafał Długołęcki <rafal@dlugolecki.net.pl>
Sun, 5 Apr 2015 16:44:21 +0000 (18:44 +0200)
src/algorithm.h
src/fitness/wsti.h
src/gene.h
src/main.cpp
src/selection/roulette.h

index 67b7160ef0580b0407d99f0883ecca5c22a1ae87..bc928506b08846567ad6ab81dba4dc454e909269 100644 (file)
@@ -119,9 +119,12 @@ namespace genetic {
          * \attention Method is currently not in use.
          */
         void showGeneration() {
-            for (unsigned int i = 0; i < this->generation.size(); i++) {
+            unsigned int generationSize = this->generation.size();
+            unsigned int chromosomeSize = this->generation[0].size();
+
+            for (unsigned int i = 0; i < generationSize; i++) {
                 cout << "# " << i << ") ";
-                for (unsigned int j = 0; j < this->generation[i].size(); j++) {
+                for (unsigned int j = 0; j < chromosomeSize; j++) {
                     cout << this->generation[i][j].get();
                 }
                 cout << "\n";
@@ -133,12 +136,14 @@ namespace genetic {
          */
         void showAvgFitness() {
             double avg = 0;
-            for (unsigned int i = 0; i < this->generation.size(); i++) {
+            unsigned int generationSize = this->generation.size();
+
+            for (unsigned int i = 0; i < generationSize; i++) {
                 _Fitness fit(this->generation[i]);
                 fit.parseArguments(fitness.getArguments());
                 avg += fit.calculate();
             }
-            cout << " " << avg / this->generation.size();
+            cout << " " << avg / generationSize;
         }
 
         /**
@@ -146,7 +151,9 @@ namespace genetic {
          */
         void showBestFitness() {
             double best = -100000;
-            for (unsigned int i = 0; i < this->generation.size(); i++) {
+            unsigned int generationSize = this->generation.size();
+
+            for (unsigned int i = 0; i < generationSize; i++) {
                 _Fitness fit(this->generation[i]);
                 fit.parseArguments(fitness.getArguments());
 
index 1724936e83fb2e4121b5313ca672603480e4ab33..7021f590824665b9f22dcf963704240f7c22bf31 100644 (file)
@@ -34,7 +34,9 @@ namespace genetic {
         _Value fenotype() {
             int _fenotype = 0;
             int ratio = 1;
-            for (unsigned int i = 0; i < this->chromosome.size(); i++) {
+            unsigned int chromosomeSize = this->chromosome.size();
+
+            for (unsigned int i = 0; i < chromosomeSize; i++) {
                 _fenotype = _fenotype + this->chromosome[i].get() * ratio;
                 ratio = ratio * 2;
             }
index f3b3c55fa1846ae6efc45c339724afd8d4421e20..781cd3e29d67978dc2b27e965746a1fe53a6f645 100644 (file)
@@ -15,6 +15,8 @@ namespace genetic {
          * with additional changes complex struct.
          */
         Type value;
+
+        template<typename> friend class Gene;
     public:
         /**
          * Default constructor
@@ -29,7 +31,7 @@ namespace genetic {
         }
 
         /** Copy constructor */
-        Gene(const Gene& gene) : value(gene.get()) {}
+        Gene(const Gene& gene) : value(gene.value) {}
 
         /**
          * Copy operator.
@@ -38,7 +40,7 @@ namespace genetic {
          * @return Gene instance containing copied value
          */
         Gene& operator=(const Gene& gene) {
-            this->value = gene.get();
+            this->value = gene.value;
             return *this;
         }
 
index 80020524ee84aa74cbcfad7a2cbd2dbf7f28f8e9..f2aec1380acfd130482c57cc364305fdb6da4876 100644 (file)
@@ -35,7 +35,7 @@ int main() {
     const int chromosomeSize = 10;
     const int generationSize = 200;
     const double crossoverChance = 0.75;
-    const double mutationChance = 0.1;
+    const double mutationChance = 0.01;
 
     _Fitness fitness(0.5, 2.5);
     _Generator generationGenerator(generationSize, chromosomeSize);
index f1b10c5d393864fd53d52ceb2673e8eb217e4d27..4371df68ee55b8a075d9a13c09cbe6b3ddf19087 100644 (file)
@@ -43,8 +43,9 @@ namespace genetic {
             vector<FitnessValueType> calculateGenerationFitness(
                 Generation<_Chromosome> generation) {
                 vector<FitnessValueType> generationFitness;
+                unsigned int generationSize = generation.size();
 
-                for (unsigned int i = 0; i < generation.size(); i++) {
+                for (unsigned int i = 0; i < generationSize; i++) {
                     generationFitness.push_back(this->checkChromosomeFitness(generation[i]));
                 }
 
@@ -67,6 +68,8 @@ namespace genetic {
                 FitnessValueType max;
                 FitnessValueType offset;
 
+                unsigned int fitnessSize = generationFitness.size();
+
                 /* we use multimap because it stores multiple values with the
                  * same key
                  */
@@ -75,7 +78,7 @@ namespace genetic {
                 min = max = generationFitness[0];
                 offset = 0;
 
-                for (unsigned int i = 0; i < generationFitness.size(); i++) {
+                for (unsigned int i = 0; i < fitnessSize; i++) {
                     if(generationFitness[i] < min) {
                         min = generationFitness[i];
                     }
@@ -87,7 +90,7 @@ namespace genetic {
 
                 offset = (max - min) / (chromosomeSize - 1) - min;
 
-                for (unsigned int i = 0; i < generationFitness.size(); i++) {
+                for (unsigned int i = 0; i < fitnessSize; i++) {
                     normalizedFitness.insert(std::make_pair(generationFitness[i] + offset, this->generation[i]));
                 }