53 lines
1.8 KiB
C++
53 lines
1.8 KiB
C++
#include "VerhulstBreedingStrategy.h"
|
|
#include "../../processor/Settings.h"
|
|
#include <algorithm>
|
|
#include <iostream>
|
|
#include <cstdlib>
|
|
#include <ctime>
|
|
|
|
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<AsexualPopulation*>(_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<Individual*>::iterator start = pop->individs.begin();
|
|
std::vector<Individual*>::iterator end = pop->individs.begin()+toDie;
|
|
for(std::vector<Individual*>::iterator it = start; it != end; it++){
|
|
delete *it;
|
|
}
|
|
pop->individs.erase(start, end);
|
|
std::cout<<"VerhulstBreedingStrategy::breed: "<<toDie<<" individs have died\n";
|
|
|
|
// Ðîæàåì íîâûõ îñîáåé
|
|
inds = pop->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);
|
|
}
|
|
|
|
}
|