Fix Generation Limit Option.
[genetic.git] / src / main.cpp
index 793df444005be496b7e53703ec092e595c22d8dd..5ca1684b259efac96f60b37df9f045c19b444d78 100644 (file)
@@ -1,31 +1,57 @@
-#include <iostream>
-#include <vector>
+#include <command/command.h>
+#include <command/option.h>
 
 #include "gene.h"
 #include "chromosome.h"
 #include "generation.h"
-#include "generator/generation.h"
+#include "generator/bitGenerator.h"
 
+#include "selection/rouletteSelection.h"
+#include "selection/linearRankSelection.h"
+#include "crossover/crossover.h"
+#include "mutation/mutation.h"
 #include "fitness/wsti.h"
 
-using namespace std;
+#include "algorithm.h"
+#include "condition/condition.h"
+#include "condition/generationLimitCondition.h"
+
 using namespace genetic;
 
-int main() {
-    typedef Gene<int> _Gene;
+int chromosomeSize = 10;
+int generationSize = 10;
+int generationLimit = 100;
+double crossoverChance = 0.75;
+double mutationChance = 0.01;
+
+int main(int argc, char* argv[]) {
+    typedef Gene<bool> _Gene;
     typedef Chromosome<_Gene> _Chromosome;
-    
-    const int chromosomeSize = 11;
-    const int generationSize = 20;
 
-    generator::Generation<_Chromosome> generationGenerator(generationSize, chromosomeSize);
-    Generation<_Chromosome> generation = generationGenerator.breed();
+    typedef WSTI<_Chromosome> _Fitness;
+    typedef LinearRankSelection<_Chromosome> _Selection;
+    typedef Crossover<_Chromosome> _Crossover;
+    typedef Mutation<_Chromosome> _Mutation;
+
+    typedef generator::BitGenerator<_Chromosome> _Generator;
+    typedef Algorithm<_Chromosome, _Selection, _Crossover, _Mutation, _Fitness> _Algorithm;
+    typedef GenerationLimitCondition<_Chromosome> _Condition;
+
+    command::Command command(argc, argv, {
+        new command::Option<int>("--chromosome-size", "Chromosome size", [](int value)->void { chromosomeSize = value; }),
+        new command::Option<int>("--generation-size", "Generation size", [](int value)->void { generationSize = value; }),
+        new command::Option<float>("--crossover", "Crossover chance", [](float value)->void { crossoverChance = value; }),
+        new command::Option<float>("--mutation", "Mutation chance", [](float value)->void { mutationChance = value; }),
+        new command::Option<float>("--generation-limit", "Limit of generations", [](float value)->void { generationLimit = value; }),
+    });
+
+    _Fitness fitness(0.5, 2.5);
+    _Generator generationGenerator(generationSize, chromosomeSize);
 
-    for (unsigned int i = 0; i < generationSize; i++) {
-        WSTI<_Chromosome> fitness(generation.get()[i], 0.5, 2.5);
+    _Algorithm algorithm(generationGenerator, fitness, crossoverChance, mutationChance);
+    _Condition condition(generationLimit);
 
-        cout << "Fitness is equal to: " << fitness.calculate() << "\n";
-    }
+    algorithm.searchForResult(condition);
 
     return 0;
 }