Grail (C++)  1.1.1
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 "Crossover.hh"
6 #include "EvoScript.hh"
7 #include "Mutation.hh"
8 #include "Selection.hh"
9 
10 #include <functional>
11 #include <memory>
12 #include <random>
13 #include <vector>
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,
79  std::vector<std::unique_ptr<EvoScript>>& source) const;
80  void EvaluatePopulation(std::vector<std::unique_ptr<EvoScript>>& onceEvaluatedPopulation,
81  std::vector<std::unique_ptr<EvoScript>>& neverEvaluatedPopulation);
82  void SelectPopulation();
83  void CrossoverPopulation();
84  void MutatePopulation();
85  void Epoch();
86 
87  float CalculateAverageDiversity(const std::vector<std::unique_ptr<EvoScript>>& population) const;
88  size_t CalculateIdenticalFront(const std::vector<std::unique_ptr<EvoScript>>& population) const;
89 
90  private:
91  std::vector<std::unique_ptr<EvoScript>> corePopulation{};
92  std::vector<std::unique_ptr<EvoScript>> emptyPopulation{};
93 
94  std::function<void(EAOptimizer& eaOptimizer)> onEpochFunction = nullptr;
95 
96  int epochNumber = 0;
97  size_t populationCount = 0;
98 
99  double elitismRate = 0.2;
100  ElitismType elitismType = ElitismType::ROULETTE;
101 
102  std::unique_ptr<Arena> arenaEvaluation = nullptr;
103  std::unique_ptr<Crossover> crossover = nullptr;
104  std::unique_ptr<Mutation> mutation = nullptr;
105  std::unique_ptr<Selection> selection = nullptr;
106 
107  std::mt19937_64 randGen;
108  };
109  }
110 }
111 #endif // GRAIL_EA_OPTIMIZER_H
grail::evolution::Crossover
Definition: Crossover.hh:23
grail::evolution::EAOptimizer::EAOptimizer
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
grail::evolution::EvoScript
Definition: EvoScript.hh:12
grail::evolution::EAOptimizer::Run
void Run(int maxEpochCount=1)
Definition: EAOptimizer.cpp:35
grail::evolution::EAOptimizer::CalculatePopulationDiversity
float CalculatePopulationDiversity() const
Definition: EAOptimizer.cpp:54
grail::evolution::Mutation
Definition: Mutation.hh:22
grail::evolution::EAOptimizer::CalculatePopulationIdenticalFront
size_t CalculatePopulationIdenticalFront() const
Definition: EAOptimizer.cpp:59
grail::evolution::EAOptimizer
Definition: EAOptimizer.hh:37