3 #include <geneial/namespaces.h>
4 #include <geneial/config.h>
6 #include <geneial/core/population/Population.h>
7 #include <geneial/core/population/PopulationSettings.h>
9 #include <geneial/core/population/management/BaseManager.h>
11 #include <geneial/algorithm/criteria/BaseStoppingCriterion.h>
12 #include <geneial/core/operations/selection/BaseSelectionOperation.h>
13 #include <geneial/core/operations/coupling/BaseCouplingOperation.h>
14 #include <geneial/core/operations/crossover/BaseCrossoverOperation.h>
15 #include <geneial/core/operations/mutation/BaseMutationOperation.h>
16 #include <geneial/core/operations/replacement/BaseReplacementOperation.h>
17 #include <geneial/algorithm/observer/AlgorithmObserver.h>
18 #include <geneial/utility/mixins/Buildable.h>
20 #include <geneial/utility/ExecutionManager.h>
22 #include <boost/optional.hpp>
27 #include <type_traits>
30 geneial_private_namespace(geneial)
32 geneial_private_namespace(algorithm)
34 using ::geneial::algorithm::stopping_criteria::BaseStoppingCriterion;
35 using ::geneial::operation::selection::BaseSelectionOperation;
36 using ::geneial::operation::coupling::BaseCouplingOperation;
37 using ::geneial::operation::crossover::BaseCrossoverOperation;
38 using ::geneial::operation::replacement::BaseReplacementOperation;
39 using ::geneial::operation::mutation::BaseMutationOperation;
40 using ::geneial::utility::BaseExecutionManager;
41 using ::geneial::population::Population;
42 using ::geneial::population::PopulationSettings;
43 using ::geneial::population::chromosome::BaseChromosome;
44 using ::geneial::population::chromosome::BaseChromosomeFactory;
45 using ::geneial::population::management::BaseBookkeeper;
46 using ::geneial::population::management::BaseManager;
48 using ::geneial::utility::Buildable;
50 geneial_export_namespace
54 template<
typename FITNESS_TYPE>
55 class BaseGeneticAlgorithm :
public virtual Buildable<BaseGeneticAlgorithm<FITNESS_TYPE>>
58 typedef typename std::map<typename AlgorithmObserver<FITNESS_TYPE>::ObserveableEvent,
59 std::vector<std::shared_ptr<AlgorithmObserver<FITNESS_TYPE>>>> observers_map;
61 observers_map _observers;
63 std::shared_ptr<BaseManager<FITNESS_TYPE>> _manager;
69 std::shared_ptr<BaseStoppingCriterion<FITNESS_TYPE>> _stoppingCriterion;
71 std::shared_ptr<BaseSelectionOperation<FITNESS_TYPE>> _selectionOperation;
73 std::shared_ptr<BaseCouplingOperation<FITNESS_TYPE>> _couplingOperation;
75 std::shared_ptr<BaseCrossoverOperation<FITNESS_TYPE>> _crossoverOperation;
77 std::shared_ptr<BaseReplacementOperation<FITNESS_TYPE>> _replacementOperation;
79 std::shared_ptr<BaseMutationOperation<FITNESS_TYPE>> _mutationOperation;
83 std::shared_ptr<BaseStoppingCriterion<FITNESS_TYPE>> stoppingCriterion,
84 std::shared_ptr<BaseSelectionOperation<FITNESS_TYPE>> selectionOperation,
85 std::shared_ptr<BaseCouplingOperation<FITNESS_TYPE>> couplingOperation,
86 std::shared_ptr<BaseCrossoverOperation<FITNESS_TYPE>> crossoverOperation,
87 std::shared_ptr<BaseReplacementOperation<FITNESS_TYPE>> replacementOperation,
88 std::shared_ptr<BaseMutationOperation<FITNESS_TYPE>> mutationOperation,
89 std::shared_ptr<BaseChromosomeFactory<FITNESS_TYPE>> chromosomeFactory):
91 _manager(BaseManager<FITNESS_TYPE>::create(chromosomeFactory)),
94 _stoppingCriterion(stoppingCriterion),
95 _selectionOperation(selectionOperation),
96 _couplingOperation(couplingOperation),
97 _crossoverOperation(crossoverOperation),
98 _replacementOperation(replacementOperation),
99 _mutationOperation(mutationOperation)
101 static_assert(std::is_arithmetic<FITNESS_TYPE>::value,
"FITNESS_TYPE is expected to be an arithmetic data type!");
109 virtual ~BaseGeneticAlgorithm()
113 virtual void solve() = 0;
115 virtual void setInitialPopulation(
typename Population<FITNESS_TYPE>::chromosome_container &container)
117 assert(!_wasStarted);
118 _manager->getPopulation().replacePopulation(container);
123 inline typename BaseChromosome<FITNESS_TYPE>::ptr getHighestFitnessChromosome()
const
126 return _manager->getHighestFitnessChromosome();
129 inline FITNESS_TYPE getHighestFitness()
const
132 return _manager->getHighestFitness();
135 virtual Population<FITNESS_TYPE>& getPopulation()
137 return _manager->getPopulation();
140 inline typename BaseChromosome<FITNESS_TYPE>::ptr getLowestFitnessChromosome()
const
143 return _manager->getLowestFitnessChromosome();
146 inline FITNESS_TYPE getLowestFitness()
const
149 return _manager->getLowestFitness();
152 inline virtual bool hasBeenSolved()
const
157 inline virtual bool hasBeenStarted()
const
162 inline virtual PopulationSettings& getPopulationSettings()
164 return _manager->getPopulationSettings();
167 inline void setPopulationSettings(PopulationSettings& populationSettings)
169 _manager->setPopulationSettings(populationSettings);
172 inline virtual bool wasCriteriaReached();
174 inline virtual void notifyObservers(
typename AlgorithmObserver<FITNESS_TYPE>::ObserveableEvent event);
176 inline virtual void registerObserver(
const std::shared_ptr<AlgorithmObserver<FITNESS_TYPE>>& observer);
179 BaseExecutionManager& getExecutionManager()
const
181 return _manager->getExecutionManager();
184 void setExecutionManager(std::unique_ptr<BaseExecutionManager>&& executionManager)
186 _manager->setExecutionManager(std::move(executionManager));
189 void setBookkeeper(
const std::shared_ptr<BaseBookkeeper>& bookkeeper)
191 _manager->setBookkeeper(bookkeeper);
194 const std::shared_ptr<BaseBookkeeper> getBookkeeper()
const
196 return _manager->getBookkeeper();
200 template<
typename FITNESS_TYPE>
201 class BaseGeneticAlgorithm<FITNESS_TYPE>::Builder :
public Buildable<BaseGeneticAlgorithm<FITNESS_TYPE>>::Builder
204 boost::optional<std::shared_ptr<BaseStoppingCriterion<FITNESS_TYPE>>> _stoppingCriterion;
206 boost::optional<std::shared_ptr<BaseSelectionOperation<FITNESS_TYPE>>> _selectionOperation;
208 boost::optional<std::shared_ptr<BaseCouplingOperation<FITNESS_TYPE>>> _couplingOperation;
210 boost::optional<std::shared_ptr<BaseCrossoverOperation<FITNESS_TYPE>>> _crossoverOperation;
212 boost::optional<std::shared_ptr<BaseReplacementOperation<FITNESS_TYPE>>> _replacementOperation;
214 boost::optional<std::shared_ptr<BaseMutationOperation<FITNESS_TYPE>>> _mutationOperation;
216 boost::optional<std::shared_ptr<BaseChromosomeFactory<FITNESS_TYPE>>> _chromosomeFactory;
227 Builder& setStoppingCriterion(
const std::shared_ptr<stopping_criteria::BaseStoppingCriterion<FITNESS_TYPE>> &stoppingCriterion )
229 this->_stoppingCriterion = stoppingCriterion;
233 Builder& setSelectionOperation(
const std::shared_ptr<BaseSelectionOperation<FITNESS_TYPE>> &selectionOperation )
235 this->_selectionOperation = selectionOperation;
239 Builder& setCouplingOperation(
const std::shared_ptr<BaseCouplingOperation<FITNESS_TYPE>> &couplingOperation )
241 this->_couplingOperation = couplingOperation;
245 Builder& setCrossoverOperation(
const std::shared_ptr<BaseCrossoverOperation<FITNESS_TYPE>> &crossoverOperation )
247 this->_crossoverOperation = crossoverOperation;
251 Builder& setReplacementOperation(
const std::shared_ptr<BaseReplacementOperation<FITNESS_TYPE>> &replacementOperation )
253 this->_replacementOperation = replacementOperation;
257 Builder& setMutationOperation(
const std::shared_ptr<BaseMutationOperation<FITNESS_TYPE>> &mutationOperation )
259 this->_mutationOperation = mutationOperation;
263 Builder& setChromosomeFactory (
const std::shared_ptr<BaseChromosomeFactory<FITNESS_TYPE>> chromosomeFactory )
265 _chromosomeFactory = chromosomeFactory;
275 #include <geneial/algorithm/BaseGeneticAlgorithm.hpp>