#include "Population.h" #include #include #include #include #include BisexualPopulation::~BisexualPopulation(){ // Тут удалить нафиг всех особей } void BisexualPopulation::calculateFitnessAll(){ // Вызов стратегии фитнесса для всех } void BisexualPopulation::breedAll(){ this->breedingStrategy->breed(this); } void BisexualPopulation::selectionAll(){ } void BisexualPopulation::mutationAll(){ // !!! Времянка для отчёта по Деревянко srand((unsigned int)time(NULL)); float mutProb = 1 / 1e+6f; // Вероятность мутации - на нуклеотид на поколение // Тут смысл мутировать только женщин std::list::iterator it; for(it = this->females.begin(); it != this->females.end(); it++){ // Хак конкретно для Деревянко 2014 Chromosome chrom = (*it)->genotype->getMotherGenome().getChromosome(0); std::vector 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); // Хак конкретно для Деревянко 2013 int positionToMutate = rand() % (int)(1/mutProb); if(positionToMutate < wholeSeqLength){ std::string seq = genes.at(0).getSequence(); int geneNum = positionToMutate / seq.size(); // Хак конкретно для Деревянко 2014 positionToMutate = positionToMutate % seq.size(); // Хак конкретно для Деревянко 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::iterator it = females.begin(); it != females.end(); it++){ //out<<"> Female seq mitochondrial"<<(i++)<<"\n"; out<<(*it)->getGenotype().toSimpleFasta()<::iterator it = males.begin(); it != males.end(); it++){ out<<"> Male seq "<<(i++)<<"\n"; out<<(*it)->getGenotype().toSimpleFasta()<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; // Уходят из начала списка, приходят в конец std::list malesTemp; std::list femalesTemp; // P1 -> temp // males std::list::iterator it1 = p1->males.begin(); std::list::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"<P1\t"<males.size()); int femalesFounders = (int) (frac*this->females.size()); // Уходят из начала списка, приходят в конец std::list malesTemp; std::list femalesTemp; // P1 -> temp // males std::list::iterator it1 = this->males.begin(); std::list::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){ // !!! Времянка для отчёта по Деревянко srand((unsigned int)time(NULL)); //float mutProb = 1 / 1e+6f; // Вероятность мутации - на нуклеотид на поколение // По мтДНК смысл мутировать только женщин // По нумту - обоих std::list::iterator it; for(it = this->females.begin(); it != this->females.end(); it++){ // Хак конкретно для Деревянко 2015 Chromosome chrom = (*it)->genotype->getMotherGenome().getChromosome(0); Chromosome chromNumt = (*it)->genotype->getMotherGenome().getChromosome(1); std::vector 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(); // Хак конкретно для Деревянко 2015 positionToMutate = positionToMutate % seq.size(); // Хак конкретно для Деревянко 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) // Нумтовая ДНК //std::vector 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(); // Хак конкретно для Деревянко 2015 // positionToMutate = positionToMutate % seq.size(); // Хак конкретно для Деревянко 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) Нумтовая ДНК - пока не мутирует } // (END) for // !!! -------------------------------- }