#include "Population.h" #include "../individual/Phenotype.h" #include "DEC-0.0/processor/Processor.h" #include #include #include AsexualPopulation::~AsexualPopulation(){ // TODO : Удалить рекурсивно всё } AsexualPopulation::AsexualPopulation(int size, PopulationBreedingStrategy* _strategy) : Population(_strategy), individs(size/*, 0*/) { srand(0); int RANGE = 1000; float gValue; // Стохастическое создание популяции for(int i = 0; i < size; i++){ // Геном std::vector fGenome; std::vector mGenome; // Пока одна хромосома с тремя генами 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"); // папа 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"); // мама chromM.insertGeneToEnd(geneM1); chromM.insertGeneToEnd(geneM2); chromM.insertGeneToEnd(geneM3); fGenome.push_back(chromF); mGenome.push_back(chromM); Genotype* genotype = new Genotype(fGenome, mGenome); // (END) Геном // Фенотип 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) Фенотип // Пул субстратов InnerSubstratesPool* subPool = 0; // (END) Пул субстратов 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(){ // Здесь учесть смертность стохастическую // Смертность слабейших учитывается в 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"<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"<individs.size()<individs.begin(),this->individs.end()); //std::cout << "lol" << std::endl; 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<individs.at(i)->getGenotype()); } } 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<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<