Grail (C++)  1.3.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
Crossover.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_CROSSOVER_H
4 #define GRAIL_CROSSOVER_H
5 
6 #include <memory>
7 #include <random>
8 #include <vector>
9 
10 namespace grail
11 {
12 namespace evolution
13 {
14  class EvoScript;
15 
19  enum class CrossoverSelectionType
20  {
24  RANDOM,
28  ROULETTE,
32  TOP,
36  PSEUDO_ROULETTE,
40  CONSECUTIVE_PAIRS
41  };
42 
46  struct Crossover
47  {
48  public:
57  Crossover(double crossoverIndividualRate = 0.45,
58  CrossoverSelectionType selectionType = CrossoverSelectionType::PSEUDO_ROULETTE,
59  double pseudoRouletteRandomPortion = 0.3,
60  double crossoverPhaseRate = 1.0,
61  std::mt19937_64::result_type seed = std::random_device{}());
62 
63  virtual ~Crossover();
64 
69  void Perform(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
70 
74  std::vector<std::unique_ptr<EvoScript>> populationAfter{};
75 
78 
80  CrossoverSelectionType selectionType = CrossoverSelectionType::RANDOM;
81 
84 
86  double crossoverPhaseRate = 0.0;
87 
88  protected:
89  virtual void CrossoverFunctionOnePoint(EvoScript& individual1, EvoScript& individual2);
90  virtual void CrossoverFunctionMultiPoint(EvoScript& individual1, EvoScript& individual2, size_t length);
91  virtual void CrossoverIndividuals(EvoScript& individual1, EvoScript& individual2);
92 
93  protected:
94  std::mt19937_64 randGen;
95 
96  private:
97  void PerformRandomCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
98  void PerformRouletteCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
99  void PerformTopCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
100  void PerformPseudoRouletteCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
101  void PerformConsecutivePairsCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
102  };
103 }
104 }
105 #endif // GRAIL_CROSSOVER
grail::evolution::Crossover::populationAfter
std::vector< std::unique_ptr< EvoScript > > populationAfter
Population after the crossover operation is performed.
Definition: Crossover.hh:74
grail::evolution::Crossover::Crossover
Crossover(double crossoverIndividualRate=0.45, CrossoverSelectionType selectionType=CrossoverSelectionType::PSEUDO_ROULETTE, double pseudoRouletteRandomPortion=0.3, double crossoverPhaseRate=1.0, std::mt19937_64::result_type seed=std::random_device{}())
Crossover - Constructor.
Definition: Crossover.cpp:13
grail::evolution::Crossover::pseudoRouletteRandomPortion
double pseudoRouletteRandomPortion
Pseudoroullete selects pseudoRouletteRandomPortion individuals at random and 1-pseudoRouletteRandomPo...
Definition: Crossover.hh:83
grail::evolution::Crossover
The Crossover structure that encapsulates the crossover operation and its configuration in evolutiona...
Definition: Crossover.hh:46
grail::evolution::Crossover::crossoverPhaseRate
double crossoverPhaseRate
Probability of a crossover phase to happen (globally). If a crossover is included in the algorithm,...
Definition: Crossover.hh:86
grail::evolution::EvoScript
EvoScript - a class that holds a collection of EvoParams (through them) is optimizable....
Definition: EvoScript.hh:18
grail::evolution::Crossover::Perform
void Perform(const std::vector< std::unique_ptr< EvoScript >> &inputPopulation)
Perform - the function that performs the crossover phase.
Definition: Crossover.cpp:30
grail::evolution::Crossover::selectionType
CrossoverSelectionType selectionType
The method that chooses parents to be recombined.
Definition: Crossover.hh:80
grail::evolution::Crossover::crossoverIndividualRate
double crossoverIndividualRate
Average rate of crossover. If N is the population.size(), then around (N*crossoverIndividualRate) chi...
Definition: Crossover.hh:77