35 #if !defined(LIBEVOCOSM_SCALER_H)
36 #define LIBEVOCOSM_SCALER_H
59 template <
class OrganismType>
83 virtual void scale_fitness(vector<OrganismType> & a_population) = 0;
89 void invert(vector<OrganismType> & a_population)
91 double base = min_element(a_population.begin(), a_population.end())->fitness()
92 + max_element(a_population.begin(), a_population.end())->fitness();
94 for (
typename vector<OrganismType>::iterator
organism = a_population.begin();
organism != a_population.end(); ++
organism)
105 template <
class OrganismType>
126 template <
class OrganismType>
135 : m_fitness_multiple(a_fitness_multiple)
148 double max_fitness = std::numeric_limits<double>::min();
149 double min_fitness = std::numeric_limits<double>::max();
150 double avg_fitness = 0.0;
152 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
155 if (org->fitness() > max_fitness)
156 max_fitness = org->fitness();
159 if (org->fitness() < min_fitness)
160 min_fitness = org->fitness();
163 avg_fitness += org->fitness();
166 avg_fitness /= double(a_population.size());
173 if (min_fitness > ((m_fitness_multiple * avg_fitness - max_fitness) / (m_fitness_multiple - 1.0)))
176 delta = max_fitness - avg_fitness;
177 slope = (m_fitness_multiple - 1.0) * avg_fitness / delta;
178 intercept = avg_fitness * (max_fitness - m_fitness_multiple * avg_fitness) / delta;
183 delta = avg_fitness - min_fitness;
184 slope = avg_fitness / delta;
185 intercept = -min_fitness * avg_fitness / delta;
189 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
190 org->fitness() = slope * org->fitness() + intercept;
194 double m_fitness_multiple;
203 template <
class OrganismType>
226 double min_fitness = min_element(a_population.begin(), a_population.end())->fitness();
229 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
230 org->fitness() -= min_fitness;
240 template <
class OrganismType>
268 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
269 org->fitness() = pow((m_a * org->fitness() + m_b),m_power);
283 template <
class OrganismType>
292 : m_a(a_a), m_b(a_b), m_c(a_c)
305 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
307 double f = org->fitness();
308 org->fitness() = m_a * pow(f,2.0) + m_b * f + m_c;
323 template <
class OrganismType>
347 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
348 mean += org->fitness();
350 mean /=
static_cast<double>(a_population.size());
353 double variance = 0.0;
354 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
356 double diff = org->fitness() - mean;
357 variance += (diff * diff);
360 variance /=
static_cast<double>(a_population.size() - 1);
363 double sigma2 = 2.0 * sqrt(variance);
368 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
369 org->fitness() = 1.0;
373 for (
typename vector<OrganismType>::iterator org = a_population.begin(); org != a_population.end(); ++org)
376 org->fitness() = (1.0 + org->fitness() / mean) / sigma2;
379 if (org->fitness() < 0.1)
380 org->fitness() = 0.1;
A quadratic scaler.
Definition: scaler.h:284
virtual void scale_fitness(vector< OrganismType > &a_population)
Scaling function.
Definition: scaler.h:343
virtual ~scaler()
Virtual destructor.
Definition: scaler.h:71
An evolving organism.
Definition: organism.h:60
double & fitness()
Get fitness (read-write)
Definition: organism.h:179
virtual void scale_fitness(vector< OrganismType > &a_population)
Scaling function.
Definition: scaler.h:265
windowed_scaler()
Constructor.
Definition: scaler.h:211
linear_norm_scaler(double a_fitness_multiple=2.0)
Constructor.
Definition: scaler.h:134
quadratic_scaler(double a_a, double a_b, double a_c)
Constructor.
Definition: scaler.h:291
exponential_scaler(double a_a=1.0, double a_b=1.0, double a_power=2.0)
Constructor.
Definition: scaler.h:252
virtual void scale_fitness(vector< OrganismType > &a_population)
Scaling function.
Definition: scaler.h:302
Fitness scaling for a population.
Definition: scaler.h:60
virtual void scale_fitness(vector< OrganismType > &a_population)=0
Scale a population's fitness values.
sigma_scaler()
Constructor.
Definition: scaler.h:331
A toolkit and framework for implementing evolutionary algorithms.
Definition: evocommon.h:60
A linear normalization scaler.
Definition: scaler.h:127
virtual void scale_fitness(vector< OrganismType > &a_population)
Do-nothing scaling function.
Definition: scaler.h:114
virtual void scale_fitness(vector< OrganismType > &a_population)
Scaling function.
Definition: scaler.h:145
Elements shared by all classes in Evocosm.
Definition: evocommon.h:115
A sigma scaler.
Definition: scaler.h:324
An exponential fitness scaler.
Definition: scaler.h:241
virtual void scale_fitness(vector< OrganismType > &a_population)
Scaling function.
Definition: scaler.h:221
A do-nothing scaler.
Definition: scaler.h:106
void invert(vector< OrganismType > &a_population)
Invert a population's fitness values.
Definition: scaler.h:89
A windowed fitness scaler.
Definition: scaler.h:204