Grail (C++)  1.4.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
Individual.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_INDIVIDUAL_H
4 #define GRAIL_INDIVIDUAL_H
5 
6 #include "EvoParam.hh"
7 #include <memory>
8 #include <vector>
9 #include <iostream>
10 #include <fstream>
11 #include <sstream>
12 
13 namespace grail
14 {
15 namespace evolution
16 {
23  class Individual
24  {
25  friend struct Mutation;
26  friend struct Crossover;
27  friend class EAOptimizer;
28  friend class FitnessRepository;
29 
30  public:
31  virtual ~Individual();
32 
35  virtual std::unique_ptr<Individual> Instantiate() const = 0;
36 
39  void SetFitness(double fitness);
40 
43  double GetFitness() const;
44 
47  std::unique_ptr<Individual> Clone() const;
48 
52  std::vector<std::unique_ptr<Individual>> CloneMany(int cloneCount) const;
53 
58  void Randomize(std::mt19937_64& randomGenerator);
59 
61  long GetPossibleRealizationsCount() const;
62 
67  std::vector<std::unique_ptr<Individual>> GetRandomRealizations(
68  std::mt19937_64& randomGenerator,
69  std::size_t count) const;
70 
73  std::size_t EvoParamsCount() const;
74 
78  float CalculateSimilarity(const Individual& other) const;
79 
81  virtual std::string ToString() const;
82 
86  const BaseEvoParam& GetEvoParamAt(std::size_t index) const;
87 
89  std::size_t GetHashCode() const;
90 
92  bool Equals(const Individual& other) const;
93 
94  protected:
102 
108  template<typename ForwardIterator>
109  void SetMemberParameterOptimizable(ForwardIterator beginIterator, ForwardIterator endIterator)
110  {
111  for (; beginIterator != endIterator; ++beginIterator)
112  {
113  SetMemberParameterOptimizable(*beginIterator);
114  }
115  }
116 
118  std::vector<std::reference_wrapper<BaseEvoParam>> parameters{};
119 
120  private:
121  void CopyEvoParamValuesFrom(const Individual& other);
122 
127  void ExchangeParams(Individual& other, std::size_t inclusiveFrom, std::size_t exclusiveTo);
128 
129  void SerializeState(std::ostream& outputStream) const;
130  void DeserializeState(std::ifstream& inputStream);
131 
132  private:
133  double fitness = -1.0;
134  bool evaluationUpdated = false;
135 
138  std::vector<std::reference_wrapper<BaseEvoParam>>& GetEvoParams();
139  };
140 
142  bool IndividualComparator(const std::unique_ptr<Individual>& first, const std::unique_ptr<Individual>& second);
143 }
144 }
145 #endif // GRAIL_INDIVIDUAL_H
grail::evolution::BaseEvoParam
BaseEvoParam - A class that represents a parameter that is modifiable (optimizable) by evolutionary a...
Definition: EvoParam.hh:20
grail::evolution::Individual::Equals
bool Equals(const Individual &other) const
Tests whether two individuals have the same structure (even if they point to different objects in mem...
Definition: Individual.cpp:101
grail::evolution::Individual::Clone
std::unique_ptr< Individual > Clone() const
Performs a deep copy of the individual.
Definition: Individual.cpp:27
grail::evolution::Individual::CalculateSimilarity
float CalculateSimilarity(const Individual &other) const
CalculateSimilarity - this function calculates the similarity between two Individuals in the form of ...
Definition: Individual.cpp:129
grail::evolution::Crossover
The Crossover structure that encapsulates the crossover operation and its configuration in evolutiona...
Definition: Crossover.hh:40
grail::evolution::Individual::SetMemberParameterOptimizable
void SetMemberParameterOptimizable(ForwardIterator beginIterator, ForwardIterator endIterator)
Call this method in a constructor and pass references to a field stored in this object....
Definition: Individual.hh:109
grail::evolution::Individual::GetEvoParamAt
const BaseEvoParam & GetEvoParamAt(std::size_t index) const
GetEvoParamAt - returns the i-th EvoParam of the collection of parameters stored in this Individual.
Definition: Individual.cpp:91
grail::evolution::Individual::GetRandomRealizations
std::vector< std::unique_ptr< Individual > > GetRandomRealizations(std::mt19937_64 &randomGenerator, std::size_t count) const
Returns "count" number of copies of the individuals with randomized parameter values.
Definition: Individual.cpp:66
grail::evolution::Individual::GetFitness
double GetFitness() const
GetFitness - gets the fitness value (evaluation of how good the particular Individual object is).
Definition: Individual.cpp:22
grail::evolution::Individual::GetHashCode
std::size_t GetHashCode() const
Custom hash implementation.
Definition: Individual.cpp:96
grail::evolution::Individual::SetFitness
void SetFitness(double fitness)
SetFitness - sets the fitness value (evaluation of how good the particular Individual object is).
Definition: Individual.cpp:16
grail::evolution::Individual::GetPossibleRealizationsCount
long GetPossibleRealizationsCount() const
Definition: Individual.cpp:50
grail::evolution::Individual::Randomize
void Randomize(std::mt19937_64 &randomGenerator)
Changes the values of each parameter in the encoding of the individual to random available ones.
Definition: Individual.cpp:42
grail::evolution::Individual
Represents an individual for evolutionary algorithms (EA). It stores the encoding consisting of opti...
Definition: Individual.hh:23
grail::evolution::Mutation
The Mutation structure that encapsulates the mutation operation and its configuration in evolutionary...
Definition: Mutation.hh:20
grail::evolution::FitnessRepository
This class provides a functionality of assigning fitness values as averages from the previous evaluat...
Definition: FitnessRepository.h:24
grail::evolution::Individual::Instantiate
virtual std::unique_ptr< Individual > Instantiate() const =0
Create your final optimizable object that is based on this Individual. In EA such object is often ref...
grail::evolution::Individual::CloneMany
std::vector< std::unique_ptr< Individual > > CloneMany(int cloneCount) const
Performs a given number of copies of the individual.
Definition: Individual.cpp:35
grail::evolution::Individual::EvoParamsCount
std::size_t EvoParamsCount() const
EvoParamsCount - returns the number of parameters set as optimizable for evolutionary algorithms.
Definition: Individual.cpp:86
grail::evolution::Individual::SetMemberParameterOptimizable
void SetMemberParameterOptimizable(BaseEvoParam &parameter)
Call this method in a constructor and pass a reference to a field stored in this object....
Definition: Individual.cpp:202
grail::evolution::Individual::parameters
std::vector< std::reference_wrapper< BaseEvoParam > > parameters
The encoding of the Individual – the collection of its optimizable parameters.
Definition: Individual.hh:118
grail::evolution::Individual::ToString
virtual std::string ToString() const
ToString - returns the string representation of the Individual object.
Definition: Individual.cpp:155
grail::evolution::EAOptimizer
A class that serves as the main interface for evolutionary algorithms in Grail.
Definition: EAOptimizer.hh:49