#pragma once #include "OptimizerBase.h" #include namespace mdd { class OptimizerEvolutionary : public OptimizerBase { public: struct Individual { public: std::vector> dna; double fitness = 0; bool operator== (const Individual& ind) { return (dna == ind.dna); }; }; protected: static int random_num(double min, double max, double inc = 1.0) { int range = (max - min) / inc + 1; return min + inc * (std::rand() % range); } Individual generateIndividual(); Individual combine(Individual par1, Individual par2); std::vector _children; std::vector _bests; int _min_generations; double _max_fitness; size_t _grow_generation; size_t _converges; double _precision; void evolve(std::vector parents); void evaluate(size_t ignore_len = 0); std::vector mutateGene(std::shared_ptr input, std::vector seed = std::vector()); bool configureChild(const json& config) override; public: OptimizerEvolutionary(); /* std::shared_ptr module, size_t converges = 0, size_t grow_generation = 20, double max_fitness = 0.0, int min_generations = -1 */ double update() override; std::vector getBests(); double evaluateFitness(const Individual& ind); }; }