void MONEEControlArchitecture::select() { // If the egg has gathered enough genomes or it's time is up, reactivate it with one of the gathered genomes. // Assign subjective fitness to genomes assignFitness(_wm->_genePool); // Do roulette selection (need to sort genomes vector first, because we are calculating medians for logging) std::sort(_wm->_genePool.begin(), _wm->_genePool.end(), genomeSortPredicate); std::vector<Genome>::const_iterator winner = selectWeighted(_wm->_genePool); _wm->_winnerId = winner->id; // Reactivate with the winning genome for (int i = 0; i < _parameterCount; i++) _activeGenome.parameters[i] = winner->parameters[i]; // Mutate a bit mutate(_activeGenome.parameters, 0.1); // Do some logging _wm->dumpGenePoolStats(); }
/** * Select best N of K with the given ordering method */ void selectWithOrdering(SchedOrdering ordering, size_t size, unsigned char *base, size_t nmemb, double(*evaluate)(void *), unsigned char *selected,size_t *selected_len){ if (ordering == SCHED_WEIGHTED) selectWeighted(size, base, nmemb, evaluate, selected, selected_len); else selectBests(size, base, nmemb, evaluate, selected, selected_len); }