#include "PopulationBreedingStrategy.h" #include "VerhulstBreedingStrategy.h" #include "NeutralEvolutionBreedStrat.h" #include "../../individual/genome/strategies/InOutBreeding/InOutBreedingPopulationBreedingStrategy.h" #include "../../individual/genome/strategies/KolchShindyal/KolchShindyalBreedingStrategy.h" #include "../../processor/Settings.h" //#include #include #include #include #include void PopulationBreedingStrategy::breed(Population* _pop){ float deathRate = Settings::NaturalDeathRate;//0.01f; // Коэффициент смертности // Выбираем лузеров и удаляем их AsexualPopulation* pop = dynamic_cast(_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(); // По идее, смертность надо моделировать в разделе SelectionAll // а тут надо какой-то механизм дифференцированной плодовитости // описать int toDie = int (inds * deathRate); std::vector::iterator start = pop->individs.begin(); std::vector::iterator end = pop->individs.begin()+toDie; //advance(end,toDie); for(std::vector::iterator it = start; it != end; it++){ delete *it; } pop->individs.erase(start, end); std::cout<<"PopulationBreedingStrategy::breed: "<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))); // Здесь по необходимости добавляем настройки среды и т.д. pop->individs.push_back(ind); } } PopulationBreedingStrategy* PopulationBreedingStrategy::getInstance(std::string name){ if(name.compare("Verhulst") == 0){ return new VerhulstBreedingStrategy(); } if(name.compare("inoutbreeding") == 0){ return new InOutBreedingPopulationBreedingStrategy(); } if(name.compare("kolchan_shindyal_breeding") == 0){ return new KolchShindyalBreedingStrategy(); } if(name.compare("neutral") == 0){ return new NeutralEvolutionBreedingStrategy(); } return new PopulationBreedingStrategy(); }