Grail (C++)  1.1.1
A multi-platform, modular, universal engine for embedding advanced AI in games.
Crossover.hh
1 #ifndef GRAIL_CROSSOVER_H
2 #define GRAIL_CROSSOVER_H
3 
4 #include <memory>
5 #include <random>
6 #include <vector>
7 
8 namespace grail
9 {
10  namespace evolution
11  {
12  class EvoScript;
13 
14  enum class CrossoverSelectionType
15  {
16  RANDOM,
17  ROULETTE,
18  TOP,
19  PSEUDO_ROULETTE,
20  CONSECUTIVE_PAIRS
21  };
22 
23  struct Crossover
24  {
25  public:
26  Crossover(double crossoverIndividualRate = 0.45,
27  CrossoverSelectionType selectionType = CrossoverSelectionType::PSEUDO_ROULETTE,
28  double pseudoRouletteRandomPortion = 0.3,
29  double crossoverPhaseRate = 1.0,
30  std::mt19937_64::result_type seed = std::random_device{}());
31 
32  virtual ~Crossover();
33  void Perform(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
34 
35  public:
36  std::vector<std::unique_ptr<EvoScript>> populationAfter{};
37 
40 
42  CrossoverSelectionType SelectionType = CrossoverSelectionType::RANDOM;
43 
46 
48  double CrossoverPhaseRate = 0.0;
49 
50  protected:
51  //REVIEW: methods should be PascalCase, right?
52  virtual void crossoverFunctionOnePoint(EvoScript& individual1, EvoScript& individual2);
53  virtual void crossoverFunctionMultiPoint(EvoScript& individual1, EvoScript& individual2, size_t length);
54  virtual void crossoverIndividuals(EvoScript& individual1, EvoScript& individual2);
55 
56  protected:
57  std::mt19937_64 randGen;
58 
59  private:
60  void performRandomCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
61  void performRouletteCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
62  void performTopCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
63  void performPseudoRouletteCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
64  void performConsecutivePairsCrossover(const std::vector<std::unique_ptr<EvoScript>>& inputPopulation);
65  };
66  }
67 }
68 #endif // GRAIL_CROSSOVER
grail::evolution::Crossover::CrossoverIndividualRate
double CrossoverIndividualRate
Definition: Crossover.hh:39
grail::evolution::Crossover
Definition: Crossover.hh:23
grail::evolution::Crossover::CrossoverPhaseRate
double CrossoverPhaseRate
Definition: Crossover.hh:48
grail::evolution::Crossover::SelectionType
CrossoverSelectionType SelectionType
Definition: Crossover.hh:42
grail::evolution::EvoScript
Definition: EvoScript.hh:12
grail::evolution::Crossover::PseudoRouletteRandomPortion
double PseudoRouletteRandomPortion
Definition: Crossover.hh:45