Init version

This commit is contained in:
2024-10-03 18:43:04 +07:00
commit f80052961f
186 changed files with 71676 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -0,0 +1,7 @@
#pragma once
#include "../PhenotypeToFitnessStrategy.h"
class InOutBreedingPhenToFitStrategy : public PhenotypeToFitnessStrategy {
virtual double calculateFitness(Phenotype* phen);
};

View File

@@ -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());
}

View File

@@ -0,0 +1,8 @@
#pragma once
#include "../../../../population/BreedingStrategies/PopulationBreedingStrategy.h"
class InOutBreedingPopulationBreedingStrategy : public PopulationBreedingStrategy {
public:
virtual void breed(Population* pop);
};

View File

@@ -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);
}