Init version
This commit is contained in:
189
DEC_GUI/DEC-0.0/population/BisexualPopulation.cpp
Normal file
189
DEC_GUI/DEC-0.0/population/BisexualPopulation.cpp
Normal file
@@ -0,0 +1,189 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user