1 #ifndef GRAIL_EA_OPTIMIZER_H
2 #define GRAIL_EA_OPTIMIZER_H
5 #include "Crossover.hh"
6 #include "EvoScript.hh"
8 #include "Selection.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,
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();
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;
91 std::vector<std::unique_ptr<EvoScript>> corePopulation{};
92 std::vector<std::unique_ptr<EvoScript>> emptyPopulation{};
94 std::function<void(
EAOptimizer& eaOptimizer)> onEpochFunction =
nullptr;
97 size_t populationCount = 0;
99 double elitismRate = 0.2;
100 ElitismType elitismType = ElitismType::ROULETTE;
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;
107 std::mt19937_64 randGen;
111 #endif // GRAIL_EA_OPTIMIZER_H