2018-04-13 23:59:20 -07:00
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
#include "BitEvolver/Includes.h"
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
#include <memory>
|
|
|
|
#include <vector>
|
|
|
|
#include <mutex>
|
2018-04-14 04:10:31 -07:00
|
|
|
#include <functional>
|
2018-04-13 23:59:20 -07:00
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
namespace BitEvolver
|
|
|
|
{
|
|
|
|
//
|
|
|
|
class Population
|
|
|
|
{
|
|
|
|
//
|
|
|
|
public:
|
|
|
|
|
|
|
|
//
|
|
|
|
Population();
|
|
|
|
|
|
|
|
//
|
|
|
|
void Reset();
|
|
|
|
|
|
|
|
//
|
|
|
|
void ClearPopulation();
|
|
|
|
void InitRandomPopulation(int _population_size, int _bit_length);
|
|
|
|
void RandomizePopulation(int _bit_length);
|
|
|
|
|
|
|
|
//
|
|
|
|
void PopulationChanged();
|
|
|
|
|
|
|
|
//
|
|
|
|
std::vector<std::shared_ptr<class Chromosome>> GetChromosomes();
|
|
|
|
void GetChromosomes(std::shared_ptr<std::vector<std::shared_ptr<class Chromosome>>> _chromosomes);
|
|
|
|
std::shared_ptr<class Chromosome> GetChampion();
|
|
|
|
|
|
|
|
//
|
|
|
|
double GetAverageFitness();
|
|
|
|
double GetAverageFitness(std::vector<std::shared_ptr<class Chromosome>> _chromosomes);
|
|
|
|
|
2018-04-14 01:07:56 -07:00
|
|
|
//
|
|
|
|
void SetCrossoverType(Enums::CrossoverType t);
|
|
|
|
Enums::CrossoverType GetCrossoverType();
|
2018-04-14 19:58:13 -07:00
|
|
|
void SetCrossoverOrder(Enums::CrossoverOrder o);
|
|
|
|
Enums::CrossoverOrder GetCrossoverOrder();
|
|
|
|
void SetCrossoverBounds(Enums::CrossoverBounds b);
|
|
|
|
Enums::CrossoverBounds GetCrossoverBounds();
|
|
|
|
void SetCrossoverPoint(double p);
|
|
|
|
double GetCrossoverPoint();
|
|
|
|
void SetCrossoverPointStandardDeviation(double std);
|
|
|
|
double GetCrossoverPointStandardDeviation();
|
|
|
|
|
2018-04-13 23:59:20 -07:00
|
|
|
//
|
|
|
|
void SetMutationRate(double r);
|
2018-04-14 01:07:56 -07:00
|
|
|
double GetMutationRate();
|
2018-04-14 08:33:25 -07:00
|
|
|
//
|
|
|
|
void SetElitismType(Enums::ElitismType t);
|
|
|
|
Enums::ElitismType GetElitismType();
|
|
|
|
void SetElitismRate(double r);
|
|
|
|
double GetElitismRate();
|
|
|
|
void SetElitismCount(int c);
|
|
|
|
int GetElitismCount();
|
2018-04-13 23:59:20 -07:00
|
|
|
|
2018-04-14 04:10:31 -07:00
|
|
|
//
|
|
|
|
void EvaluateFitness(std::function<double(std::shared_ptr<Chromosome>)> evaluation_callback);
|
2018-04-14 04:18:05 -07:00
|
|
|
void EvaluateError(std::function<double(std::shared_ptr<Chromosome>)> evaluation_callback);
|
2018-04-14 04:10:31 -07:00
|
|
|
|
2018-04-13 23:59:20 -07:00
|
|
|
//
|
|
|
|
void Evolve();
|
|
|
|
int GetEvolutionNumber();
|
|
|
|
|
|
|
|
//
|
|
|
|
void PrintPopulation();
|
|
|
|
void PrintPopulation(std::vector<std::shared_ptr<class Chromosome>> _chromosomes);
|
|
|
|
|
2018-04-14 01:07:56 -07:00
|
|
|
// Constants
|
2018-04-14 19:58:13 -07:00
|
|
|
const static int DEFAULT_POPULATION_SIZE = 100;
|
|
|
|
const static Enums::ElitismType DEFAULT_ELITISM_TYPE = Enums::ElitismType::Rate;
|
|
|
|
constexpr static double DEFAULT_ELITISM_RATE = 0.01;
|
|
|
|
const static int DEFAULT_ELITISM_COUNT = 1;
|
|
|
|
constexpr static double DEFAULT_MUTATION_RATE = 0.01;
|
|
|
|
//
|
|
|
|
const static Enums::CrossoverType DEFAULT_CROSSOVER_TYPE = Enums::CrossoverType::Sexual;
|
|
|
|
const static Enums::CrossoverOrder DEFAULT_CROSSOVER_ORDER = Enums::CrossoverOrder::MamaPapa;
|
|
|
|
const static Enums::CrossoverBounds DEFAULT_CROSSOVER_BOUNDS = Enums::CrossoverBounds::Wrap;
|
|
|
|
constexpr static double DEFAULT_CROSSOVER_POINT = 0.7;
|
|
|
|
constexpr static double DEFAULT_CROSSOVER_POINT_STD = 0.25;
|
2018-04-14 01:07:56 -07:00
|
|
|
|
2018-04-13 23:59:20 -07:00
|
|
|
//
|
|
|
|
private:
|
|
|
|
|
|
|
|
//
|
|
|
|
std::shared_ptr<class Random> random;
|
|
|
|
std::shared_ptr<class Breeder> breeder;
|
|
|
|
|
|
|
|
//
|
|
|
|
std::vector<std::shared_ptr<class Chromosome>> chromosomes;
|
|
|
|
int population_size;
|
|
|
|
bool population_needs_sorting;
|
2018-04-14 08:33:25 -07:00
|
|
|
int evolution_number;
|
|
|
|
|
|
|
|
//
|
2018-04-14 01:07:56 -07:00
|
|
|
Enums::CrossoverType crossover_type;
|
2018-04-14 19:58:13 -07:00
|
|
|
Enums::CrossoverOrder crossover_order;
|
|
|
|
Enums::CrossoverBounds crossover_bounds;
|
2018-04-14 01:07:56 -07:00
|
|
|
double crossover_point;
|
2018-04-14 19:58:13 -07:00
|
|
|
double crossover_point_std;
|
2018-04-13 23:59:20 -07:00
|
|
|
double mutation_rate;
|
2018-04-14 08:33:25 -07:00
|
|
|
Enums::ElitismType elitism_type;
|
|
|
|
double elitism_rate;
|
|
|
|
int elitism_count;
|
2018-04-13 23:59:20 -07:00
|
|
|
|
2018-04-14 02:24:22 -07:00
|
|
|
//
|
|
|
|
std::shared_ptr<class RouletteWheel> roulette_wheel;
|
|
|
|
|
2018-04-13 23:59:20 -07:00
|
|
|
//
|
2018-04-14 04:10:31 -07:00
|
|
|
std::recursive_mutex
|
|
|
|
population_modification_mutex,
|
|
|
|
breed_mutex,
|
2018-04-14 08:33:25 -07:00
|
|
|
evaluate_fitness_mutex,
|
|
|
|
copy_chromosomes_mutex
|
2018-04-14 04:10:31 -07:00
|
|
|
;
|
2018-04-13 23:59:20 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
void InitRandomGenerator();
|
2018-04-14 02:24:22 -07:00
|
|
|
void InitRouletteWheel();
|
2018-04-13 23:59:20 -07:00
|
|
|
void InitBreeder();
|
|
|
|
|
|
|
|
//
|
|
|
|
void EnsureSortedPopulation();
|
|
|
|
|
|
|
|
//
|
|
|
|
void BreedNewPopulation(std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> population_new, int size);
|
|
|
|
void BreedNewPopulation_Thread(std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> population_new, int size);
|
|
|
|
|
2018-04-14 08:33:25 -07:00
|
|
|
//
|
|
|
|
int DetermineEliteCount();
|
|
|
|
void SeedPopulationWithElites(std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> population_new);
|
|
|
|
|
2018-04-14 04:10:31 -07:00
|
|
|
//
|
|
|
|
void EvaluateFitness_Thread(
|
|
|
|
std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> _chromosomes,
|
|
|
|
std::function<double(std::shared_ptr<Chromosome>)> evaluation_callback
|
|
|
|
);
|
2018-04-14 04:18:05 -07:00
|
|
|
void EvaluateError_Thread(
|
|
|
|
std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> _chromosomes,
|
|
|
|
std::function<double(std::shared_ptr<Chromosome>)> evaluation_callback
|
|
|
|
);
|
2018-04-14 04:10:31 -07:00
|
|
|
|
2018-04-14 08:33:25 -07:00
|
|
|
//
|
|
|
|
void CopyChromosomes(
|
|
|
|
std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> _chromosomes_source,
|
|
|
|
std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> _chromosomes_destination
|
|
|
|
);
|
|
|
|
void CopyChromosomes_Thread(
|
|
|
|
std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> _chromosomes_source,
|
|
|
|
std::shared_ptr<std::vector<std::shared_ptr<Chromosome>>> _chromosomes_destination
|
|
|
|
);
|
|
|
|
|
2018-04-13 23:59:20 -07:00
|
|
|
//
|
|
|
|
std::shared_ptr<Chromosome> BreedChild();
|
|
|
|
|
2018-04-14 00:28:50 -07:00
|
|
|
//
|
|
|
|
int GetThreadCountSuggestion();
|
2018-04-13 23:59:20 -07:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|