(C++)  1.1.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
EAOptimizer.hh
1 #ifndef GRAIL_EA_OPTIMIZER_H
2 #define GRAIL_EA_OPTIMIZER_H
3 
4 #include "Arena.hh"
5 #include "Selection.hh"
6 #include "Crossover.hh"
7 #include "Mutation.hh"
8 #include "EvoScript.hh"
9 
10 #include <memory>
11 #include <vector>
12 #include <random>
13 #include <functional>
14 
15 namespace grail
16 {
17  namespace evolution
18  {
19  struct Mutation;
20  struct Crossover;
21  class Arena;
22  class Selection;
23  class EvoScript;
24 
30  enum class ElitismType
31  {
32  NONE,
33  FITNESS_RANKING,
34  ROULETTE
35  };
36 
37  class EAOptimizer final
38  {
39  public:
48  EAOptimizer(std::vector<std::unique_ptr<EvoScript>>& initialPopulation,
49  std::unique_ptr<Arena> arenaEvaluation,
50  std::unique_ptr<Crossover> crossover = std::make_unique<Crossover>(),
51  std::unique_ptr<Mutation> mutation = std::make_unique<Mutation>(),
52  std::unique_ptr<Selection> selection = std::make_unique<Selection>(),
53  std::mt19937_64::result_type seed = std::random_device{}());
54 
55  size_t PopulationSize() const;
56 
58  void Run(int maxEpochCount = 1);
59 
60  void SetElitism(double rate, ElitismType type);
61 
63  float CalculatePopulationDiversity() const;
64 
66  size_t CalculatePopulationIdenticalFront() const;
67 
68  EvoScript& GetBestIndividual() const;
69 
70  void SetOnEpochEndedCallback(std::function<void(EAOptimizer& eaOptimizer)> function);
71 
72  Crossover& GetCrossover() const;
73  Mutation& GetMutation() const;
74 
75  friend std::ostream& operator<<(std::ostream &out, const EAOptimizer& eaOptimizer);
76 
77  private:
78  void AddPopulation(std::vector<std::unique_ptr<EvoScript>>& destination, std::vector<std::unique_ptr<EvoScript>>& source) const;
79  void EvaluatePopulation(std::vector<std::unique_ptr<EvoScript>>& onceEvaluatedPopulation, std::vector<std::unique_ptr<EvoScript>>& neverEvaluatedPopulation);
80  void SelectPopulation();
81  void CrossoverPopulation();
82  void MutatePopulation();
83  void Epoch();
84 
85  float CalculateAverageDiversity(const std::vector<std::unique_ptr<EvoScript>>& population) const;
86  size_t CalculateIdenticalFront(const std::vector<std::unique_ptr<EvoScript>>& population) const;
87 
88  private:
89  std::vector<std::unique_ptr<EvoScript>> corePopulation{};
90  std::vector<std::unique_ptr<EvoScript>> emptyPopulation{};
91 
92  std::function<void(EAOptimizer& eaOptimizer)> onEpochFunction = nullptr;
93 
94  int epochNumber = 0;
95  size_t populationCount = 0;
96 
97  double elitismRate = 0.2;
98  ElitismType elitismType = ElitismType::ROULETTE;
99 
100  std::unique_ptr<Arena> arenaEvaluation = nullptr;
101  std::unique_ptr<Crossover> crossover = nullptr;
102  std::unique_ptr<Mutation> mutation = nullptr;
103  std::unique_ptr<Selection> selection = nullptr;
104 
105  std::mt19937_64 randGen;
106  };
107  }
108 }
109 #endif // GRAIL_EA_OPTIMIZER_H
110 
Definition: EAOptimizer.hh:38
EAOptimizer(std::vector< std::unique_ptr< EvoScript >> &initialPopulation, std::unique_ptr< Arena > arenaEvaluation, std::unique_ptr< Crossover > crossover=std::make_unique< Crossover >(), std::unique_ptr< Mutation > mutation=std::make_unique< Mutation >(), std::unique_ptr< Selection > selection=std::make_unique< Selection >(), std::mt19937_64::result_type seed=std::random_device{}())
The EA algorithm will maintain the size of the initial population after the selection phase.
Definition: EAOptimizer.cpp:14
float CalculatePopulationDiversity() const
Definition: EAOptimizer.cpp:43
size_t CalculatePopulationIdenticalFront() const
Definition: EAOptimizer.cpp:48
void Run(int maxEpochCount=1)
Definition: EAOptimizer.cpp:26
Definition: EvoScript.hh:13
Definition: Crossover.hh:24
Definition: Mutation.hh:23