X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=src%2Fmain.cpp;h=5ca1684b259efac96f60b37df9f045c19b444d78;hb=fdbe06445323de1f82bcd6a61279c3ca46a4b826;hp=9388101bd3d90fd26752d108b802a990011a07ed;hpb=12625bb2d19ee89abacc2456bff57dc22aa3a526;p=genetic.git diff --git a/src/main.cpp b/src/main.cpp index 9388101..5ca1684 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,49 +1,57 @@ -#include -#include +#include +#include #include "gene.h" #include "chromosome.h" #include "generation.h" -#include "generator/generation.h" - -#include "selection/roulette.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 _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 _Gene; typedef Chromosome<_Gene> _Chromosome; - const int chromosomeSize = 11; - const int generationSize = 20; - WSTI<_Chromosome> fitness(0.5, 2.5); - - generator::Generation<_Chromosome> generationGenerator(generationSize, chromosomeSize); - Generation<_Chromosome> generation = generationGenerator.breed(); - - cout << "Generation:\n"; - for (unsigned int i = 0; i < generation.get().size(); i++) { - cout << "# "; - for (unsigned int j = 0; j < generation.get()[i].get().size(); j++) { - cout << generation.get()[i].get()[j].get(); - } - cout << "\n"; - } - - Roulette<_Chromosome> roulette(generation, fitness); - Generation<_Chromosome> newGeneration = roulette.draw(); - - cout << "New Generation:\n"; - for (unsigned int i = 0; i < newGeneration.get().size(); i++) { - cout << "# "; - for (unsigned int j = 0; j < newGeneration.get()[i].get().size(); j++) { - cout << newGeneration.get()[i].get()[j].get(); - } - cout << "\n"; - } + 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("--chromosome-size", "Chromosome size", [](int value)->void { chromosomeSize = value; }), + new command::Option("--generation-size", "Generation size", [](int value)->void { generationSize = value; }), + new command::Option("--crossover", "Crossover chance", [](float value)->void { crossoverChance = value; }), + new command::Option("--mutation", "Mutation chance", [](float value)->void { mutationChance = value; }), + new command::Option("--generation-limit", "Limit of generations", [](float value)->void { generationLimit = value; }), + }); + + _Fitness fitness(0.5, 2.5); + _Generator generationGenerator(generationSize, chromosomeSize); + + _Algorithm algorithm(generationGenerator, fitness, crossoverChance, mutationChance); + _Condition condition(generationLimit); + + algorithm.searchForResult(condition); return 0; }