Init version
This commit is contained in:
@@ -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