OptimizerEvolutionary.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #pragma once
  2. #include "OptimizerBase.h"
  3. #include <iostream>
  4. namespace mdd {
  5. class OptimizerEvolutionary : public OptimizerBase {
  6. public:
  7. struct Individual {
  8. public:
  9. std::vector<std::vector<double>> dna;
  10. double fitness = 0;
  11. bool operator== (const Individual& ind) {
  12. return (dna == ind.dna);
  13. };
  14. };
  15. protected:
  16. static int random_num(double min, double max, double inc = 1.0)
  17. {
  18. int range = (max - min) / inc + 1;
  19. return min + inc * (std::rand() % range);
  20. }
  21. Individual generateIndividual();
  22. Individual combine(Individual par1, Individual par2);
  23. std::vector<Individual> _children;
  24. std::vector<Individual> _bests;
  25. int _min_generations;
  26. double _max_fitness;
  27. size_t _grow_generation;
  28. size_t _converges;
  29. double _precision;
  30. int generation = -1;
  31. void evolve(std::vector<Individual> parents);
  32. void evaluate(size_t ignore_len = 0);
  33. std::vector<double> mutateGene(std::shared_ptr<IInput> input, std::vector<double> seed = std::vector<double>());
  34. bool configureChild(const json& config) override;
  35. public:
  36. OptimizerEvolutionary();
  37. /*
  38. std::shared_ptr<IModule> module,
  39. size_t converges = 0,
  40. size_t grow_generation = 20,
  41. double max_fitness = 0.0,
  42. int min_generations = -1
  43. */
  44. double update() override;
  45. std::vector<Individual> getBests();
  46. double evaluateFitness(const Individual& ind);
  47. };
  48. }