#include "InOutBreedingPopulationBreedingStrategy.h" #include "../../../../processor/Settings.h" #include "../../../Phenotype.h" #include #include #include #include void InOutBreedingPopulationBreedingStrategy::breed(Population *_pop){ // N = const AsexualPopulation* pop = dynamic_cast(_pop); if(pop == NULL){ std::cerr<<"Wrong dynamic cast to AsexualPopulation\n"; return; } srand((unsigned int)time(NULL)); int offsprings = Settings::OffspringsMean; std::vector 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; } // Добавляем потомков в эффективную популяцию for(int i = 0; i < offsprings; i++){ Individual* ind = new Individual(*(pop->individs.at(motherIndex)), *(pop->individs.at(fatherIndex))); // Проверяем его генотип и приспособленность ind->calculatePhenotype(); Phenotype phen = ind->getPhenotype(); float coadapt = phen.getTraitByName("coadaptive").getTraitValueCont(); float disease = phen.getTraitByName("disease").getTraitValueCont(); if(disease > Settings::DiseaseThreshold){ // По болезни сразу отсекаем float probSurvive = 1.f; if(coadapt < Settings::CoadaptiveThreshold){ // TODO: Более непрерывно сделать позже 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){ // Здесь по необходимости добавляем настройки среды и т.д. newIndivids.push_back(ind); } } } // (END) for(int i = 0; i < offsprings; i++) // Удаляем родителей из эффективной популяции 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); } // Удаляем оставшихся родителей 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) // Делаем потомков эффективной популяцией pop->individs.insert(pop->individs.begin(), newIndivids.begin(), newIndivids.end()); }