8 #ifndef SOT_GENETIC_ALGORITHM_H 9 #define SOT_GENETIC_ALGORITHM_H 11 #include "experimental_design.h" 46 std::string
mName =
"Genetic Algorithm";
63 while(myEval < batch.n_cols) {
64 vec x = batch.col(myEval);
65 funVals[myEval] = mData->eval(x);
80 GeneticAlgorithm(std::shared_ptr<Problem>& data,
int numIndividuals,
int numGenerations) {
81 mData = std::shared_ptr<Problem>(data);
84 mpMutation = 1.0/
mDim;
85 mNumIndividuals = numIndividuals;
86 mNumGenerations = numGenerations;
88 mxLow = data->lBounds();
89 mxUp= data->uBounds();
99 GeneticAlgorithm(std::shared_ptr<Problem>& data,
int numIndividuals,
int numGenerations,
int numThreads) :
102 mNumThreads = numThreads;
114 int numIndividuals,
int numGenerations) :
GeneticAlgorithm(data, numIndividuals, numGenerations) {
115 mExpDes = std::shared_ptr<ExpDesign>(expDes);
117 throw std::logic_error(
"Experimental design doesn't match the population size");
120 throw std::logic_error(
"Experimental design has incorrect dimensionality");
133 int numIndividuals,
int numGenerations,
int numThreads) :
136 mNumThreads = numThreads;
144 std::vector<std::thread> threads(mNumThreads);
145 Result res(mNumIndividuals * mNumGenerations, mDim);
150 population.randu(mNumVariables, mNumIndividuals);
153 population = mExpDes->generatePoints();
158 vec functionValues = arma::zeros(mNumIndividuals);
159 if(mNumThreads > 1) {
163 std::ref(population), std::ref(functionValues));
171 functionValues = mData->evals(population);
176 functionValues.min(ind);
177 vec bestIndividual = population.col(ind);
178 double bestValue = functionValues(ind);
180 for(
int gen = 0; gen < mNumGenerations - 1; gen++) {
184 arma::distr_param(0, mNumIndividuals - 1));
185 for(
int i = 0; i < mNumIndividuals/2; i++) {
186 double minval1 = std::numeric_limits<double>::max();
187 double minval2 = std::numeric_limits<double>::max();
188 int ind1 =
randi(mNumIndividuals - 1);
189 int ind2 =
randi(mNumIndividuals - 1);
191 if (functionValues(tournament(j, 2*i)) < minval1) {
192 minval1 = functionValues(tournament(j, 2*i));
193 ind1 = tournament(j, 2*i);
195 if (functionValues(tournament(j, 2*i + 1)) < minval2) {
196 minval2 = functionValues(tournament(j, 2*i + 1));
197 ind2 = tournament(j, 2*i + 1);
200 double alpha =
rand();
201 if(
rand() < mpCross) {
202 newPopulation.col(2*i) = alpha * population.col(ind1) + (1 - alpha) * population.col(ind2);
203 newPopulation.col(2*i + 1) = alpha * population.col(ind2) + (1 - alpha) * population.col(ind1);
206 newPopulation.col(2*i) = population.col(ind1);
207 newPopulation.col(2*i + 1) = population.col(ind2);
214 if(
rand() < mpMutation) {
216 if(newPopulation(j,i) >
mxUp(j)) {
217 newPopulation(j,i) = fmax(2*
mxUp(j) - newPopulation(j,i),
mxLow(j));
219 else if(newPopulation(j,i) <
mxLow(j)) {
220 newPopulation(j,i) = fmin(2*
mxLow(j) - newPopulation(j,i),
mxUp(j));
227 newPopulation.col(mNumIndividuals - 1) = bestIndividual;
230 if(mNumThreads > 1) {
234 std::ref(newPopulation), std::ref(functionValues));
242 functionValues = mData->evals(newPopulation);
247 vec x = newPopulation.col(i);
248 res.
addEval(x, functionValues(i));
253 functionValues.min(ind);
254 bestIndividual = newPopulation.col(ind);
255 bestValue = functionValues(ind);
258 population = newPopulation;
Optimization result class.
Definition: utils.h:138
GeneticAlgorithm(std::shared_ptr< Problem > &data, int numIndividuals, int numGenerations, int numThreads)
Constructor.
Definition: genetic_algorithm.h:99
GeneticAlgorithm(std::shared_ptr< Problem > &data, int numIndividuals, int numGenerations)
Constructor.
Definition: genetic_algorithm.h:80
arma::vec vec
Default (column) vector class.
Definition: common.h:17
vec mxUp
Definition: genetic_algorithm.h:42
void evalBatch(const mat &batch, vec &funVals)
Evalaute a batch of points in parallel.
Definition: genetic_algorithm.h:57
vec mxLow
Definition: genetic_algorithm.h:41
double mpCross
Definition: genetic_algorithm.h:38
int mEvalCount
Definition: genetic_algorithm.h:49
GeneticAlgorithm(std::shared_ptr< Problem > &data, std::shared_ptr< ExpDesign > &expDes, int numIndividuals, int numGenerations)
Constructor.
Definition: genetic_algorithm.h:113
double rand()
Generate a U[0,1] realization.
Definition: utils.h:386
double randi(int i)
Generate a random integer.
Definition: utils.h:364
Genetic Algorithm.
Definition: genetic_algorithm.h:32
std::shared_ptr< Problem > mData
Definition: genetic_algorithm.h:34
double mpMutation
Definition: genetic_algorithm.h:39
GeneticAlgorithm(std::shared_ptr< Problem > &data, std::shared_ptr< ExpDesign > &expDes, int numIndividuals, int numGenerations, int numThreads)
Constructor.
Definition: genetic_algorithm.h:132
int mDim
Definition: genetic_algorithm.h:40
int mNumIndividuals
Definition: genetic_algorithm.h:44
int mTournamentSize
Definition: genetic_algorithm.h:37
vec fromUnitBox(const vec &x, const vec &xLow, const vec &xUp)
Map one point from the unit box to another hypercube.
Definition: utils.h:94
double randn()
Generate a N(0,1) realization.
Definition: utils.h:375
Result run()
Runs the optimization algorithm.
Definition: genetic_algorithm.h:143
void addEval(const vec &x, double funVal)
Method for adding a finished evaluation.
Definition: utils.h:227
SOT namespace.
Definition: sot.h:27
double mSigma
Definition: genetic_algorithm.h:36
arma::mat mat
Default matrix class.
Definition: common.h:16
std::shared_ptr< ExpDesign > mExpDes
Definition: genetic_algorithm.h:35
int mNumThreads
Definition: genetic_algorithm.h:48
std::mutex mMutex
Definition: genetic_algorithm.h:50
int mNumGenerations
Definition: genetic_algorithm.h:45
std::string mName
Definition: genetic_algorithm.h:46
int mNumVariables
Definition: genetic_algorithm.h:43
bool mRandomInit
Definition: genetic_algorithm.h:47