159 lines
4.6 KiB
C++
159 lines
4.6 KiB
C++
#include "Population.h"
|
|
#include "../individual/Phenotype.h"
|
|
#include <cstdlib>
|
|
#include <sstream>
|
|
#include <algorithm>
|
|
|
|
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<Chromosome> fGenome;
|
|
std::vector<Chromosome> 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"<<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;
|
|
|
|
// Ñîðòèðóåì ïî ïðèñïîñîáëåííîñòè
|
|
//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;
|
|
}
|
|
|
|
} |