Init version
This commit is contained in:
287
population/BisexualPopulation.cpp
Normal file
287
population/BisexualPopulation.cpp
Normal file
@@ -0,0 +1,287 @@
|
||||
#include "Population.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
BisexualPopulation::~BisexualPopulation(){
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
void BisexualPopulation::calculateFitnessAll(){
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
void BisexualPopulation::breedAll(){
|
||||
this->breedingStrategy->breed(this);
|
||||
}
|
||||
|
||||
void BisexualPopulation::selectionAll(){
|
||||
|
||||
}
|
||||
|
||||
void BisexualPopulation::mutationAll(){
|
||||
// !!! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
float mutProb = 1 / 1e+6f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::list<Individual*>::iterator it;
|
||||
for(it = this->females.begin(); it != this->females.end(); it++){
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2014
|
||||
Chromosome chrom = (*it)->genotype->getMotherGenome().getChromosome(0);
|
||||
std::vector<Gene> genes = chrom.getGenesAsVector();
|
||||
int wholeSeqLength = 0;
|
||||
for(unsigned int i = 0; i < genes.size(); i++){
|
||||
wholeSeqLength += genes.at(i).getSequence().size();
|
||||
}
|
||||
|
||||
//std::string seq = (*it)->genotype->getRawGene(0,0,0); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2013
|
||||
int positionToMutate = rand() % (int)(1/mutProb);
|
||||
if(positionToMutate < wholeSeqLength){
|
||||
std::string seq = genes.at(0).getSequence();
|
||||
int geneNum = positionToMutate / seq.size(); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2014
|
||||
positionToMutate = positionToMutate % seq.size(); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2014
|
||||
//Gene geneToMutate = genes.at(geneNum);
|
||||
int nucl = rand() % 3;
|
||||
switch(seq.c_str()[positionToMutate]){
|
||||
case 'A':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
break;
|
||||
case 'C':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"A");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
break;
|
||||
case 'G':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"A");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
break;
|
||||
case 'T':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"A");
|
||||
break;
|
||||
} // (END) switch(...)
|
||||
(*it)->genotype->doRawMutationSequence(2, 0, geneNum, seq);
|
||||
} // (END) if (mutate)
|
||||
} // (END) for
|
||||
|
||||
// !!! --------------------------------
|
||||
}
|
||||
|
||||
std::string BisexualPopulation::getSatistics(){
|
||||
std::string ans;
|
||||
return ans;
|
||||
}
|
||||
|
||||
void BisexualPopulation::putGeneticStatisticsToStream(std::ostream& out){
|
||||
out<<"Females\n=======\n";
|
||||
int i = 1;
|
||||
for(std::list<Individual*>::iterator it = females.begin(); it != females.end(); it++){
|
||||
|
||||
//out<<"> Female seq mitochondrial"<<(i++)<<"\n";
|
||||
out<<(*it)->getGenotype().toSimpleFasta()<<std::endl;
|
||||
out<<std::endl;
|
||||
}
|
||||
|
||||
out<<"\nMales\n=======\n";
|
||||
i = 1;
|
||||
for(std::list<Individual*>::iterator it = males.begin(); it != males.end(); it++){
|
||||
out<<"> Male seq "<<(i++)<<"\n";
|
||||
out<<(*it)->getGenotype().toSimpleFasta()<<std::endl;
|
||||
out<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void BisexualPopulation::putGeneticSimpleStatisticsToStream(std::ostream& out){
|
||||
out<<"Population statistics:\tMales =\t"<<males.size();
|
||||
out<<"\tFemales =\t"<<females.size()<<std::endl;
|
||||
//out<<"Genome statistics (mitochondrial DNA sequence):\n\n";
|
||||
}
|
||||
|
||||
void BisexualPopulation::putGeneticMaxModuleStatisticsToStream(std::ostream& out){
|
||||
|
||||
}
|
||||
|
||||
std::string BisexualPopulation::mutualMigration(BisexualPopulation* p1, BisexualPopulation* p2, float frac1, float frac2){
|
||||
std::stringstream ss;
|
||||
|
||||
int sizeP1 = p1->males.size() + p1->females.size();
|
||||
int sizeP2 = p2->males.size() + p2->females.size();
|
||||
|
||||
int indsP1toP2 = (int) (frac1*sizeP1)/2;
|
||||
int indsP2toP1 = (int) (frac2*sizeP2)/2;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::list<Individual*> malesTemp;
|
||||
std::list<Individual*> femalesTemp;
|
||||
|
||||
// P1 -> temp
|
||||
// males
|
||||
std::list<Individual*>::iterator it1 = p1->males.begin();
|
||||
std::list<Individual*>::iterator it2 = it1;
|
||||
std::advance(it2, indsP1toP2);
|
||||
malesTemp.splice(malesTemp.begin(), p1->males, it1, it2);
|
||||
|
||||
// females
|
||||
it1 = p1->females.begin();
|
||||
it2 = it1;
|
||||
std::advance(it2, indsP1toP2);
|
||||
femalesTemp.splice(femalesTemp.begin(), p1->females, it1, it2);
|
||||
/////////////////////////////////////////////////////////////
|
||||
|
||||
// P2 -> P1
|
||||
// males
|
||||
it1 = p2->males.begin();
|
||||
it2 = it1;
|
||||
std::advance(it2, indsP2toP1);
|
||||
p1->males.splice(p1->males.end(), p2->males, it1, it2);
|
||||
|
||||
// females
|
||||
it1 = p2->females.begin();
|
||||
it2 = it1;
|
||||
std::advance(it2, indsP2toP1);
|
||||
p1->females.splice(p1->females.end(), p2->females, it1, it2);
|
||||
/////////////////////////////////////////////////////////////
|
||||
|
||||
// temp -> P2
|
||||
// males
|
||||
p2->males.splice(p2->males.end(), malesTemp);
|
||||
|
||||
// females
|
||||
p2->females.splice(p2->females.end(), femalesTemp);
|
||||
|
||||
ss<<"Migration:\tP1->P2\t"<<indsP1toP2*2<<"\t\tP2->P1\t"<<indsP2toP1*2<<std::endl;
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
BisexualPopulation* BisexualPopulation::createSubpopulation(float frac){
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
int malesFounders = (int) (frac*this->males.size());
|
||||
int femalesFounders = (int) (frac*this->females.size());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::list<Individual*> malesTemp;
|
||||
std::list<Individual*> femalesTemp;
|
||||
|
||||
// P1 -> temp
|
||||
// males
|
||||
std::list<Individual*>::iterator it1 = this->males.begin();
|
||||
std::list<Individual*>::iterator it2 = it1;
|
||||
std::advance(it2, malesFounders);
|
||||
malesTemp.splice(malesTemp.begin(), this->males, it1, it2);
|
||||
|
||||
// females
|
||||
it1 = this->females.begin();
|
||||
it2 = it1;
|
||||
std::advance(it2, femalesFounders);
|
||||
femalesTemp.splice(femalesTemp.begin(), this->females, it1, it2);
|
||||
/////////////////////////////////////////////////////////////
|
||||
|
||||
return new BisexualPopulation(malesTemp,femalesTemp, this->breedingStrategy);
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
void BisexualPopulation::mutationDerevyanko2015(double pMutMtDNA, double pMutNumt){
|
||||
// !!! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
//float mutProb = 1 / 1e+6f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::list<Individual*>::iterator it;
|
||||
for(it = this->females.begin(); it != this->females.end(); it++){
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2015
|
||||
Chromosome chrom = (*it)->genotype->getMotherGenome().getChromosome(0);
|
||||
Chromosome chromNumt = (*it)->genotype->getMotherGenome().getChromosome(1);
|
||||
std::vector<Gene> genes = chrom.getGenesAsVector();
|
||||
int wholeSeqLength = 0;
|
||||
for(unsigned int i = 0; i < genes.size(); i++){
|
||||
wholeSeqLength += genes.at(i).getSequence().size();
|
||||
}
|
||||
|
||||
int positionToMutate = rand() % (int)(1/pMutMtDNA);
|
||||
if(positionToMutate < wholeSeqLength){
|
||||
std::string seq = genes.at(0).getSequence();
|
||||
int geneNum = positionToMutate / seq.size(); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2015
|
||||
positionToMutate = positionToMutate % seq.size(); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2015
|
||||
//Gene geneToMutate = genes.at(geneNum);
|
||||
int nucl = rand() % 3;
|
||||
switch(seq.c_str()[positionToMutate]){
|
||||
case 'A':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
break;
|
||||
case 'C':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"A");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
break;
|
||||
case 'G':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"A");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
break;
|
||||
case 'T':
|
||||
if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
if(nucl == 2) seq.replace(positionToMutate,1,"A");
|
||||
break;
|
||||
} // (END) switch(...)
|
||||
(*it)->genotype->doRawMutationSequence(2, 0, geneNum, seq);
|
||||
} // (END) if (mutate)
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
//std::vector<Gene> genes = chromNumt.getGenesAsVector();
|
||||
//int wholeSeqLength = 0;
|
||||
//for(unsigned int i = 0; i < genes.size(); i++){
|
||||
// wholeSeqLength += genes.at(i).getSequence().size();
|
||||
//}
|
||||
|
||||
//int positionToMutate = rand() % (int)(1/pMutNumt);
|
||||
//if(positionToMutate < wholeSeqLength){
|
||||
// std::string seq = genes.at(0).getSequence();
|
||||
// int geneNum = positionToMutate / seq.size(); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2015
|
||||
// positionToMutate = positionToMutate % seq.size(); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2015
|
||||
// //Gene geneToMutate = genes.at(geneNum);
|
||||
// int nucl = rand() % 3;
|
||||
// switch(seq.c_str()[positionToMutate]){
|
||||
// case 'A':
|
||||
// if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
// if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
// if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
// break;
|
||||
// case 'C':
|
||||
// if(nucl == 0) seq.replace(positionToMutate,1,"A");
|
||||
// if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
// if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
// break;
|
||||
// case 'G':
|
||||
// if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
// if(nucl == 1) seq.replace(positionToMutate,1,"A");
|
||||
// if(nucl == 2) seq.replace(positionToMutate,1,"T");
|
||||
// break;
|
||||
// case 'T':
|
||||
// if(nucl == 0) seq.replace(positionToMutate,1,"C");
|
||||
// if(nucl == 1) seq.replace(positionToMutate,1,"G");
|
||||
// if(nucl == 2) seq.replace(positionToMutate,1,"A");
|
||||
// break;
|
||||
// } // (END) switch(...)
|
||||
// (*it)->genotype->doRawMutationSequence(2, 0, geneNum, seq);
|
||||
//} // (END) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
} // (END) for
|
||||
|
||||
// !!! --------------------------------
|
||||
|
||||
}
|
||||
99
population/BreedingStrategies/NeutralEvolutionBreedStrat.cpp
Normal file
99
population/BreedingStrategies/NeutralEvolutionBreedStrat.cpp
Normal file
@@ -0,0 +1,99 @@
|
||||
#include "NeutralEvolutionBreedStrat.h"
|
||||
#include "../../individual/Phenotype.h"
|
||||
#include "../../processor/Settings.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
void NeutralEvolutionBreedingStrategy::breed(Population* _pop){
|
||||
|
||||
BisexualPopulation* pop = dynamic_cast<BisexualPopulation*>(_pop);
|
||||
if(pop == NULL){
|
||||
std::cerr<<"Wrong dynamic cast to BisexualPopulation\n";
|
||||
return;
|
||||
}
|
||||
|
||||
int numMales = pop->males.size();
|
||||
int numFemales = pop->females.size();
|
||||
int inds = numMales + numFemales;
|
||||
|
||||
srand((unsigned int)time(NULL));
|
||||
//srand(0);
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int toDie = int (inds * deathRate);
|
||||
for(int i = 0; i < toDie; i++){
|
||||
int indToDie = rand() % (inds-i);
|
||||
if(indToDie < numMales){
|
||||
std::list<Individual*>::iterator it = pop->males.begin();
|
||||
std::advance(it,indToDie); // it += indToDie;
|
||||
delete *it;
|
||||
pop->males.erase(it);
|
||||
numMales--;
|
||||
}
|
||||
else{
|
||||
std::list<Individual*>::iterator it = pop->females.begin();
|
||||
std::advance(it,indToDie-numMales); // it += indToDie;
|
||||
delete *it;
|
||||
pop->females.erase(it);
|
||||
numFemales--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//std::cout<<"PopulationBreedingStrategy::breed: "<<toDie<<" individs have died\n";
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int toBorn = int (inds * birthRate);
|
||||
numMales = pop->males.size();
|
||||
numFemales = pop->females.size();
|
||||
inds = numMales + numFemales;
|
||||
|
||||
for(int i = 0; i < toBorn; i++) {
|
||||
int fatherNum = rand() % numMales;
|
||||
int motherNum = rand() % numFemales;
|
||||
int gender = rand() % 2;
|
||||
|
||||
std::list<Individual*>::iterator itFather = pop->males.begin();
|
||||
std::advance(itFather, fatherNum);
|
||||
std::list<Individual*>::iterator itMother = pop->females.begin();
|
||||
std::advance(itMother, motherNum);
|
||||
|
||||
Genotype* genotype;
|
||||
|
||||
double prob = Settings::ProbMtDNARecomb;
|
||||
if(prob > 0.0){
|
||||
int invProb = (int)(1/prob);
|
||||
int recombine = rand() % invProb;
|
||||
if(recombine == 0){
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//std::cerr<<"Recomb\n";
|
||||
ChromosomeRearrangementStrategy* recombinator = RecombinationStrategies::getInstance("D2015");
|
||||
HaploidGenotype recombGenotype = recombinator->buildRecombinantGenotype(
|
||||
(*itFather)->getGenotype().getMotherGenome(), (*itMother)->getGenotype().getMotherGenome());
|
||||
genotype = new Genotype(recombGenotype, recombGenotype);
|
||||
}
|
||||
else{
|
||||
genotype = new Genotype(
|
||||
(*itMother)->getGenotype().getMotherGenome(), (*itMother)->getGenotype().getMotherGenome());
|
||||
}
|
||||
}
|
||||
else{
|
||||
genotype = new Genotype(
|
||||
(*itMother)->getGenotype().getMotherGenome(), (*itMother)->getGenotype().getMotherGenome());
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
|
||||
Phenotype* phenotype= new Phenotype((*itFather)->getPhenotype());
|
||||
|
||||
Individual* ind = new Individual(genotype, phenotype, 0, Individual::Gender(gender));
|
||||
// <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>.
|
||||
if(gender == 0){
|
||||
pop->males.push_back(ind);
|
||||
}
|
||||
else{
|
||||
pop->females.push_back(ind);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
12
population/BreedingStrategies/NeutralEvolutionBreedStrat.h
Normal file
12
population/BreedingStrategies/NeutralEvolutionBreedStrat.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
#include "PopulationBreedingStrategy.h"
|
||||
|
||||
class NeutralEvolutionBreedingStrategy : public PopulationBreedingStrategy {
|
||||
float birthRate;
|
||||
float deathRate;
|
||||
public:
|
||||
void setBirthRate(float b) {birthRate = b;}
|
||||
void setDeathRate(float d) {deathRate = d;}
|
||||
|
||||
virtual void breed(Population* pop);
|
||||
};
|
||||
81
population/BreedingStrategies/PopulationBreedingStrategy.cpp
Normal file
81
population/BreedingStrategies/PopulationBreedingStrategy.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "PopulationBreedingStrategy.h"
|
||||
#include "VerhulstBreedingStrategy.h"
|
||||
#include "NeutralEvolutionBreedStrat.h"
|
||||
#include "../../individual/genome/strategies/InOutBreeding/InOutBreedingPopulationBreedingStrategy.h"
|
||||
#include "../../individual/genome/strategies/KolchShindyal/KolchShindyalBreedingStrategy.h"
|
||||
|
||||
#include "../../processor/Settings.h"
|
||||
//#include <vector>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
void PopulationBreedingStrategy::breed(Population* _pop){
|
||||
float deathRate = Settings::NaturalDeathRate;//0.01f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <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>
|
||||
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> <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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
std::map<std::string, PopulationBreedingStrategy*> PopulationBreedingStrategy::_strategies;
|
||||
|
||||
PopulationBreedingStrategy* PopulationBreedingStrategy::getInstance(std::string _name){
|
||||
if(_strategies.find(_name) == _strategies.end()){
|
||||
PopulationBreedingStrategy* s = 0;
|
||||
if(_name.compare("Verhulst") == 0){
|
||||
s = new VerhulstBreedingStrategy();
|
||||
}
|
||||
else if(_name.compare("inoutbreeding") == 0){
|
||||
s = new InOutBreedingPopulationBreedingStrategy();
|
||||
}
|
||||
else if(_name.compare("kolchan_shindyal_breeding") == 0){
|
||||
s = new KolchShindyalBreedingStrategy();
|
||||
}
|
||||
else if(_name.compare("neutral") == 0){
|
||||
s = new NeutralEvolutionBreedingStrategy();
|
||||
}
|
||||
else {
|
||||
s = new PopulationBreedingStrategy();
|
||||
}
|
||||
_strategies[_name] = s;
|
||||
}
|
||||
|
||||
return _strategies[_name];
|
||||
}
|
||||
12
population/BreedingStrategies/PopulationBreedingStrategy.h
Normal file
12
population/BreedingStrategies/PopulationBreedingStrategy.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
#include "../Population.h"
|
||||
#include <map>
|
||||
|
||||
class Population;
|
||||
|
||||
class PopulationBreedingStrategy {
|
||||
static std::map<std::string, PopulationBreedingStrategy*> _strategies;
|
||||
public:
|
||||
virtual void breed(Population* pop);
|
||||
static PopulationBreedingStrategy* getInstance(std::string name);
|
||||
};
|
||||
52
population/BreedingStrategies/VerhulstBreedingStrategy.cpp
Normal file
52
population/BreedingStrategies/VerhulstBreedingStrategy.cpp
Normal file
@@ -0,0 +1,52 @@
|
||||
#include "VerhulstBreedingStrategy.h"
|
||||
#include "../../processor/Settings.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
void VerhulstBreedingStrategy::breed(Population *_pop) {
|
||||
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// rX * (1 - X/K) = rX - (r/K)X^2
|
||||
|
||||
double birthRate = Settings::BirthRate;// 0.03;
|
||||
double r = 1 + birthRate;
|
||||
double K = _pop->region->getCapacity();
|
||||
|
||||
AsexualPopulation* pop = dynamic_cast<AsexualPopulation*>(_pop);
|
||||
if(pop == NULL){
|
||||
std::cerr<<"Wrong dynamic cast to AsexualPopulation\n";
|
||||
return;
|
||||
}
|
||||
|
||||
long int inds = pop->individs.size();
|
||||
long int toDie = long int (inds*inds * r/K + 0.5); // 0.5 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
long int toBorn = long int (inds*birthRate + 0.5); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||||
std::sort(pop->individs.begin(), pop->individs.end(), compareOnFitness);
|
||||
std::vector<Individual*>::iterator start = pop->individs.begin();
|
||||
std::vector<Individual*>::iterator end = pop->individs.begin()+toDie;
|
||||
for(std::vector<Individual*>::iterator it = start; it != end; it++){
|
||||
delete *it;
|
||||
}
|
||||
pop->individs.erase(start, end);
|
||||
std::cout<<"VerhulstBreedingStrategy::breed: "<<toDie<<" individs have died\n";
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
inds = pop->individs.size();
|
||||
srand((unsigned int)time(NULL));
|
||||
for(long 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> <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);
|
||||
}
|
||||
|
||||
}
|
||||
7
population/BreedingStrategies/VerhulstBreedingStrategy.h
Normal file
7
population/BreedingStrategies/VerhulstBreedingStrategy.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#include "PopulationBreedingStrategy.h"
|
||||
|
||||
class VerhulstBreedingStrategy : public PopulationBreedingStrategy {
|
||||
public:
|
||||
virtual void breed(Population* pop);
|
||||
};
|
||||
159
population/Population.cpp
Normal file
159
population/Population.cpp
Normal file
@@ -0,0 +1,159 @@
|
||||
#include "Population.h"
|
||||
#include "../individual/Phenotype.h"
|
||||
#include <cstdlib>
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
|
||||
AsexualPopulation::~AsexualPopulation(){
|
||||
// TODO : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
}
|
||||
AsexualPopulation::AsexualPopulation(int size, PopulationBreedingStrategy* _strategy) :
|
||||
Population(_strategy), individs(size/*, 0*/)
|
||||
{
|
||||
|
||||
srand(0);
|
||||
int RANGE = 1000;
|
||||
float gValue;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for(int i = 0; i < size; i++){
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<Chromosome> fGenome;
|
||||
std::vector<Chromosome> mGenome;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
gValue = (rand()%RANGE + 1) / (float) RANGE;
|
||||
Gene geneF1(Gene::Continious, "X", gValue);
|
||||
gValue = (rand()%RANGE + 1) / (float) RANGE;
|
||||
Gene geneF2(Gene::Continious, "Y", gValue);
|
||||
gValue = (rand()%RANGE + 1) / (float) RANGE;
|
||||
Gene geneF3(Gene::Continious, "Z", gValue);
|
||||
|
||||
Chromosome chromF("Chrom 1"); // <20><><EFBFBD><EFBFBD>
|
||||
chromF.insertGeneToEnd(geneF1);
|
||||
chromF.insertGeneToEnd(geneF2);
|
||||
chromF.insertGeneToEnd(geneF3);
|
||||
|
||||
|
||||
gValue = (rand()%RANGE + 1) / (float) RANGE;
|
||||
Gene geneM1(Gene::Continious, "X", gValue);
|
||||
gValue = (rand()%RANGE + 1) / (float) RANGE;
|
||||
Gene geneM2(Gene::Continious, "Y", gValue);
|
||||
gValue = (rand()%RANGE + 1) / (float) RANGE;
|
||||
Gene geneM3(Gene::Continious, "Z", gValue);
|
||||
|
||||
Chromosome chromM("Chrom 1"); // <20><><EFBFBD><EFBFBD>
|
||||
chromM.insertGeneToEnd(geneM1);
|
||||
chromM.insertGeneToEnd(geneM2);
|
||||
chromM.insertGeneToEnd(geneM3);
|
||||
|
||||
fGenome.push_back(chromF);
|
||||
mGenome.push_back(chromM);
|
||||
Genotype* genotype = new Genotype(fGenome, mGenome);
|
||||
// (END) <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Trait trait1(Trait::Continious, "X", 0.0f);
|
||||
Trait trait2(Trait::Continious, "Y", 0.0f);
|
||||
Trait trait3(Trait::Continious, "Z", 0.0f);
|
||||
Phenotype* phenotype = new Phenotype(trait1);
|
||||
phenotype->addTrait(trait2);
|
||||
phenotype->addTrait(trait3);
|
||||
// (END) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
InnerSubstratesPool* subPool = 0;
|
||||
// (END) <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
this->individs.at(i) = new Individual(genotype, phenotype, subPool, Individual::hermaphrodite, 0);
|
||||
} // (END) for(int i = 0; i < size; i++)
|
||||
}
|
||||
|
||||
void AsexualPopulation::calculateFitnessAll(){
|
||||
for(unsigned int i = 0; i < this->individs.size(); i++){
|
||||
this->individs.at(i)->calculateFitness();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AsexualPopulation::breedAll(){
|
||||
this->breedingStrategy->breed(this);
|
||||
}
|
||||
|
||||
void AsexualPopulation::selectionAll(){
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> breedAll
|
||||
}
|
||||
|
||||
void AsexualPopulation::mutationAll(){
|
||||
|
||||
}
|
||||
|
||||
void AsexualPopulation::setRegion(Region *_region){
|
||||
this->region = _region;
|
||||
for(unsigned int i = 0; i < this->individs.size(); i++){
|
||||
this->individs.at(i)->setRegion(_region);
|
||||
}
|
||||
}
|
||||
|
||||
std::string AsexualPopulation::getSatistics(){
|
||||
std::stringstream ans;
|
||||
long int pSize = this->individs.size();
|
||||
ans<<"Population size\t"<<pSize<<"\t";
|
||||
|
||||
//////////////////////////
|
||||
double totalFitness = 0.0;
|
||||
double best = 0.0;
|
||||
double worst= 1000.0;
|
||||
for(int i = 0; i < pSize; i++){
|
||||
double fitness = this->individs.at(i)->getFitness();
|
||||
best = fitness > best ? fitness : best;
|
||||
worst= fitness < worst? fitness : worst;
|
||||
totalFitness += fitness;
|
||||
}
|
||||
ans<<"Average fitness\t"<<(totalFitness/pSize);
|
||||
ans<<"\tBest\t"<<(best);
|
||||
ans<<"\tWorst\t"<<(worst);
|
||||
return ans.str();
|
||||
}
|
||||
|
||||
void AsexualPopulation::putGeneticStatisticsToStream(std::ostream &out){
|
||||
|
||||
out<<"Population size:\t"<<this->individs.size()<<std::endl;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//sort(this->individs.begin(),this->individs.end());
|
||||
|
||||
for(unsigned int i = 0; i < this->individs.size(); i++){
|
||||
out<<(i+1)<<"\t";
|
||||
out<<"Fitness:\t"<<(this->individs.at(i)->getFitness());
|
||||
out<<"\t";
|
||||
out<<"Genotype:\t"<<(this->individs.at(i)->getGenotype());
|
||||
out<<"\t";
|
||||
out<<"Phenotype:\t"<<(this->individs.at(i)->getPhenotype());
|
||||
out<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void AsexualPopulation::putGeneticSimpleStatisticsToStream(std::ostream &out){
|
||||
for(unsigned int i = 0; i < this->individs.size(); i++){
|
||||
out<<(i+1)<<"\t"<<(this->individs.at(i)->getFitness());
|
||||
out<<"\t"<<(this->individs.at(i)->getGenotype().toSimpleString());
|
||||
//out<<"\t";
|
||||
out<<(this->individs.at(i)->getPhenotype().toSimpleString());
|
||||
out<<std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void AsexualPopulation::putGeneticMaxModuleStatisticsToStream(std::ostream &out){
|
||||
for(unsigned int i = 0; i < this->individs.size(); i++){
|
||||
out<<(i+1)<<"\t"<<(this->individs.at(i)->getFitness());
|
||||
out<<"\t"<<(this->individs.at(i)->getGenotype().toMaxModuleAB());
|
||||
//out<<"\t";
|
||||
//out<<(this->individs.at(i)->getPhenotype().toSimpleString());
|
||||
out<<std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
84
population/Population.h
Normal file
84
population/Population.h
Normal file
@@ -0,0 +1,84 @@
|
||||
#pragma once
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include "../individual/AbstractIndividual.h"
|
||||
#include "BreedingStrategies/PopulationBreedingStrategy.h"
|
||||
#include "../environment/AbstractEnvironment.h"
|
||||
|
||||
class PopulationBreedingStrategy;
|
||||
|
||||
class Population {
|
||||
friend class PopulationBreedingStrategy;
|
||||
friend class VerhulstBreedingStrategy;
|
||||
protected:
|
||||
PopulationBreedingStrategy* breedingStrategy;
|
||||
Region* region;
|
||||
public:
|
||||
Population(PopulationBreedingStrategy* _strategy) : breedingStrategy(_strategy){}
|
||||
virtual ~Population() {};
|
||||
virtual void setBreedingStrategy(PopulationBreedingStrategy* _strategy) { breedingStrategy = _strategy;}
|
||||
virtual void setRegion(Region* _region) { region = _region;}
|
||||
virtual void calculateFitnessAll() = 0;
|
||||
virtual void breedAll() = 0;
|
||||
virtual void selectionAll() = 0;
|
||||
virtual void mutationAll() = 0;
|
||||
virtual std::string getSatistics() = 0;
|
||||
virtual void putGeneticStatisticsToStream(std::ostream& out) = 0;
|
||||
virtual void putGeneticSimpleStatisticsToStream(std::ostream& out) = 0;
|
||||
virtual void putGeneticMaxModuleStatisticsToStream(std::ostream& out) = 0;
|
||||
};
|
||||
|
||||
class AsexualPopulation : public Population {
|
||||
friend class PopulationBreedingStrategy;
|
||||
friend class VerhulstBreedingStrategy;
|
||||
friend class InOutBreedingPopulationBreedingStrategy;
|
||||
friend class KolchShindyalBreedingStrategy;
|
||||
protected:
|
||||
std::vector<Individual*> individs;
|
||||
|
||||
public:
|
||||
AsexualPopulation(const std::vector<Individual*>& _inds, PopulationBreedingStrategy* _strategy = 0) : Population(_strategy), individs(_inds) {};
|
||||
AsexualPopulation(int size, PopulationBreedingStrategy* _strategy = 0);
|
||||
virtual ~AsexualPopulation();
|
||||
|
||||
virtual void setRegion(Region* _region);
|
||||
virtual void calculateFitnessAll();
|
||||
virtual void breedAll();
|
||||
virtual void selectionAll();
|
||||
virtual void mutationAll();
|
||||
virtual std::string getSatistics();
|
||||
virtual void putGeneticStatisticsToStream(std::ostream& out);
|
||||
virtual void putGeneticSimpleStatisticsToStream(std::ostream& out);
|
||||
virtual void putGeneticMaxModuleStatisticsToStream(std::ostream& out);
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////
|
||||
//////////////////////////////////////////////
|
||||
//////////////////////////////////////////////
|
||||
class BisexualPopulation : public Population {
|
||||
friend class NeutralEvolutionBreedingStrategy;
|
||||
protected:
|
||||
std::list<Individual*> males;
|
||||
std::list<Individual*> females;
|
||||
public:
|
||||
BisexualPopulation(const std::list<Individual*>& _males,
|
||||
const std::list<Individual*>& _females, PopulationBreedingStrategy* _strategy = 0) :
|
||||
Population(_strategy), males(_males), females(_females) {}
|
||||
|
||||
virtual ~BisexualPopulation();
|
||||
|
||||
//virtual void setRegion(Region* _region);
|
||||
virtual void calculateFitnessAll();
|
||||
virtual void breedAll();
|
||||
virtual void selectionAll();
|
||||
virtual void mutationAll();
|
||||
virtual std::string getSatistics();
|
||||
virtual void putGeneticStatisticsToStream(std::ostream& out);
|
||||
virtual void putGeneticSimpleStatisticsToStream(std::ostream& out);
|
||||
virtual void putGeneticMaxModuleStatisticsToStream(std::ostream& out);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static std::string mutualMigration(BisexualPopulation* p1, BisexualPopulation* p2, float frac1, float frac2 = -1.f);
|
||||
BisexualPopulation* createSubpopulation(float frac);
|
||||
void mutationDerevyanko2015(double pMutMtDNA, double pMutNumt);
|
||||
};
|
||||
Reference in New Issue
Block a user