#include "../GenotypeToPhenotypeStrategy.h" #include "../../../../processor/Settings.h" #include 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& genesF = chr1F.getGenesAsVector(); const std::vector& genesM = chr1M.getGenesAsVector(); // Коадаптивные аллели 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) Коадаптивные аллели // Аллели болезни std::vector diseaseAllelesF(4); std::vector 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) Аллели болезни // Комбинаторика float trait1 = 0, trait2 = 0; float a, b; // 1) Коадаптивные гены if(Settings::CoadaptiveGenesInteraction == "onechromosome"){ // 1.1 Работают гены с одной только хромосомы a = a1; b = b1; } else if(Settings::CoadaptiveGenesInteraction == "mean"){ // 1.2 Среднее проявление признака a = 0.5f*(a1+a2); b = 0.5f*(b1+b2); } else{ // Settings::CoadaptiveGenesInteraction == "maxmodule" // 1.3 Максимум модуля a = std::fabs(a1) >= std::fabs(a2) ? a1 : a2; b = std::fabs(b1) >= std::fabs(b2) ? b1 : b2; } // Признак 1 trait1 = std::max(a*b - (fabs(a*a*a) + fabs(b*b*b))/20, 0.0f); //trait1 = std::max(a*b - (a*a*a*a + b*b*b*b)/250, 0.0f); // 2) Гены болезни if(Settings::DiseaseGenesInteraction == "add1"){ // 2.1а Аддитивно 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б Аддитивно (альт) 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 Мультипликативно 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а Среднее значение (аддитивно) 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б Среднее значение (мультипликативно) for(unsigned int i = 0; i < diseaseAllelesF.size(); i++){ trait2 *= (diseaseAllelesF.at(i) + diseaseAllelesM.at(i))/2; } } // Признаки передаются в фенотип phenotype->traitsMap["coadaptive"].setTraitValue(trait1); phenotype->traitsMap["disease"].setTraitValue(trait2); }