OptimizerEvolutionary.h 1.2 KB

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