Grail (C++)  1.4.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 Individual;
15 
19  enum class CrossoverSelectionType
20  {
22  RANDOM,
23 
25  ROULETTE,
26 
28  TOP,
29 
31  PSEUDO_ROULETTE,
32 
34  CONSECUTIVE_PAIRS
35  };
36 
40  struct Crossover
41  {
42  public:
51  Crossover(double crossoverIndividualRate = 0.45,
52  CrossoverSelectionType selectionType = CrossoverSelectionType::PSEUDO_ROULETTE,
53  double pseudoRouletteRandomPortion = 0.3,
54  double crossoverPhaseRate = 1.0,
55  std::mt19937_64::result_type seed = std::random_device{}());
56 
57  virtual ~Crossover();
58 
63  void Perform(const std::vector<std::unique_ptr<Individual>>& inputPopulation);
64 
68  std::vector<std::unique_ptr<Individual>> populationAfter{};
69 
71  double crossoverIndividualRate = 0.45;
72 
74  CrossoverSelectionType selectionType = CrossoverSelectionType::PSEUDO_ROULETTE;
75 
78 
80  double crossoverPhaseRate = 1.0;
81 
82  protected:
86  virtual void CrossoverFunctionOnePoint(Individual& individual1, Individual& individual2);
87 
91  virtual void CrossoverFunctionMultiPoint(Individual& individual1, Individual& individual2, size_t length);
92 
96  virtual void CrossoverIndividuals(Individual& individual1, Individual& individual2);
97 
98  protected:
99  std::mt19937_64 randGen;
100 
101  private:
102  void PerformRandomCrossover(const std::vector<std::unique_ptr<Individual>>& inputPopulation);
103  void PerformRouletteCrossover(const std::vector<std::unique_ptr<Individual>>& inputPopulation);
104  void PerformTopCrossover(const std::vector<std::unique_ptr<Individual>>& inputPopulation);
105  void PerformPseudoRouletteCrossover(const std::vector<std::unique_ptr<Individual>>& inputPopulation);
106  void PerformConsecutivePairsCrossover(const std::vector<std::unique_ptr<Individual>>& inputPopulation);
107  };
108 }
109 }
110 #endif // GRAIL_CROSSOVER
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::CrossoverFunctionOnePoint
virtual void CrossoverFunctionOnePoint(Individual &individual1, Individual &individual2)
Implementation of the standard one-point crossover operation.
Definition: Crossover.cpp:77
grail::evolution::Crossover::pseudoRouletteRandomPortion
double pseudoRouletteRandomPortion
Used only with pseudo-roulette. This method selects pseudoRouletteRandomPortion*100% of individuals a...
Definition: Crossover.hh:77
grail::evolution::Crossover::Perform
void Perform(const std::vector< std::unique_ptr< Individual >> &inputPopulation)
Perform - the function that performs the crossover phase.
Definition: Crossover.cpp:30
grail::evolution::Crossover
The Crossover structure that encapsulates the crossover operation and its configuration in evolutiona...
Definition: Crossover.hh:40
grail::evolution::Crossover::crossoverPhaseRate
double crossoverPhaseRate
The probability of a crossover phase to happen (globally). If a crossover is included in the algorith...
Definition: Crossover.hh:80
grail::evolution::Crossover::CrossoverFunctionMultiPoint
virtual void CrossoverFunctionMultiPoint(Individual &individual1, Individual &individual2, size_t length)
Implementation of the standard k-point (multi-point) crossover operation.
Definition: Crossover.cpp:83
grail::evolution::Individual
Represents an individual for evolutionary algorithms (EA). It stores the encoding consisting of opti...
Definition: Individual.hh:23
grail::evolution::Crossover::populationAfter
std::vector< std::unique_ptr< Individual > > populationAfter
The population of children, i.e., after the crossover operation has been performed.
Definition: Crossover.hh:68
grail::evolution::Crossover::selectionType
CrossoverSelectionType selectionType
The method that chooses parents to be recombined.
Definition: Crossover.hh:74
grail::evolution::Crossover::CrossoverIndividuals
virtual void CrossoverIndividuals(Individual &individual1, Individual &individual2)
The function that performs a single crossover operation between two individuals.
Definition: Crossover.cpp:90
grail::evolution::Crossover::crossoverIndividualRate
double crossoverIndividualRate
The average rate of crossover. The expected number of children is: populationSize*crossoverIndividual...
Definition: Crossover.hh:71