Init version
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
#include "KolchShindyalBreedingStrategy.h"
|
||||
#include "../../../../processor/Settings.h"
|
||||
#include "../../../Phenotype.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
void KolchShindyalBreedingStrategy::breed(Population *_pop){
|
||||
// N = const
|
||||
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||||
AsexualPopulation* pop = dynamic_cast<AsexualPopulation*>(_pop);
|
||||
if(pop == NULL){
|
||||
std::cerr<<"Wrong dynamic cast to AsexualPopulation\n";
|
||||
return;
|
||||
}
|
||||
std::sort(pop->individs.begin(), pop->individs.end(), compareOnFitness);
|
||||
int inds = pop->individs.size();
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SelectionAll
|
||||
// <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float deathRate = 0.01f; //Settings::DeathRate
|
||||
int toDie = int (inds * deathRate);
|
||||
std::vector<Individual*>::iterator start = pop->individs.begin();
|
||||
std::vector<Individual*>::iterator end = pop->individs.begin()+toDie;
|
||||
//advance(end,toDie);
|
||||
for(std::vector<Individual*>::iterator it = start; it != end; it++){
|
||||
delete *it;
|
||||
}
|
||||
pop->individs.erase(start, end);
|
||||
|
||||
std::cout<<"PopulationBreedingStrategy::breed: "<<toDie<<" individs have died\n";
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float birthRate = Settings::BirthRate;//0.02f;
|
||||
int toBorn = int (inds * birthRate);
|
||||
inds = pop->individs.size();
|
||||
srand((unsigned int)time(NULL));
|
||||
for(int i = 0; i < toBorn; i++) {
|
||||
int male = rand() % inds;
|
||||
int female = rand() % inds;
|
||||
female = (female != male ? female : (female + 1) % inds);
|
||||
|
||||
Individual* ind = new Individual(*(pop->individs.at(male)), *(pop->individs.at(female)));
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> !!!
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20>.<2E>.
|
||||
pop->individs.push_back(ind);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "../../../../population/BreedingStrategies/PopulationBreedingStrategy.h"
|
||||
|
||||
class KolchShindyalBreedingStrategy : public PopulationBreedingStrategy {
|
||||
public:
|
||||
virtual void breed(Population* pop);
|
||||
};
|
||||
@@ -0,0 +1,63 @@
|
||||
#include "KolchShindyalGenotypeToPhenotypeStrategy.h"
|
||||
//#include "../GenotypeToPhenotypeStrategy.h"
|
||||
#include "../../../../processor/Settings.h"
|
||||
#include <cmath>
|
||||
|
||||
void KolchShindyalGenotypeToPhenotypeStrategy::calculatePhenotype(Individual* individ){
|
||||
Genotype* genotype = individ->genotype;
|
||||
Phenotype* phenotype = individ->phenotype;
|
||||
InnerSubstratesPool* substrates = individ->substrateCache;
|
||||
|
||||
// Chromosome 1
|
||||
Chromosome chr1F = individ->genotype->getFatherGenome().getChromosome(0);
|
||||
Chromosome chr1M = individ->genotype->getMotherGenome().getChromosome(0);
|
||||
|
||||
const std::vector<Gene>& genesF = chr1F.getGenesAsVector();
|
||||
const std::vector<Gene>& genesM = chr1M.getGenesAsVector();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float c1m = genesM.at(0).getGeneValueCont();
|
||||
float c2m = genesM.at(1).getGeneValueCont();
|
||||
float c3m = genesM.at(2).getGeneValueCont();
|
||||
float c4m = genesM.at(3).getGeneValueCont();
|
||||
float c5m = genesM.at(4).getGeneValueCont();
|
||||
float Em = genesM.at(5).getGeneValueCont();
|
||||
|
||||
float c1f = genesF.at(0).getGeneValueCont();
|
||||
float c2f = genesF.at(1).getGeneValueCont();
|
||||
float c3f = genesF.at(2).getGeneValueCont();
|
||||
float c4f = genesF.at(3).getGeneValueCont();
|
||||
float c5f = genesF.at(4).getGeneValueCont();
|
||||
float Ef = genesF.at(5).getGeneValueCont();
|
||||
|
||||
float X = 0;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/*
|
||||
// 1) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <09>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int feedBackM = genesM.at(6).getGeneValueDiscr();
|
||||
int feedBackF = genesF.at(6).getGeneValueDiscr();
|
||||
if( (feedBackF+feedBackM) != 0) {
|
||||
X = -c2/2 + sqrt( c2*c2/4 + c5*c2/c3*(E+c4));
|
||||
}
|
||||
else{
|
||||
X = c1/c3*(E+c4);
|
||||
}
|
||||
|
||||
// <09>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
int feedBackM = genesM.at(6).getGeneValueDiscr();
|
||||
int feedBackF = genesF.at(6).getGeneValueDiscr();
|
||||
if( (feedBackF+feedBackM) == 2) {
|
||||
X = -c2/2 + sqrt( c2*c2/4 + c5*c2/c3*(E+c4));
|
||||
}
|
||||
else{
|
||||
X = c1/c3*(E+c4);
|
||||
}
|
||||
|
||||
// 2) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
phenotype->traitsMap["X"].setTraitValue(X);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
#include "../GenotypeToPhenotypeStrategy.h"
|
||||
class KolchShindyalGenotypeToPhenotypeStrategy: public GenotypeToPhenotypeStrategy {
|
||||
public:
|
||||
virtual void calculatePhenotype(Individual*);
|
||||
};
|
||||
@@ -0,0 +1,16 @@
|
||||
#include "KolchShindyalPhenToFitnessStrategy.h"
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
#include <math.h>
|
||||
|
||||
|
||||
double KolchShindyalPhenToFitnessStrategy::calculateFitness(Phenotype *phen){
|
||||
|
||||
double X = phen->getTraitByName("X").getTraitValueCont();
|
||||
double Xopt = phen->getTraitByName("Xopt").getTraitValueCont();
|
||||
double sigmaX = phen->getTraitByName("sigmaX").getTraitValueCont();
|
||||
|
||||
double ans = 1/(sqrt(2*M_PI)) * exp(-0.5*pow((X-Xopt)/sigmaX,2.));
|
||||
|
||||
return ans;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#include "../PhenotypeToFitnessStrategy.h"
|
||||
#include "../../../Phenotype.h"
|
||||
|
||||
class KolchShindyalPhenToFitnessStrategy : public PhenotypeToFitnessStrategy {
|
||||
virtual double calculateFitness(Phenotype* phen);
|
||||
};
|
||||
Reference in New Issue
Block a user