#include "VerhulstBreedingStrategy.h" #include "../../processor/Settings.h" #include #include #include #include void VerhulstBreedingStrategy::breed(Population *_pop) { // Уравнение Ферхюльста // rX * (1 - X/K) = rX - (r/K)X^2 double birthRate = Settings::BirthRate;// 0.03; double r = 1 + birthRate; double K = _pop->region->getCapacity(); AsexualPopulation* pop = dynamic_cast(_pop); if(pop == NULL){ std::cerr<<"Wrong dynamic cast to AsexualPopulation\n"; return; } long int inds = pop->individs.size(); long int toDie = (long int) inds*inds * r/K + 0.5; // 0.5 - поправочный коэффициент из-за особенностей long int toBorn = (long int) inds*birthRate + 0.5; // округления // Меняя очерёдность удаления лузеров и размножения, можно добиться разного // смысла приспособленности - либо повышенной фертильности, либо лучшей доживаемости // Выбираем лузеров и удаляем их std::sort(pop->individs.begin(), pop->individs.end(), compareOnFitness); std::vector::iterator start = pop->individs.begin(); std::vector::iterator end = pop->individs.begin()+toDie; for(std::vector::iterator it = start; it != end; it++){ delete *it; } pop->individs.erase(start, end); std::cout<<"VerhulstBreedingStrategy::breed: "<individs.size(); srand((unsigned int)time(NULL)); for(long 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); } }