Init version
This commit is contained in:
59
DEC_GUI/DEC-0.0/individual/AbstractIndividual.h
Normal file
59
DEC_GUI/DEC-0.0/individual/AbstractIndividual.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#pragma once
|
||||
/*
|
||||
|
||||
|
||||
*/
|
||||
#include "../environment/AbstractEnvironment.h"
|
||||
#include "genome/AbstractGenome.h"
|
||||
#include "InnerSubstratesPool.h"
|
||||
#include "genome/strategies/PhenotypeToFitnessStrategy.h"
|
||||
class Phenotype;
|
||||
class GenotypeToPhenotypeStrategy;
|
||||
class Individual {
|
||||
public:
|
||||
enum Gender { male, female, hermaphrodite };
|
||||
friend class GenotypeToPhenotypeStrategy;
|
||||
friend class InOutBreedingGenotypeToPhenotypeStrategy;
|
||||
friend class KolchShindyalGenotypeToPhenotypeStrategy;
|
||||
friend class BisexualPopulation; // <20> <20><><EFBFBD><EFBFBD> <20><> MutationStrategy !!!
|
||||
protected:
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
GenotypeToPhenotypeStrategy* genToPhenStrategy;
|
||||
PhenotypeToFitnessStrategy* phenToFitStrategy;
|
||||
ChromosomeRearrangementStrategy* recombinationStrategy;
|
||||
|
||||
////
|
||||
//Environment* currentEnvironment;
|
||||
Region* region;
|
||||
|
||||
unsigned int age;
|
||||
Gender gender;
|
||||
Genotype* genotype;
|
||||
|
||||
InnerSubstratesPool* substrateCache ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
Phenotype* phenotype;
|
||||
|
||||
double fitness;
|
||||
|
||||
/////////////////
|
||||
public:
|
||||
Individual(const Individual& father, const Individual& mother); // <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Individual(Genotype* gType, Phenotype* pType, InnerSubstratesPool* sub, Gender _gender = hermaphrodite, Region* reg = 0);
|
||||
virtual ~Individual();
|
||||
virtual const Genotype& getGenotype() const { return *genotype;}
|
||||
virtual const Phenotype& getPhenotype() const {return *phenotype;}
|
||||
//virtual void setEnvironment(Environment* env) { currentEnvironment = env; }
|
||||
virtual void setRegion(Region* _region) {};
|
||||
virtual void setGenToPhenStrategy(GenotypeToPhenotypeStrategy* s){ genToPhenStrategy = s;}
|
||||
virtual void setPhenToFitnessStrategy(PhenotypeToFitnessStrategy* p) { if(phenToFitStrategy != 0) {delete phenToFitStrategy;} phenToFitStrategy = p;}
|
||||
virtual void calculateFitness();
|
||||
virtual void calculatePhenotype();
|
||||
virtual double getFitness() const { return fitness; }
|
||||
|
||||
Gender getGender() const { return gender; }
|
||||
virtual bool operator<(const Individual* _ind) const { return this->fitness < _ind->fitness;}
|
||||
};
|
||||
|
||||
//bool compareOnFitness(const Individual& a, const Individual& b);
|
||||
bool compareOnFitness(const Individual* a, const Individual* b);
|
||||
68
DEC_GUI/DEC-0.0/individual/Individual.cpp
Normal file
68
DEC_GUI/DEC-0.0/individual/Individual.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#include "AbstractIndividual.h"
|
||||
#include "genome/strategies/GenotypeToPhenotypeStrategy.h"
|
||||
#include <iostream>
|
||||
|
||||
Individual::Individual(const Individual& father, const Individual& mother)
|
||||
{
|
||||
this->genToPhenStrategy = GenotypeToPhenotypeStrategies::getInstance("inoutbreeding");
|
||||
this->phenToFitStrategy = PhenotypeToFitnessStrategy::getInstance("inoutbreeding");
|
||||
this->recombinationStrategy = RecombinationStrategies::getInstance("Simple recombination");
|
||||
|
||||
genotype = new Genotype(
|
||||
father.getGenotype().recombinantHaploidGenotype(recombinationStrategy),
|
||||
mother.getGenotype().recombinantHaploidGenotype(recombinationStrategy));
|
||||
// <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>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
this->substrateCache = new InnerSubstratesPool();
|
||||
|
||||
phenotype= new Phenotype(father.getPhenotype());
|
||||
this->age = 0;
|
||||
this->calculateFitness();
|
||||
|
||||
}
|
||||
|
||||
Individual::Individual(Genotype* gType, Phenotype* pType, InnerSubstratesPool* sub, Gender _gender, Region* _reg):
|
||||
genotype(gType), phenotype(pType), substrateCache(sub),
|
||||
gender(_gender), region(_reg)
|
||||
{
|
||||
this->genToPhenStrategy = GenotypeToPhenotypeStrategies::getInstance("inoutbreeding");
|
||||
this->phenToFitStrategy = PhenotypeToFitnessStrategy::getInstance("inoutbreeding");
|
||||
this->recombinationStrategy = RecombinationStrategies::getInstance("Simple recombination");
|
||||
|
||||
this->age = 0;
|
||||
|
||||
//this->calculateFitness();
|
||||
//this->phenotype
|
||||
}
|
||||
|
||||
|
||||
Individual::~Individual(){
|
||||
// std::cerr<<"Destructor works"<<std::endl;
|
||||
delete this->genotype;
|
||||
delete this->phenotype;
|
||||
|
||||
delete this->genToPhenStrategy;
|
||||
delete this->phenToFitStrategy;
|
||||
delete this->recombinationStrategy;
|
||||
|
||||
if(this->substrateCache != 0)
|
||||
delete this->substrateCache;
|
||||
}
|
||||
|
||||
/*bool compareOnFitness(const Individual& a, const Individual& b){
|
||||
return a.getFitness() < b.getFitness();
|
||||
}*/
|
||||
|
||||
bool compareOnFitness(const Individual* a, const Individual* b){
|
||||
return a->getFitness() < b->getFitness();
|
||||
}
|
||||
|
||||
void Individual::calculateFitness(){
|
||||
this->genToPhenStrategy->calculatePhenotype(this);
|
||||
this->fitness = this->phenToFitStrategy->calculateFitness(this->phenotype);
|
||||
}
|
||||
|
||||
void Individual::calculatePhenotype(){
|
||||
this->genToPhenStrategy->calculatePhenotype(this);
|
||||
}
|
||||
1
DEC_GUI/DEC-0.0/individual/InnerSubstratesPool.cpp
Normal file
1
DEC_GUI/DEC-0.0/individual/InnerSubstratesPool.cpp
Normal file
@@ -0,0 +1 @@
|
||||
#include "InnerSubstratesPool.h"
|
||||
40
DEC_GUI/DEC-0.0/individual/InnerSubstratesPool.h
Normal file
40
DEC_GUI/DEC-0.0/individual/InnerSubstratesPool.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
using std::vector;
|
||||
using std::map;
|
||||
|
||||
class InnerSubstratesPool {
|
||||
protected:
|
||||
std::vector<float> subConcentrations; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::map<std::string, int> subNamesMap; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
// P.S. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||
|
||||
std::vector<float> regConcentrations; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::map<std::string, int> regNamesMap; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
|
||||
public:
|
||||
InnerSubstratesPool(){};
|
||||
InnerSubstratesPool(const vector<float>& _subs, const map<std::string, int>& _subNames)
|
||||
: subConcentrations(_subs), subNamesMap(_subNames){}
|
||||
|
||||
InnerSubstratesPool(const vector<float>& _subs, const map<std::string, int>& _subNames,
|
||||
const vector<float>& _regs, const map<std::string, int>& _regNames)
|
||||
: subConcentrations(_subs), subNamesMap(_subNames),
|
||||
regConcentrations(_regs), regNamesMap(_regNames){}
|
||||
|
||||
virtual void utilizeSubstrate(int num, float count) { subConcentrations.at(num) -= count; }
|
||||
virtual void utilizeRegulator(int num, float count) { regConcentrations.at(num) -= count; }
|
||||
|
||||
virtual void utilizeSubstrate(std::string name, float count) { subConcentrations.at(subNamesMap[name]) -= count; }
|
||||
virtual void utilizeRegulator(std::string name, float count) { subConcentrations.at(regNamesMap[name]) -= count; }
|
||||
|
||||
virtual void addSubstrate(int num, float count) { subConcentrations.at(num) += count; }
|
||||
virtual void addRegulator(int num, float count) { regConcentrations.at(num) += count; }
|
||||
|
||||
virtual void addSubstrate(std::string name, float count) { subConcentrations.at(subNamesMap[name]) += count; }
|
||||
virtual void addRegulator(std::string name, float count) { subConcentrations.at(regNamesMap[name]) += count; }
|
||||
|
||||
};
|
||||
38
DEC_GUI/DEC-0.0/individual/Phenotype.cpp
Normal file
38
DEC_GUI/DEC-0.0/individual/Phenotype.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
#include "Phenotype.h"
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
Phenotype::Phenotype(Trait _trait){
|
||||
this->traitsMap[_trait.getName()] = _trait;
|
||||
}
|
||||
|
||||
void Phenotype::addTrait(Trait _trait){
|
||||
std::map<std::string,Trait>::iterator it;
|
||||
it = this->traitsMap.find(_trait.getName());
|
||||
|
||||
if(it == this->traitsMap.end()){
|
||||
this->traitsMap[_trait.getName()] = _trait;
|
||||
}
|
||||
else{
|
||||
std::cerr<<"Phenotype.cpp(16): already has the trait: "<<it->first<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
std::ostream& operator << (std::ostream& os, const Phenotype& p){
|
||||
std::map<std::string,Trait>::const_iterator it;
|
||||
for(it = p.traitsMap.begin(); it != p.traitsMap.end(); it++){
|
||||
os<<(it->first)<<"\t"<<(it->second.getTraitValueCont())<<"\t";
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
std::string Phenotype::toSimpleString() const {
|
||||
std::stringstream os;
|
||||
std::map<std::string,Trait>::const_iterator it;
|
||||
for(it = this->traitsMap.begin(); it != this->traitsMap.end(); it++){
|
||||
os<<(it->second.getTraitValueCont())<<"\t";
|
||||
}
|
||||
|
||||
return os.str();
|
||||
}
|
||||
26
DEC_GUI/DEC-0.0/individual/Phenotype.h
Normal file
26
DEC_GUI/DEC-0.0/individual/Phenotype.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include "Trait.h"
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
class Phenotype {
|
||||
friend class GenotypeToPhenotypeStrategy;
|
||||
friend class InOutBreedingGenotypeToPhenotypeStrategy;
|
||||
friend class KolchShindyalGenotypeToPhenotypeStrategy;
|
||||
friend class PhenotypeToFitnessStrategy;
|
||||
friend std::ostream& operator << (std::ostream& os, const Phenotype& p);
|
||||
protected:
|
||||
//std::vector<Trait> traits;
|
||||
std::map<std::string, Trait> traitsMap;
|
||||
public:
|
||||
Phenotype() { };
|
||||
Phenotype(const std::map<std::string, Trait>& _tm) : traitsMap(_tm) {}
|
||||
Phenotype(Trait _trait);
|
||||
|
||||
Trait getTraitByName(std::string name) const {return this->traitsMap.find(name)->second;};
|
||||
void addTrait(Trait _trait);
|
||||
std::string toSimpleString() const;
|
||||
};
|
||||
|
||||
31
DEC_GUI/DEC-0.0/individual/Trait.cpp
Normal file
31
DEC_GUI/DEC-0.0/individual/Trait.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#include "Trait.h"
|
||||
#include <iostream>
|
||||
|
||||
//Trait::Trait(const Trait& _t)
|
||||
//{
|
||||
// *this = _t;
|
||||
//}
|
||||
|
||||
Trait::Trait(Trait::idType _ID, std::string _name, float value):
|
||||
ID(_ID), name(_name), traitValueCont(value), traitType(Continious)
|
||||
{}
|
||||
|
||||
Trait::Trait(Trait::idType _ID, std::string _name, int value):
|
||||
ID(_ID), name(_name), traitValueDiscr(value), traitType(Discrete)
|
||||
{}
|
||||
|
||||
void Trait::setTraitValue(float _value){
|
||||
if(this->traitType == Continious){
|
||||
this->traitValueCont = _value;
|
||||
return;
|
||||
}
|
||||
/*throw*/std::cerr<<"Trait.cpp(17) Warning: can't assign float value to discrete trait\n";
|
||||
}
|
||||
|
||||
void Trait::setTraitValue(int _value){
|
||||
if(this->traitType == Discrete){
|
||||
this->traitValueDiscr = _value;
|
||||
return;
|
||||
}
|
||||
/*throw*/std::cerr<<"Trait.cpp(25) Warning: can't assign int value to continious trait\n";
|
||||
}
|
||||
32
DEC_GUI/DEC-0.0/individual/Trait.h
Normal file
32
DEC_GUI/DEC-0.0/individual/Trait.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
class Trait {
|
||||
public:
|
||||
enum TraitType { Continious, Discrete };
|
||||
typedef unsigned int idType;
|
||||
|
||||
protected:
|
||||
TraitType traitType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
idType ID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::string name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float traitValueCont; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int traitValueDiscr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
public:
|
||||
Trait(){};
|
||||
Trait(idType _ID, std::string _name, float value);
|
||||
Trait(idType _ID, std::string _name, int value);
|
||||
|
||||
TraitType getTraitType() const { return traitType; }
|
||||
idType getID() const { return ID; }
|
||||
std::string getName() const { return name; }
|
||||
float getTraitValueCont() const { return traitValueCont; }
|
||||
int getTraitValueDiscr() const { return traitValueDiscr; }
|
||||
|
||||
void setName(const std::string& _name) { name = _name; }
|
||||
void setID(idType _ID) { ID = _ID; }
|
||||
void setTraitValue(float _value);
|
||||
void setTraitValue(int _value);
|
||||
};
|
||||
56
DEC_GUI/DEC-0.0/individual/genome/AbstractGenome.h
Normal file
56
DEC_GUI/DEC-0.0/individual/genome/AbstractGenome.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
|
||||
#include "Chromosome.h"
|
||||
#include "strategies/ChromosomeRearrangementStrategy.h"
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
/*
|
||||
|
||||
*/
|
||||
class ChromosomeRearrangementStrategy; // forward declaration
|
||||
class Genotype;
|
||||
|
||||
class HaploidGenotype {
|
||||
friend class Genotype;
|
||||
friend class ChromosomeRearrangementStrategy;
|
||||
friend std::ostream& operator << (std::ostream& os, const Genotype& g);
|
||||
friend class Processor;
|
||||
protected:
|
||||
std::vector<Chromosome> chromosomes;
|
||||
|
||||
public:
|
||||
const Chromosome& getChromosome(unsigned int i) const { return this->chromosomes.at(i);}
|
||||
|
||||
public:
|
||||
HaploidGenotype(const std::vector<Chromosome>& _chrom) : chromosomes(_chrom){};
|
||||
|
||||
};
|
||||
|
||||
class Genotype {
|
||||
friend class ChromosomeRearrangementStrategy;
|
||||
friend std::ostream& operator<< (std::ostream& os, const Genotype& g);
|
||||
friend class Processor;
|
||||
protected:
|
||||
HaploidGenotype fatherGenome;
|
||||
HaploidGenotype motherGenome;
|
||||
|
||||
public:
|
||||
Genotype(const std::vector<Chromosome>& _fGenome, const std::vector<Chromosome>& _mGenome) : fatherGenome(HaploidGenotype(_fGenome)), motherGenome(HaploidGenotype(_mGenome)) {};
|
||||
Genotype(const HaploidGenotype& _fGenome, const HaploidGenotype& _mGenome) : fatherGenome(_fGenome), motherGenome(_mGenome) {};
|
||||
Genotype(const Genotype& _fDiplGenome, const Genotype& _mDiplGenome);
|
||||
HaploidGenotype recombinantHaploidGenotype(ChromosomeRearrangementStrategy*) const;
|
||||
const HaploidGenotype& getFatherGenome() const { return this->fatherGenome;}
|
||||
const HaploidGenotype& getMotherGenome() const { return this->motherGenome;}
|
||||
std::string toSimpleString() const;
|
||||
std::string toSimpleFasta(bool onlyMother = true) const;
|
||||
std::string toMaxModuleAB() const;
|
||||
|
||||
std::string getRawGene(unsigned int fatherMother, unsigned int chromoNum, unsigned int geneNum) const;
|
||||
void doRawMutationSequence(unsigned int fatherMother, unsigned int chromoNum, unsigned int geneNum, std::string newSeq);
|
||||
};
|
||||
|
||||
|
||||
//!!!!!!!!!!
|
||||
class PolyploidGenotype {
|
||||
|
||||
};
|
||||
11
DEC_GUI/DEC-0.0/individual/genome/Chromosome.cpp
Normal file
11
DEC_GUI/DEC-0.0/individual/genome/Chromosome.cpp
Normal file
@@ -0,0 +1,11 @@
|
||||
#include "Chromosome.h"
|
||||
|
||||
void Chromosome::insertGene(Gene gene, int pos){
|
||||
std::vector<Gene>::iterator it = this->genes.begin();
|
||||
this->genes.insert(it+pos, gene);
|
||||
}
|
||||
|
||||
void Chromosome::insertGeneToEnd(Gene gene, int pos){
|
||||
std::vector<Gene>::iterator it = this->genes.end();
|
||||
this->genes.insert(it-pos, gene);
|
||||
}
|
||||
26
DEC_GUI/DEC-0.0/individual/genome/Chromosome.h
Normal file
26
DEC_GUI/DEC-0.0/individual/genome/Chromosome.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "Gene.h"
|
||||
/*
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
|
||||
class Chromosome {
|
||||
friend class ChromosomeRearrangementStrategy;
|
||||
friend class Genotype;
|
||||
protected:
|
||||
std::string name;
|
||||
std::vector<Gene> genes;
|
||||
|
||||
public:
|
||||
Chromosome(std::string _name) : name(_name) {};
|
||||
Chromosome(std::string _name, Gene gene) : name(_name), genes(1, gene) {};
|
||||
Chromosome(std::string _name, const std::vector<Gene>& _genes) : name(_name), genes(_genes) {};
|
||||
|
||||
void insertGene(Gene gene, int pos = 0);
|
||||
void insertGeneToEnd(Gene gene, int pos = 0);
|
||||
std::string getName() const { return name;}
|
||||
const std::vector<Gene>& getGenesAsVector() const { return genes;}
|
||||
};
|
||||
39
DEC_GUI/DEC-0.0/individual/genome/Gene.cpp
Normal file
39
DEC_GUI/DEC-0.0/individual/genome/Gene.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
#include "Gene.h"
|
||||
#include <iostream>
|
||||
|
||||
Gene::Gene(idType _ID, std::string _name, float value):
|
||||
ID(_ID), name(_name), geneValueCont(value), geneType(Continious)
|
||||
{}
|
||||
|
||||
Gene::Gene(idType _ID, std::string _name, int value):
|
||||
ID(_ID), name(_name), geneValueDiscr(value), geneType(Discrete)
|
||||
{}
|
||||
|
||||
Gene::Gene(idType _ID, std::string _name, std::string _seq):
|
||||
ID(_ID), name(_name), sequence(_seq), geneType(Sequence)
|
||||
{}
|
||||
|
||||
void Gene::setGeneValue(float _value){
|
||||
if(this->geneType == Continious){
|
||||
this->geneValueCont = _value;
|
||||
return;
|
||||
}
|
||||
/*throw*/std::cerr<<"Gene.cpp(17) Warning: can't assign float value to discrete Gene\n";
|
||||
}
|
||||
|
||||
void Gene::setGeneValue(int _value){
|
||||
if(this->geneType == Discrete){
|
||||
this->geneValueDiscr = _value;
|
||||
return;
|
||||
}
|
||||
/*throw*/std::cerr<<"Gene.cpp(25) Warning: can't assign int value to continious Gene\n";
|
||||
}
|
||||
|
||||
void Gene::setGeneValue(std::string _seq){
|
||||
if(this->geneType == Sequence){
|
||||
this->sequence = _seq;
|
||||
return;
|
||||
}
|
||||
/*throw*/std::cerr<<"Gene.cpp(37) Warning: can't assign numerical value to sequence Gene\n";
|
||||
|
||||
}
|
||||
44
DEC_GUI/DEC-0.0/individual/genome/Gene.h
Normal file
44
DEC_GUI/DEC-0.0/individual/genome/Gene.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
/*
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>, <20><><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD> <20><><EFBFBD><EFBFBD>" (<28><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),
|
||||
<EFBFBD> <20><><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><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||||
1) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
2) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>/<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
3) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>/<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
4) <20><><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> (<28> <20>.<2E>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>???)
|
||||
5) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20>.<2E>.
|
||||
*/
|
||||
|
||||
class Gene {
|
||||
public:
|
||||
enum GeneType { Continious, Discrete, Sequence };
|
||||
typedef unsigned int idType;
|
||||
|
||||
protected:
|
||||
GeneType geneType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
idType ID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::string name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float geneValueCont;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int geneValueDiscr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::string sequence;
|
||||
|
||||
public:
|
||||
Gene(idType _ID, std::string _name, float value);
|
||||
Gene(idType _ID, std::string _name, int value);
|
||||
Gene(idType _ID, std::string _name, std::string seq);
|
||||
|
||||
GeneType getGeneType() const { return geneType; }
|
||||
idType getID() const { return ID; }
|
||||
std::string getName() const { return name; }
|
||||
float getGeneValueCont() const { return geneValueCont; }
|
||||
int getGeneValueDiscr() const { return geneValueDiscr; }
|
||||
std::string getSequence()const { return sequence; }
|
||||
|
||||
void setName(const std::string& _name) { name = _name; }
|
||||
void setID(idType _ID) { ID = _ID; }
|
||||
void setGeneValue(float _value);
|
||||
void setGeneValue(int _value);
|
||||
void setGeneValue(std::string _seq);
|
||||
};
|
||||
119
DEC_GUI/DEC-0.0/individual/genome/Genotype.cpp
Normal file
119
DEC_GUI/DEC-0.0/individual/genome/Genotype.cpp
Normal file
@@ -0,0 +1,119 @@
|
||||
#include "AbstractGenome.h"
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <cmath>
|
||||
//Genotype::Genotype(const Genotype& _fDiplGenome, const Genotype& _mDiplGenome){
|
||||
//}
|
||||
|
||||
HaploidGenotype Genotype::recombinantHaploidGenotype(ChromosomeRearrangementStrategy* strategy) const {
|
||||
return strategy->buildRecombinantGenotype(this);
|
||||
}
|
||||
|
||||
std::ostream& operator<< (std::ostream& os, const Genotype& g){
|
||||
os<<"F";
|
||||
for(unsigned int i = 0; i < g.fatherGenome.chromosomes.size(); i++){
|
||||
os<<"ch"<<(i+1)<<":";
|
||||
const std::vector<Gene> genesF = g.fatherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
const std::vector<Gene> genesM = g.motherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
for(unsigned int j = 0; j < genesF.size(); j++){
|
||||
os<<"\t";
|
||||
os<<genesF.at(j).getName();//<<", ";
|
||||
if(genesF.at(j).getGeneType() == Gene::Continious){
|
||||
os<<"\t"<<genesF.at(j).getGeneValueCont();//<<"\t";
|
||||
os<<"\t"<<genesM.at(j).getGeneValueCont();//<<"\t";
|
||||
}
|
||||
else{
|
||||
os<<"\t"<<genesF.at(j).getGeneValueDiscr();//<<"\t";
|
||||
os<<"\t"<<genesM.at(j).getGeneValueDiscr();//<<"\t";
|
||||
}
|
||||
os<<"\t";
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
std::string Genotype::toSimpleString() const {
|
||||
std::stringstream os;
|
||||
for(unsigned int i = 0; i < this->fatherGenome.chromosomes.size(); i++){
|
||||
const std::vector<Gene> genesF = this->fatherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
const std::vector<Gene> genesM = this->motherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
for(unsigned int j = 0; j < genesF.size(); j++){
|
||||
if(genesF.at(j).getGeneType() == Gene::Continious){
|
||||
os<<genesF.at(j).getGeneValueCont()<<"\t";
|
||||
os<<genesM.at(j).getGeneValueCont()<<"\t";
|
||||
}
|
||||
else{
|
||||
os<<genesF.at(j).getGeneValueDiscr()<<"\t";
|
||||
os<<genesM.at(j).getGeneValueDiscr()<<"\t";
|
||||
}
|
||||
//os<<"\t";
|
||||
}
|
||||
}
|
||||
|
||||
return os.str();
|
||||
}
|
||||
|
||||
|
||||
|
||||
std::string Genotype::toMaxModuleAB() const {
|
||||
std::stringstream os;
|
||||
for(unsigned int i = 0; i < this->fatherGenome.chromosomes.size(); i++){
|
||||
const std::vector<Gene> genesF = this->fatherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
const std::vector<Gene> genesM = this->motherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
for(unsigned int j = 0; j < genesF.size(); j++){
|
||||
if(genesF.at(j).getGeneType() == Gene::Continious){
|
||||
if(fabs(genesF.at(j).getGeneValueCont()) > fabs(genesM.at(j).getGeneValueCont())){
|
||||
os<<genesF.at(j).getGeneValueCont()<<"\t";
|
||||
}
|
||||
else{
|
||||
os<<genesM.at(j).getGeneValueCont()<<"\t";
|
||||
}
|
||||
}
|
||||
else{
|
||||
os<<genesF.at(j).getGeneValueDiscr()<<"\t";
|
||||
os<<genesM.at(j).getGeneValueDiscr()<<"\t";
|
||||
}
|
||||
//os<<"\t";
|
||||
}
|
||||
}
|
||||
|
||||
return os.str();
|
||||
}
|
||||
|
||||
std::string Genotype::getRawGene(unsigned int fatherMother, unsigned int chromoNum, unsigned int geneNum) const{
|
||||
const HaploidGenotype* genome = (fatherMother == 0) ? &(this->fatherGenome) : &(this->motherGenome);
|
||||
return genome->getChromosome(chromoNum).getGenesAsVector().at(geneNum).getSequence();
|
||||
}
|
||||
|
||||
void Genotype::doRawMutationSequence(unsigned int fatherMother, unsigned int chromoNum, unsigned int geneNum, std::string newSeq){
|
||||
if(fatherMother==2){
|
||||
this->fatherGenome.chromosomes.at(chromoNum).genes.at(geneNum).setGeneValue(newSeq);
|
||||
this->motherGenome.chromosomes.at(chromoNum).genes.at(geneNum).setGeneValue(newSeq);
|
||||
}
|
||||
}
|
||||
|
||||
std::string Genotype::toSimpleFasta(bool onlyMother) const {
|
||||
std::stringstream os;
|
||||
for(unsigned int i = 0; i < this->motherGenome.chromosomes.size(); i++){
|
||||
const std::vector<Gene> genesF = this->fatherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
const std::vector<Gene> genesM = this->motherGenome.chromosomes.at(i).getGenesAsVector();
|
||||
os<<"> "<<this->motherGenome.chromosomes.at(i).getName()<<"\n";
|
||||
for(unsigned int j = 0; j < genesM.size(); j++){
|
||||
if(genesM.at(i).getGeneType() == Gene::Sequence){
|
||||
os<<genesM.at(j).getSequence();
|
||||
}
|
||||
else if(genesM.at(j).getGeneType() == Gene::Continious){
|
||||
os<<genesF.at(j).getGeneValueCont()<<"\t";
|
||||
os<<genesM.at(j).getGeneValueCont()<<"\t";
|
||||
}
|
||||
else{
|
||||
os<<genesF.at(j).getGeneValueDiscr()<<"\t";
|
||||
os<<genesM.at(j).getGeneValueDiscr()<<"\t";
|
||||
}
|
||||
//os<<"\t";
|
||||
}
|
||||
}
|
||||
|
||||
return os.str();
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
#include "ChromosomeRearrangementStrategy.h"
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
HaploidGenotype ChromosomeRearrangementStrategy::buildRecombinantGenotype(const Genotype* parentGenotype){
|
||||
std::vector<Chromosome> chromosomes;
|
||||
const std::vector<Chromosome>* fGenome = &parentGenotype->fatherGenome.chromosomes;
|
||||
const std::vector<Chromosome>* mGenome = &parentGenotype->motherGenome.chromosomes;
|
||||
|
||||
//srand((unsigned int)time(NULL));
|
||||
for (unsigned int i = 0; i < fGenome->size(); i++){
|
||||
int flag = rand() % 2;
|
||||
const std::vector<Gene>* first;
|
||||
const std::vector<Gene>* second;
|
||||
if(flag == 0){
|
||||
first = &fGenome->at(i).genes;
|
||||
second= &mGenome->at(i).genes;
|
||||
}
|
||||
else{
|
||||
first = &mGenome->at(i).genes;
|
||||
second= &fGenome->at(i).genes;
|
||||
}
|
||||
Chromosome childChromosome(fGenome->at(i).name, *first);
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||
int bound = rand() % first->size();
|
||||
for(unsigned int j = bound; j < first->size(); j++){
|
||||
childChromosome.genes.at(j) = second->at(j);
|
||||
}
|
||||
chromosomes.push_back(childChromosome);
|
||||
|
||||
}
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>. <20> <20> <20>),
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
return HaploidGenotype(chromosomes);
|
||||
}
|
||||
|
||||
HaploidGenotype ChromosomeRearrangementStrategy::
|
||||
buildRecombinantGenotype(const HaploidGenotype& fatherGenome, const HaploidGenotype& motherGenome){
|
||||
std::vector<Chromosome> chromosomes;
|
||||
const std::vector<Chromosome> fGenome = fatherGenome.chromosomes;
|
||||
const std::vector<Chromosome> mGenome = motherGenome.chromosomes;
|
||||
|
||||
//srand((unsigned int)time(NULL));
|
||||
for (unsigned int i = 0; i < fGenome.size(); i++){
|
||||
int flag = rand() % 2;
|
||||
std::vector<Gene> first;
|
||||
std::vector<Gene> second;
|
||||
if(flag == 0){
|
||||
first = fGenome.at(i).genes;
|
||||
second= mGenome.at(i).genes;
|
||||
}
|
||||
else{
|
||||
first = mGenome.at(i).genes;
|
||||
second= fGenome.at(i).genes;
|
||||
}
|
||||
Chromosome childChromosome(fGenome.at(i).name, first);
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||
int bound = rand() % first.size();
|
||||
for(unsigned int j = bound; j < first.size(); j++){
|
||||
childChromosome.genes.at(j) = second.at(j);
|
||||
}
|
||||
chromosomes.push_back(childChromosome);
|
||||
|
||||
}
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>. <20> <20> <20>),
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
return HaploidGenotype(chromosomes);
|
||||
}
|
||||
|
||||
ChromosomeRearrangementStrategy* RecombinationStrategies::getInstance(std::string _name){
|
||||
return new ChromosomeRearrangementStrategy();
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
#include "../AbstractGenome.h"
|
||||
|
||||
class HaploidGenotype;
|
||||
class Genotype;
|
||||
|
||||
class ChromosomeRearrangementStrategy {
|
||||
public:
|
||||
virtual HaploidGenotype buildRecombinantGenotype(const Genotype*);
|
||||
virtual HaploidGenotype buildRecombinantGenotype(const HaploidGenotype&, const HaploidGenotype&);
|
||||
};
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
class RecombinationStrategies {
|
||||
public:
|
||||
static ChromosomeRearrangementStrategy* getInstance(std::string _name);
|
||||
};
|
||||
@@ -0,0 +1,35 @@
|
||||
#include "GenotypeToPhenotypeStrategy.h"
|
||||
#include "KolchShindyal/KolchShindyalGenotypeToPhenotypeStrategy.h"
|
||||
#include <cmath>
|
||||
|
||||
void GenotypeToPhenotypeStrategy::calculatePhenotype(Individual* individ){
|
||||
Genotype* genotype = individ->genotype;
|
||||
Phenotype* phenotype = individ->phenotype;
|
||||
InnerSubstratesPool* substrates = individ->substrateCache;
|
||||
|
||||
// Chromosome 1
|
||||
Chromosome chr1F = individ->genotype->getFatherGenome().getChromosome(0);
|
||||
Chromosome chr1M = individ->genotype->getMotherGenome().getChromosome(0);
|
||||
|
||||
const std::vector<Gene>& genesF = chr1F.getGenesAsVector();
|
||||
const std::vector<Gene>& genesM = chr1M.getGenesAsVector();
|
||||
|
||||
for(unsigned int i = 0; i < genesF.size(); i++){
|
||||
float geneVal = std::min(
|
||||
genesF.at(i).getGeneValueCont(),
|
||||
genesM.at(i).getGeneValueCont());
|
||||
phenotype->traitsMap[genesF.at(i).getName()].setTraitValue(geneVal);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GenotypeToPhenotypeStrategy* GenotypeToPhenotypeStrategies::getInstance(std::string _name){
|
||||
if(_name.compare("inoutbreeding") == 0){
|
||||
return new InOutBreedingGenotypeToPhenotypeStrategy();
|
||||
}
|
||||
if(_name.compare("kolchan_shindyal_gen_to_phen") == 0){
|
||||
return new KolchShindyalGenotypeToPhenotypeStrategy();
|
||||
}
|
||||
// default
|
||||
return new GenotypeToPhenotypeStrategy();
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
#include "../../AbstractIndividual.h"
|
||||
#include "../AbstractGenome.h"
|
||||
#include "../../Phenotype.h"
|
||||
class GenotypeToPhenotypeStrategy {
|
||||
public:
|
||||
virtual void calculatePhenotype(Individual*);
|
||||
//virtual void calculatePhenotype(const Genotype*, Phenotype*);
|
||||
//Phenotype* calculatePhenotype(const Genotype*);
|
||||
};
|
||||
|
||||
class InOutBreedingGenotypeToPhenotypeStrategy : public GenotypeToPhenotypeStrategy {
|
||||
public:
|
||||
virtual void calculatePhenotype(Individual*);
|
||||
};
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
class GenotypeToPhenotypeStrategies {
|
||||
public:
|
||||
static GenotypeToPhenotypeStrategy* getInstance(std::string _name);
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
#include "InOutBreedingPhenToFitStrategy.h"
|
||||
#include "../../../Phenotype.h"
|
||||
|
||||
double InOutBreedingPhenToFitStrategy::calculateFitness(Phenotype *phen){
|
||||
double ans = 0.0;
|
||||
|
||||
|
||||
ans = phen->getTraitByName("coadaptive").getTraitValueCont();
|
||||
//float coef = phen->getTraitByName("disease")
|
||||
return ans;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "../PhenotypeToFitnessStrategy.h"
|
||||
|
||||
class InOutBreedingPhenToFitStrategy : public PhenotypeToFitnessStrategy {
|
||||
virtual double calculateFitness(Phenotype* phen);
|
||||
};
|
||||
@@ -0,0 +1,85 @@
|
||||
#include "InOutBreedingPopulationBreedingStrategy.h"
|
||||
#include "../../../../processor/Settings.h"
|
||||
#include "../../../Phenotype.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
void InOutBreedingPopulationBreedingStrategy::breed(Population *_pop){
|
||||
// N = const
|
||||
|
||||
AsexualPopulation* pop = dynamic_cast<AsexualPopulation*>(_pop);
|
||||
if(pop == NULL){
|
||||
std::cerr<<"Wrong dynamic cast to AsexualPopulation\n";
|
||||
return;
|
||||
}
|
||||
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
int offsprings = Settings::OffspringsMean;
|
||||
std::vector<Individual*> newIndivids;
|
||||
|
||||
long int inds;
|
||||
for(inds = pop->individs.size();inds >=2; inds -= 2){
|
||||
int motherIndex = rand()%inds;
|
||||
int fatherIndex = rand()%inds;
|
||||
if(fatherIndex == motherIndex){
|
||||
fatherIndex = (fatherIndex+1)%inds;
|
||||
}
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for(int i = 0; i < offsprings; i++){
|
||||
Individual* ind = new Individual(*(pop->individs.at(motherIndex)), *(pop->individs.at(fatherIndex)));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ind->calculatePhenotype();
|
||||
Phenotype phen = ind->getPhenotype();
|
||||
float coadapt = phen.getTraitByName("coadaptive").getTraitValueCont();
|
||||
float disease = phen.getTraitByName("disease").getTraitValueCont();
|
||||
|
||||
if(disease > Settings::DiseaseThreshold){ // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float probSurvive = 1.f;
|
||||
if(coadapt < Settings::CoadaptiveThreshold){ // TODO: <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
probSurvive = Settings::CoadaptiveMinimumP;
|
||||
}
|
||||
else{
|
||||
probSurvive = (1-Settings::CoadaptiveMinimumP)/(Settings::CoadaptiveMaximumTrait-Settings::CoadaptiveThreshold);
|
||||
probSurvive *= coadapt - Settings::CoadaptiveMaximumTrait;
|
||||
probSurvive += 1;
|
||||
}
|
||||
int order = 1000;
|
||||
int prob = rand()%order;
|
||||
if(prob < order*probSurvive){
|
||||
// <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>.
|
||||
newIndivids.push_back(ind);
|
||||
}
|
||||
}
|
||||
} // (END) for(int i = 0; i < offsprings; i++)
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
delete pop->individs.at(motherIndex);
|
||||
delete pop->individs.at(fatherIndex);
|
||||
if(motherIndex > fatherIndex){
|
||||
pop->individs.erase(pop->individs.begin()+motherIndex);
|
||||
pop->individs.erase(pop->individs.begin()+fatherIndex);
|
||||
}
|
||||
else{
|
||||
pop->individs.erase(pop->individs.begin()+fatherIndex);
|
||||
pop->individs.erase(pop->individs.begin()+motherIndex);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(newIndivids.size() >= Settings::KMaxParameter){
|
||||
for(unsigned int i = 0; i < pop->individs.size(); i++){
|
||||
delete pop->individs.at(i);
|
||||
}
|
||||
pop->individs.clear();
|
||||
break;
|
||||
}
|
||||
} // (END) for(inds = pop->individs.size();inds >=2; inds -= 2)
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
pop->individs.insert(pop->individs.begin(), newIndivids.begin(), newIndivids.end());
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "../../../../population/BreedingStrategies/PopulationBreedingStrategy.h"
|
||||
|
||||
class InOutBreedingPopulationBreedingStrategy : public PopulationBreedingStrategy {
|
||||
public:
|
||||
virtual void breed(Population* pop);
|
||||
};
|
||||
@@ -0,0 +1,102 @@
|
||||
#include "../GenotypeToPhenotypeStrategy.h"
|
||||
#include "../../../../processor/Settings.h"
|
||||
#include <cmath>
|
||||
#include <qmath.h>
|
||||
|
||||
void InOutBreedingGenotypeToPhenotypeStrategy::calculatePhenotype(Individual* individ){
|
||||
Genotype* genotype = individ->genotype;
|
||||
Phenotype* phenotype = individ->phenotype;
|
||||
InnerSubstratesPool* substrates = individ->substrateCache;
|
||||
|
||||
// Chromosome 1
|
||||
Chromosome chr1F = individ->genotype->getFatherGenome().getChromosome(0);
|
||||
Chromosome chr1M = individ->genotype->getMotherGenome().getChromosome(0);
|
||||
|
||||
const std::vector<Gene>& genesF = chr1F.getGenesAsVector();
|
||||
const std::vector<Gene>& genesM = chr1M.getGenesAsVector();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float a1 = genesF.at(0).getGeneValueCont();
|
||||
float a2 = genesM.at(0).getGeneValueCont();
|
||||
|
||||
float b1 = genesF.at(1).getGeneValueCont();
|
||||
float b2 = genesM.at(1).getGeneValueCont();
|
||||
// (END) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<float> diseaseAllelesF(4);
|
||||
std::vector<float> diseaseAllelesM(4);
|
||||
|
||||
for(unsigned int i = 0; i < diseaseAllelesF.size(); i++){
|
||||
diseaseAllelesF.at(i) = genesF.at(i+2).getGeneValueCont();
|
||||
diseaseAllelesM.at(i) = genesM.at(i+2).getGeneValueCont();
|
||||
}
|
||||
// (END) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float trait1 = 0, trait2 = 0;
|
||||
float a, b;
|
||||
|
||||
// 1) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
if(Settings::CoadaptiveGenesInteraction == "onechromosome"){
|
||||
// 1.1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
a = a1;
|
||||
b = b1;
|
||||
}
|
||||
else if(Settings::CoadaptiveGenesInteraction == "mean"){
|
||||
// 1.2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
a = 0.5f*(a1+a2);
|
||||
b = 0.5f*(b1+b2);
|
||||
}
|
||||
else{ // Settings::CoadaptiveGenesInteraction == "maxmodule"
|
||||
// 1.3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
a = std::fabs(a1) >= std::fabs(a2) ? a1 : a2;
|
||||
b = std::fabs(b1) >= std::fabs(b2) ? b1 : b2;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
|
||||
trait1 = std::max(a*b - (std::fabs(a*a*a) + std::fabs(b*b*b))/20, 0.0f);
|
||||
//trait1 = std::max(a*b - (a*a*a*a + b*b*b*b)/250, 0.0f);
|
||||
|
||||
// 2) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(Settings::DiseaseGenesInteraction == "add1"){
|
||||
// 2.1<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float sum1 = 0.0f, sum2 = 0.0f;
|
||||
for(unsigned int i = 0; i < diseaseAllelesF.size(); i++){
|
||||
sum1 += diseaseAllelesF.at(i);
|
||||
sum2 += diseaseAllelesM.at(i);
|
||||
}
|
||||
trait2 = std::max(sum1,sum2);
|
||||
}
|
||||
else if(Settings::DiseaseGenesInteraction == "addmax"){
|
||||
// 2.1<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>)
|
||||
for(unsigned int i = 0; i < diseaseAllelesF.size(); i++){
|
||||
trait2 += std::max(diseaseAllelesF.at(i), diseaseAllelesM.at(i));
|
||||
}
|
||||
}
|
||||
else if(Settings::DiseaseGenesInteraction == "mult"){
|
||||
// 2.2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for(unsigned int i = 0; i < diseaseAllelesF.size(); i++){
|
||||
trait2 *= std::max(diseaseAllelesF.at(i), diseaseAllelesM.at(i));
|
||||
}
|
||||
}
|
||||
else if(Settings::DiseaseGenesInteraction == "meanadd"){
|
||||
// 2.3<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
for(unsigned int i = 0; i < diseaseAllelesF.size(); i++){
|
||||
trait2 += diseaseAllelesF.at(i) + diseaseAllelesM.at(i);
|
||||
}
|
||||
trait2 /= 2.0f;
|
||||
}
|
||||
else{// if(Settings::DiseaseGenesInteraction == "meanmult"){
|
||||
// 2.3<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
for(unsigned int i = 0; i < diseaseAllelesF.size(); i++){
|
||||
trait2 *= (diseaseAllelesF.at(i) + diseaseAllelesM.at(i))/2;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
phenotype->traitsMap["coadaptive"].setTraitValue(trait1);
|
||||
phenotype->traitsMap["disease"].setTraitValue(trait2);
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
#include "KolchShindyalBreedingStrategy.h"
|
||||
#include "../../../../processor/Settings.h"
|
||||
#include "../../../Phenotype.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
void KolchShindyalBreedingStrategy::breed(Population *_pop){
|
||||
// N = const
|
||||
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
// <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>
|
||||
float deathRate = 0.01f; //Settings::DeathRate
|
||||
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><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> !!!
|
||||
// <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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "../../../../population/BreedingStrategies/PopulationBreedingStrategy.h"
|
||||
|
||||
class KolchShindyalBreedingStrategy : public PopulationBreedingStrategy {
|
||||
public:
|
||||
virtual void breed(Population* pop);
|
||||
};
|
||||
@@ -0,0 +1,63 @@
|
||||
#include "KolchShindyalGenotypeToPhenotypeStrategy.h"
|
||||
//#include "../GenotypeToPhenotypeStrategy.h"
|
||||
#include "../../../../processor/Settings.h"
|
||||
#include <cmath>
|
||||
|
||||
void KolchShindyalGenotypeToPhenotypeStrategy::calculatePhenotype(Individual* individ){
|
||||
Genotype* genotype = individ->genotype;
|
||||
Phenotype* phenotype = individ->phenotype;
|
||||
InnerSubstratesPool* substrates = individ->substrateCache;
|
||||
|
||||
// Chromosome 1
|
||||
Chromosome chr1F = individ->genotype->getFatherGenome().getChromosome(0);
|
||||
Chromosome chr1M = individ->genotype->getMotherGenome().getChromosome(0);
|
||||
|
||||
const std::vector<Gene>& genesF = chr1F.getGenesAsVector();
|
||||
const std::vector<Gene>& genesM = chr1M.getGenesAsVector();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float c1m = genesM.at(0).getGeneValueCont();
|
||||
float c2m = genesM.at(1).getGeneValueCont();
|
||||
float c3m = genesM.at(2).getGeneValueCont();
|
||||
float c4m = genesM.at(3).getGeneValueCont();
|
||||
float c5m = genesM.at(4).getGeneValueCont();
|
||||
float Em = genesM.at(5).getGeneValueCont();
|
||||
|
||||
float c1f = genesF.at(0).getGeneValueCont();
|
||||
float c2f = genesF.at(1).getGeneValueCont();
|
||||
float c3f = genesF.at(2).getGeneValueCont();
|
||||
float c4f = genesF.at(3).getGeneValueCont();
|
||||
float c5f = genesF.at(4).getGeneValueCont();
|
||||
float Ef = genesF.at(5).getGeneValueCont();
|
||||
|
||||
float X = 0;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/*
|
||||
// 1) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <09>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int feedBackM = genesM.at(6).getGeneValueDiscr();
|
||||
int feedBackF = genesF.at(6).getGeneValueDiscr();
|
||||
if( (feedBackF+feedBackM) != 0) {
|
||||
X = -c2/2 + sqrt( c2*c2/4 + c5*c2/c3*(E+c4));
|
||||
}
|
||||
else{
|
||||
X = c1/c3*(E+c4);
|
||||
}
|
||||
|
||||
// <09>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
int feedBackM = genesM.at(6).getGeneValueDiscr();
|
||||
int feedBackF = genesF.at(6).getGeneValueDiscr();
|
||||
if( (feedBackF+feedBackM) == 2) {
|
||||
X = -c2/2 + sqrt( c2*c2/4 + c5*c2/c3*(E+c4));
|
||||
}
|
||||
else{
|
||||
X = c1/c3*(E+c4);
|
||||
}
|
||||
|
||||
// 2) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
phenotype->traitsMap["X"].setTraitValue(X);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
#include "../GenotypeToPhenotypeStrategy.h"
|
||||
class KolchShindyalGenotypeToPhenotypeStrategy: public GenotypeToPhenotypeStrategy {
|
||||
public:
|
||||
virtual void calculatePhenotype(Individual*);
|
||||
};
|
||||
@@ -0,0 +1,14 @@
|
||||
#include "KolchShindyalPhenToFitnessStrategy.h"
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
|
||||
double KolchShindyalPhenToFitnessStrategy::calculateFitness(Phenotype *phen){
|
||||
|
||||
double X = phen->getTraitByName("X").getTraitValueCont();
|
||||
double Xopt = phen->getTraitByName("Xopt").getTraitValueCont();
|
||||
double sigmaX = phen->getTraitByName("sigmaX").getTraitValueCont();
|
||||
|
||||
double ans = 1/(sqrt(2*M_PI)) * exp(-0.5*pow((X-Xopt)/sigmaX,2.));
|
||||
|
||||
return ans;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#include "../PhenotypeToFitnessStrategy.h"
|
||||
#include "../../../Phenotype.h"
|
||||
|
||||
class KolchShindyalPhenToFitnessStrategy : public PhenotypeToFitnessStrategy {
|
||||
virtual double calculateFitness(Phenotype* phen);
|
||||
};
|
||||
@@ -0,0 +1,26 @@
|
||||
#include "PhenotypeToFitnessStrategy.h"
|
||||
#include "../../Phenotype.h"
|
||||
#include "InOutBreeding/InOutBreedingPhenToFitStrategy.h"
|
||||
#include "KolchShindyal/KolchShindyalPhenToFitnessStrategy.h"
|
||||
#include <cmath>
|
||||
|
||||
double PhenotypeToFitnessStrategy::calculateFitness(Phenotype *phen){
|
||||
double ans = 0.0;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::map<std::string, Trait>::iterator it;
|
||||
for(it = phen->traitsMap.begin(); it != phen->traitsMap.end(); it++){
|
||||
float trait = it->second.getTraitValueCont();
|
||||
ans += trait*trait;
|
||||
}
|
||||
return std::pow(ans,0.5);
|
||||
}
|
||||
|
||||
PhenotypeToFitnessStrategy* PhenotypeToFitnessStrategy::getInstance(std::string name){
|
||||
if(name.compare("inoutbreeding") == 0){
|
||||
return new InOutBreedingPhenToFitStrategy();
|
||||
}
|
||||
if(name.compare("kolch_shindyal_phen_to_fit") == 0){
|
||||
return new KolchShindyalPhenToFitnessStrategy();
|
||||
}
|
||||
return new PhenotypeToFitnessStrategy();
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
class Phenotype;
|
||||
|
||||
class PhenotypeToFitnessStrategy {
|
||||
public:
|
||||
static PhenotypeToFitnessStrategy* getInstance(std::string);
|
||||
virtual double calculateFitness(Phenotype* phen);
|
||||
};
|
||||
Reference in New Issue
Block a user