Init version
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
#include "InOutBreedingPopulationBreedingStrategy.h"
|
||||
#include "../../../../processor/Settings.h"
|
||||
#include "../../../Phenotype.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
void InOutBreedingPopulationBreedingStrategy::breed(Population *_pop){
|
||||
// N = const
|
||||
|
||||
AsexualPopulation* pop = dynamic_cast<AsexualPopulation*>(_pop);
|
||||
if(pop == NULL){
|
||||
std::cerr<<"Wrong dynamic cast to AsexualPopulation\n";
|
||||
return;
|
||||
}
|
||||
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
int offsprings = Settings::OffspringsMean;
|
||||
std::vector<Individual*> newIndivids;
|
||||
|
||||
long int inds;
|
||||
for(inds = pop->individs.size();inds >=2; inds -= 2){
|
||||
int motherIndex = rand()%inds;
|
||||
int fatherIndex = rand()%inds;
|
||||
if(fatherIndex == motherIndex){
|
||||
fatherIndex = (fatherIndex+1)%inds;
|
||||
}
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for(int i = 0; i < offsprings; i++){
|
||||
Individual* ind = new Individual(*(pop->individs.at(motherIndex)), *(pop->individs.at(fatherIndex)));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ind->calculatePhenotype();
|
||||
Phenotype phen = ind->getPhenotype();
|
||||
float coadapt = phen.getTraitByName("coadaptive").getTraitValueCont();
|
||||
float disease = phen.getTraitByName("disease").getTraitValueCont();
|
||||
|
||||
if(disease > Settings::DiseaseThreshold){ // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float probSurvive = 1.f;
|
||||
if(coadapt < Settings::CoadaptiveThreshold){ // TODO: <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
probSurvive = Settings::CoadaptiveMinimumP;
|
||||
}
|
||||
else{
|
||||
probSurvive = (1-Settings::CoadaptiveMinimumP)/(Settings::CoadaptiveMaximumTrait-Settings::CoadaptiveThreshold);
|
||||
probSurvive *= coadapt - Settings::CoadaptiveMaximumTrait;
|
||||
probSurvive += 1;
|
||||
}
|
||||
int order = 1000;
|
||||
int prob = rand()%order;
|
||||
if(prob < order*probSurvive){
|
||||
// <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>.
|
||||
newIndivids.push_back(ind);
|
||||
}
|
||||
}
|
||||
} // (END) for(int i = 0; i < offsprings; i++)
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
delete pop->individs.at(motherIndex);
|
||||
delete pop->individs.at(fatherIndex);
|
||||
if(motherIndex > fatherIndex){
|
||||
pop->individs.erase(pop->individs.begin()+motherIndex);
|
||||
pop->individs.erase(pop->individs.begin()+fatherIndex);
|
||||
}
|
||||
else{
|
||||
pop->individs.erase(pop->individs.begin()+fatherIndex);
|
||||
pop->individs.erase(pop->individs.begin()+motherIndex);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(newIndivids.size() >= Settings::KMaxParameter){
|
||||
for(unsigned int i = 0; i < pop->individs.size(); i++){
|
||||
delete pop->individs.at(i);
|
||||
}
|
||||
pop->individs.clear();
|
||||
break;
|
||||
}
|
||||
} // (END) for(inds = pop->individs.size();inds >=2; inds -= 2)
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
pop->individs.insert(pop->individs.begin(), newIndivids.begin(), newIndivids.end());
|
||||
}
|
||||
Reference in New Issue
Block a user