1 #ifndef GRAIL_EA_OPTIMIZER_H
2 #define GRAIL_EA_OPTIMIZER_H
5 #include "Selection.hh"
6 #include "Crossover.hh"
8 #include "EvoScript.hh"
30 enum class ElitismType
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{}());
55 size_t PopulationSize()
const;
58 void Run(
int maxEpochCount = 1);
60 void SetElitism(
double rate, ElitismType type);
70 void SetOnEpochEndedCallback(std::function<
void(
EAOptimizer& eaOptimizer)>
function);
75 friend std::ostream& operator<<(std::ostream &out,
const EAOptimizer& eaOptimizer);
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();
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;
89 std::vector<std::unique_ptr<EvoScript>> corePopulation{};
90 std::vector<std::unique_ptr<EvoScript>> emptyPopulation{};
92 std::function<void(
EAOptimizer& eaOptimizer)> onEpochFunction =
nullptr;
95 size_t populationCount = 0;
97 double elitismRate = 0.2;
98 ElitismType elitismType = ElitismType::ROULETTE;
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;
105 std::mt19937_64 randGen;
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