Grail (C++)  1.4.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
FitnessRepository.h
1 // Copyright QED Software 2024.
2 
3 #ifndef GRAIL_FITNESS_REPOSITORY_H
4 #define GRAIL_FITNESS_REPOSITORY_H
5 
6 #include "Individual.hh"
7 
8 #include <unordered_map>
9 #include <vector>
10 #include <memory>
11 #include <numeric>
12 #include <algorithm>
13 #include <fstream>
14 #include <sstream>
15 #include <iostream>
16 
17 namespace grail
18 {
19 namespace evolution
20 {
24  class FitnessRepository final
25  {
26  struct IndividualHash
27  {
28  std::size_t operator()(const Individual* individual) const
29  {
30  return individual->GetHashCode();
31  }
32  };
33 
34  struct IndividualEqual
35  {
36  bool operator()(const Individual* lhs, const Individual* rhs) const
37  {
38  return lhs->Equals(*rhs);
39  }
40  };
41 
42  public:
45  FitnessRepository(size_t maxSamplesPerIndividual = 100);
46 
50  std::size_t GetSampleCount(const Individual& individual) const;
51 
56  bool TryGetFitness(const Individual& individual, double& fitness) const;
57 
58  // Call this method after a new fitness evaluation has been performed.
59  // Stores an individual in the repository along with its current fitness.
60  // Then updates its fitness to the average value of the current and past fitness value.
61  void AddSampleWithFitnessUpdate(Individual& individual);
62 
65  void Serialize(const std::string& filename) const;
66 
72  bool Deserialize(const std::string& filename, const Individual& populationRepresentative);
73 
74  private:
75  std::unordered_map<const Individual*, std::vector<double>, IndividualHash, IndividualEqual> individualFitnessEvaluations{};
76  std::vector<std::unique_ptr<Individual>> ownedIndividuals{};
77  std::size_t maxSamples;
78  };
79 }
80 }
81 #endif //GRAIL_FITNESS_REPOSITORY_H
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::FitnessRepository::Deserialize
bool Deserialize(const std::string &filename, const Individual &populationRepresentative)
Loads previously saved contents of the FitnessRepository using the Serialize() method....
Definition: FitnessRepository.cpp:90
grail::evolution::FitnessRepository::GetSampleCount
std::size_t GetSampleCount(const Individual &individual) const
Returns the number of fitness values currently stored for a given individual.
Definition: FitnessRepository.cpp:15
grail::evolution::FitnessRepository::FitnessRepository
FitnessRepository(size_t maxSamplesPerIndividual=100)
Constructs a new FitnessRepository instance.
Definition: FitnessRepository.cpp:10
grail::evolution::Individual::GetHashCode
std::size_t GetHashCode() const
Custom hash implementation.
Definition: Individual.cpp:96
grail::evolution::Individual
Represents an individual for evolutionary algorithms (EA). It stores the encoding consisting of opti...
Definition: Individual.hh:23
grail::evolution::FitnessRepository::TryGetFitness
bool TryGetFitness(const Individual &individual, double &fitness) const
Definition: FitnessRepository.cpp:26
grail::evolution::FitnessRepository
This class provides a functionality of assigning fitness values as averages from the previous evaluat...
Definition: FitnessRepository.h:24
grail::evolution::FitnessRepository::Serialize
void Serialize(const std::string &filename) const
Serializes contents of the FitnessRepository so it can be loaded in another session using Deserialize...
Definition: FitnessRepository.cpp:65