/**
* 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;