panga
GeneticAlgorithm.h
1 //-------------------------------------------------------------------------------------------------------
2 // Copyright (C) Taylor Woll and panga contributors. All rights reserved.
3 // Licensed under the MIT license. See LICENSE.txt file in the project root for
4 // full license information.
5 //-------------------------------------------------------------------------------------------------------
6 
7 #ifndef GENETICALGORITHM_H__
8 #define GENETICALGORITHM_H__
9 
10 #include <vector>
11 
12 #include "Genome.h"
13 #include "Population.h"
14 #include "RandomWrapper.h"
15 
16 namespace panga {
17 
18 class Individual;
19 class BitVector;
20 
21 using FitnessFunction = double (*)(Individual*, void*);
22 
24  public:
34  enum class CrossoverType : uint8_t {
43  OnePoint = 1,
44 
55  TwoPoint,
56 
70  KPoint,
71 
78  Uniform
79  };
80 
88  enum class MutatorType : uint8_t {
96  Flip = 1
97  };
98 
110  enum class SelectorType : uint8_t {
118  Rank = 1,
119 
125  Uniform,
126 
141 
157  Tournament
158  };
159 
169  enum class MutationRateSchedule : uint8_t {
178  Constant = 1,
179 
200 
221  SelfAdaptive,
222 
232  };
233 
235  GeneticAlgorithm(const GeneticAlgorithm& rhs) = delete;
236  GeneticAlgorithm& operator=(const GeneticAlgorithm& rhs) = delete;
237  ~GeneticAlgorithm() = default;
238 
244  Genome& GetGenome();
245 
258  void SetCrossoverIgnoreGeneBoundaries(bool crossover_ignore_gene_boundaries);
259  bool GetCrossoverIgnoreGeneBoundaries() const;
260 
272  void SetAllowSameParentCouples(bool allow_same_parent_couples);
273  bool GetAllowSameParentCouples() const;
274 
279  void SetTournamentSize(size_t tournament_size);
280  size_t GetTournamentSize() const;
281 
286  void SetKPointCrossoverPointCount(size_t k_point_crossover_point_count);
287  size_t GetKPointCrossoverPointCount() const;
288 
294  double self_adaptive_mutation_diversity_floor);
295  double GetSelfAdaptiveMutationDiversityFloor() const;
296 
302  double self_adaptive_mutation_aggressive_rate);
303  double GetSelfAdaptiveMutationAggressiveRate() const;
304 
309  void SetProportionalMutationBitCount(size_t proportional_mutation_bit_count);
310  size_t GetProportionalMutationBitCount() const;
311 
320  void SetTotalGenerations(size_t total_generations);
321  size_t GetTotalGenerations() const;
322 
333  void SetMutationRate(double mutation_rate);
334  double GetMutationRate() const;
335 
344  void SetCrossoverRate(double crossover_rate);
345  double GetCrossoverRate() const;
346 
353  void SetCrossoverType(CrossoverType crossover_type);
354  CrossoverType GetCrossoverType() const;
355 
362  void SetSelectorType(SelectorType selector_type);
363  SelectorType GetSelectorType() const;
364 
371  void SetEliteCount(size_t elite_count);
372  size_t GetEliteCount() const;
373 
380  void SetMutatedEliteCount(size_t mutated_elite_count);
381  size_t GetMutatedEliteCount() const;
382 
386  void SetMutatedEliteMutationRate(double mutated_elite_mutation_rate);
387  double GetMutatedEliteMutationRate() const;
388 
394  void SetMutationRateSchedule(MutationRateSchedule mutation_rate_schedule);
395  MutationRateSchedule GetMutationRateSchedule() const;
396 
403  void SetMutatorType(MutatorType mutator_type);
404  MutatorType GetMutatorType() const;
405 
410  void SetUserData(void* user_data);
411  void* GetUserData() const;
412 
419  void SetFitnessFunction(FitnessFunction fitness_function);
420  FitnessFunction GetFitnessFunction() const;
421 
426  void SetPopulationSize(size_t population_size);
427  size_t GetPopulationSize() const;
428 
433  size_t GetCurrentGeneration() const;
434 
438  const Population& GetPopulation() const;
439 
445  void Initialize();
446 
454  void SetInitialPopulation(const std::vector<BitVector>& initial_population);
455 
471  void Step();
472 
476  void Run();
477 
478  protected:
485  void Crossover(const Individual& parent1, const Individual& parent2,
486  Individual* offspring);
487 
494  void Mutate(Individual* individual, double mutation_percentage);
495 
503  double GetCurrentMutationRate();
504 
509  void InitializeSelector(Population* population);
510 
518  std::pair<const Individual&, const Individual&> SelectParents(
519  const Population& population);
520 
526  const Individual& SelectOne(const Population& population);
527 
538 
550 
551  private:
552  static constexpr double DefaultMutationRate = 0.0005;
553  static constexpr double DefaultCrossoverRate = 0.9;
554  static constexpr double DefaultMutatedEliteMutationRate = 0.33;
555  static constexpr double DefaultSelfAdaptiveMutationDiversityFloor = 0.0002;
556  static constexpr double DefaultSelfAdaptiveMutationAggressiveRate = 0.1;
557  static constexpr size_t DefaultTournamentSize = 2;
558  static constexpr size_t DefaultKPointCrossoverCount = 3;
559  static constexpr size_t DefaultProportionalMutationBitCount = 1;
560 
561  Genome genome_;
562  std::vector<Population> populations_;
563  RandomWrapper random_;
564 
565  void* user_data_ = nullptr;
566  FitnessFunction fitness_function_ = nullptr;
567 
568  size_t population_size_ = 0;
569  size_t total_generations_ = 0;
570  size_t current_generation_ = 0;
571 
572  size_t elite_count_ = 0;
573  size_t mutated_elite_count_ = 0;
574 
575  double mutation_rate_ = DefaultMutationRate;
576  double crossover_rate_ = DefaultCrossoverRate;
577  double mutated_elite_mutation_rate_ = DefaultMutatedEliteMutationRate;
578 
579  size_t tournament_size_ = DefaultTournamentSize;
580  size_t k_point_crossover_point_count_ = DefaultKPointCrossoverCount;
581  double self_adaptive_mutation_diversity_floor_ =
582  DefaultSelfAdaptiveMutationDiversityFloor;
583  double self_adaptive_mutation_aggressive_rate_ =
584  DefaultSelfAdaptiveMutationAggressiveRate;
585  size_t proportional_mutation_bit_count_ = DefaultProportionalMutationBitCount;
586 
587  CrossoverType crossover_type_ = CrossoverType::Uniform;
588  MutatorType mutator_type_ = MutatorType::Flip;
589  SelectorType selector_type_ = SelectorType::Tournament;
590  MutationRateSchedule mutation_rate_schedule_ = MutationRateSchedule::Constant;
591 
592  bool crossover_ignore_gene_boundaries_ = true;
593  bool allow_same_parent_couples_ = true;
594  bool is_initial_population_evaluated_ = false;
595 };
596 
597 } // namespace panga
598 
599 #endif // GENETICALGORITHM_H__
panga::GeneticAlgorithm::GetCurrentGeneration
size_t GetCurrentGeneration() const
Definition: GeneticAlgorithm.cc:137
panga::GeneticAlgorithm::MutationRateSchedule::Constant
@ Constant
panga::GeneticAlgorithm::SetFitnessFunction
void SetFitnessFunction(FitnessFunction fitness_function)
Definition: GeneticAlgorithm.cc:59
panga::GeneticAlgorithm::GetLastGenerationPopulation
Population & GetLastGenerationPopulation()
Definition: GeneticAlgorithm.cc:219
panga::GeneticAlgorithm::SetAllowSameParentCouples
void SetAllowSameParentCouples(bool allow_same_parent_couples)
Definition: GeneticAlgorithm.cc:128
panga::GeneticAlgorithm::SetKPointCrossoverPointCount
void SetKPointCrossoverPointCount(size_t k_point_crossover_point_count)
Definition: GeneticAlgorithm.cc:147
panga::GeneticAlgorithm::CrossoverType
CrossoverType
Definition: GeneticAlgorithm.h:34
panga::GeneticAlgorithm::SelectorType::RouletteWheel
@ RouletteWheel
panga::GeneticAlgorithm::SelectParents
std::pair< const Individual &, const Individual & > SelectParents(const Population &population)
Definition: GeneticAlgorithm.cc:412
panga::GeneticAlgorithm::MutatorType::Flip
@ Flip
panga::GeneticAlgorithm::MutationRateSchedule::Proportional
@ Proportional
panga::GeneticAlgorithm::GetPopulation
const Population & GetPopulation() const
Definition: GeneticAlgorithm.cc:226
panga::GeneticAlgorithm::MutationRateSchedule::SelfAdaptive
@ SelfAdaptive
panga::GeneticAlgorithm::CrossoverType::KPoint
@ KPoint
panga::GeneticAlgorithm::SelectOne
const Individual & SelectOne(const Population &population)
Definition: GeneticAlgorithm.cc:394
panga::GeneticAlgorithm::MutationRateSchedule::Deterministic
@ Deterministic
panga::GeneticAlgorithm::CrossoverType::OnePoint
@ OnePoint
panga::GeneticAlgorithm::CrossoverType::Uniform
@ Uniform
panga::GeneticAlgorithm::SetUserData
void SetUserData(void *user_data)
Definition: GeneticAlgorithm.cc:91
panga::GeneticAlgorithm::GetGenome
Genome & GetGenome()
Definition: GeneticAlgorithm.cc:22
panga::GeneticAlgorithm::Mutate
void Mutate(Individual *individual, double mutation_percentage)
Definition: GeneticAlgorithm.cc:377
panga::GeneticAlgorithm::SelectorType
SelectorType
Definition: GeneticAlgorithm.h:110
panga::GeneticAlgorithm::SetCrossoverType
void SetCrossoverType(CrossoverType crossover_type)
Definition: GeneticAlgorithm.cc:95
panga::GeneticAlgorithm::SetSelfAdaptiveMutationDiversityFloor
void SetSelfAdaptiveMutationDiversityFloor(double self_adaptive_mutation_diversity_floor)
Definition: GeneticAlgorithm.cc:156
panga::Population
Definition: Population.h:29
panga::GeneticAlgorithm::MutatorType
MutatorType
Definition: GeneticAlgorithm.h:88
panga::GeneticAlgorithm::SetMutationRateSchedule
void SetMutationRateSchedule(MutationRateSchedule mutation_rate_schedule)
Definition: GeneticAlgorithm.cc:81
panga::GeneticAlgorithm::SelectorType::Uniform
@ Uniform
panga::GeneticAlgorithm::SetTournamentSize
void SetTournamentSize(size_t tournament_size)
Definition: GeneticAlgorithm.cc:141
panga::GeneticAlgorithm::SetSelectorType
void SetSelectorType(SelectorType selector_type)
Definition: GeneticAlgorithm.cc:111
panga::Genome
Definition: Genome.h:31
panga::RandomWrapper
Definition: RandomWrapper.h:20
panga::GeneticAlgorithm::GetCurrentPopulation
Population & GetCurrentPopulation()
Definition: GeneticAlgorithm.cc:212
panga::GeneticAlgorithm::SetCrossoverRate
void SetCrossoverRate(double crossover_rate)
Definition: GeneticAlgorithm.cc:39
panga::GeneticAlgorithm::SetProportionalMutationBitCount
void SetProportionalMutationBitCount(size_t proportional_mutation_bit_count)
Definition: GeneticAlgorithm.cc:176
panga::GeneticAlgorithm::SetSelfAdaptiveMutationAggressiveRate
void SetSelfAdaptiveMutationAggressiveRate(double self_adaptive_mutation_aggressive_rate)
Definition: GeneticAlgorithm.cc:166
panga::GeneticAlgorithm::SetMutatorType
void SetMutatorType(MutatorType mutator_type)
Definition: GeneticAlgorithm.cc:103
panga::GeneticAlgorithm::SetCrossoverIgnoreGeneBoundaries
void SetCrossoverIgnoreGeneBoundaries(bool crossover_ignore_gene_boundaries)
Definition: GeneticAlgorithm.cc:119
panga::Individual
Definition: Individual.h:20
panga::GeneticAlgorithm::Run
void Run()
Definition: GeneticAlgorithm.cc:304
panga::GeneticAlgorithm::Initialize
void Initialize()
Definition: GeneticAlgorithm.cc:194
panga::GeneticAlgorithm::InitializeSelector
void InitializeSelector(Population *population)
Definition: GeneticAlgorithm.cc:388
panga::GeneticAlgorithm::SelectorType::Tournament
@ Tournament
panga::GeneticAlgorithm::Crossover
void Crossover(const Individual &parent1, const Individual &parent2, Individual *offspring)
Definition: GeneticAlgorithm.cc:351
panga::GeneticAlgorithm::SetMutatedEliteMutationRate
void SetMutatedEliteMutationRate(double mutated_elite_mutation_rate)
Definition: GeneticAlgorithm.cc:24
panga::GeneticAlgorithm::GetCurrentMutationRate
double GetCurrentMutationRate()
Definition: GeneticAlgorithm.cc:310
panga::GeneticAlgorithm::SetInitialPopulation
void SetInitialPopulation(const std::vector< BitVector > &initial_population)
Definition: GeneticAlgorithm.cc:185
panga::GeneticAlgorithm::SelectorType::Rank
@ Rank
panga::GeneticAlgorithm::SetMutatedEliteCount
void SetMutatedEliteCount(size_t mutated_elite_count)
Definition: GeneticAlgorithm.cc:77
panga::GeneticAlgorithm::SetEliteCount
void SetEliteCount(size_t elite_count)
Definition: GeneticAlgorithm.cc:69
panga::GeneticAlgorithm
Definition: GeneticAlgorithm.h:23
panga::GeneticAlgorithm::SetMutationRate
void SetMutationRate(double mutation_rate)
Definition: GeneticAlgorithm.cc:33
panga::GeneticAlgorithm::CrossoverType::TwoPoint
@ TwoPoint
panga::GeneticAlgorithm::SetTotalGenerations
void SetTotalGenerations(size_t total_generations)
Definition: GeneticAlgorithm.cc:51
panga::GeneticAlgorithm::Step
void Step()
Definition: GeneticAlgorithm.cc:233
panga::GeneticAlgorithm::SetPopulationSize
void SetPopulationSize(size_t population_size)
Definition: GeneticAlgorithm.cc:45
panga::GeneticAlgorithm::MutationRateSchedule
MutationRateSchedule
Definition: GeneticAlgorithm.h:169