/**
* Genetic Algorithm itself
*/
- template < typename _Chromosome, typename _Selection, typename _Crossover, typename _Mutation >
+ template < typename _Chromosome, typename _Selection, typename _Crossover, typename _Mutation, typename _Fitness = Fitness<_Chromosome, typename _Selection::FitnessValueType > >
class Algorithm {
public:
/**
* It is a reference, because Fitness is purely virtual class and we
* can't have instance of it. It must be one of derived classes.
*/
- Fitness<_Chromosome, FitnessValueType>& fitness;
+ _Fitness& fitness;
/**
* Crossover function
*/
Algorithm(
generator::Generation<_Chromosome>& _generator,
- Fitness<_Chromosome, FitnessValueType>& _fitness,
+ _Fitness& _fitness,
double crossoverChance,
double mutationChance) :
generator(_generator),
/**
* Displays average fitness value of the entire generation.
- * @todo make it more generic
*/
void showAvgFitness() {
double avg = 0;
for (unsigned int i = 0; i < this->generation.get().size(); i++) {
- WSTI<_Chromosome, FitnessValueType> fit(this->generation.get()[i], 0.5, 2.5);
+ _Fitness fit(this->generation.get()[i]);
+ fit.parseArguments(fitness.getArguments());
avg += fit.calculate();
}
cout << " " << avg / this->generation.get().size();
/**
* Displays best fitness value of the entire generation.
- * @todo make it more generic, currently has hardcoded WSTI Fitness
- * class, due its additional arguments
*/
void showBestFitness() {
double best = -100000;
for (unsigned int i = 0; i < this->generation.get().size(); i++) {
- WSTI<_Chromosome, FitnessValueType> fit(this->generation.get()[i], 0.5, 2.5);
+ _Fitness fit(this->generation.get()[i]);
+ fit.parseArguments(fitness.getArguments());
+
double tmp = fit.calculate();
if (tmp > best) {
best = tmp;
#ifndef __FITNESS_FITNESS_H
#define __FITNESS_FITNESS_H
+#include <map>
+#include <string>
+
#include "chromosome.h"
namespace genetic {
_Value calculate() {
return this->do_calculate();
}
+
+ /**
+ * Method used to pass additional arguments needed by the function to
+ * run correctly.
+ */
+ virtual void parseArguments(std::map<string, string>) { }
+
+ /**
+ * Method used to get additional arguments needed by the function to
+ * run correctly
+ *
+ * @return map containing additional arguments, empty if do not use any
+ */
+ virtual std::map<string, string> getArguments() {
+ return std::map<string, string>();
+ }
};
}
}
public:
/**
- * Class constructor. Initializes class with requied values.
+ * Class constructor. Initializes class with required values.
+ *
+ * @param _chromosome Chromosome, for which value will be calculated
+ */
+ WSTI(_Chromosome& _chromosome)
+ : Fitness<_Chromosome>(_chromosome) {
+ }
+
+ /**
+ * Class constructor. Initializes class with required values.
*
* @param start begining of the Fitness function domain
* @param end end of the Fitness function domain
}
/**
- * Class constructor. Initializes class with requied values.
+ * Class constructor. Initializes class with required values.
*
* @param _chromosome Chromosome, for which value will be calculated
* @param start begining of the Fitness function domain
WSTI(_Chromosome& _chromosome, float start, float end)
: Fitness<_Chromosome>(_chromosome), span_start(start), span_end(end) {
}
+
+ /**
+ * Method used to pass additional arguments needed by the function to
+ * run correctly.
+ * Required map keys are:
+ * - _span_start_ - with value equal to begining of the Fitness function domain
+ * - _span_end_ - with value equal to end of the Fitness function domain
+ * Their values should be floats.
+ *
+ * @param args map containing span_start and span_end as a keys and
+ * their values (_double_) passed as strings
+ */
+ virtual void parseArguments(std::map<string, string> args) {
+ std::map<string, string>::iterator it;
+ for (it = args.begin(); it != args.end(); it++) {
+ if (it->first == "span_start") {
+ this->span_start = std::stod(it->second);
+ }
+ else if (it->first == "span_end") {
+ this->span_end = std::stod(it->second);
+ }
+ }
+ }
+
+ /**
+ * Method used to get additional arguments needed by the function to
+ * run correctly.
+ *
+ * @return map containing span_start and span_end as a map keys, with
+ * their values passed as string
+ */
+ std::map<string, string> getArguments() {
+ std::map<string, string> fit_args;
+ fit_args.insert(std::pair<string, string>("span_start", std::to_string(span_start)));
+ fit_args.insert(std::pair<string, string>("span_end", std::to_string(span_end)));
+ return fit_args;
+ }
};
}
#include <iostream>
#include <vector>
+#include <map>
+#include <string>
#include "gene.h"
#include "chromosome.h"
typedef Mutation<_Chromosome> _Mutation;
typedef generator::Generation<_Chromosome> _Generator;
- typedef Algorithm<_Chromosome, _Selection, _Crossover, _Mutation> _Algorithm;
+ typedef Algorithm<_Chromosome, _Selection, _Crossover, _Mutation, _Fitness> _Algorithm;
typedef Condition<_Chromosome> _Condition;
const int chromosomeSize = 10;