00001
00020 #include "select.h"
00021 #include <realea/common/random.h>
00022 #include <realea/common/distance.h>
00023 #include <cassert>
00024
00025 using namespace realea;
00026
00027 SelectNAM::SelectNAM(unsigned nam) : m_num(nam) {
00028 assert(m_num > 0);
00029 }
00030
00031 void SelectNAM::select(PopulationRealPtr pop, unsigned *pmom, unsigned *pdad) {
00032 int max = pop->size();
00033 int ndim = pop->ndim();
00034 tIndividualReal *mom, *elem;
00035 unsigned pos_mom, pos_elem, pos_best=0;
00036 double dist, best_dist;
00037 bool checkGen[ndim];
00038
00039 m_domain->getSearchDomain(checkGen, ndim);
00040 fill(checkGen, checkGen+ndim, true);
00041
00042 assert(m_num > 0);
00043 int sample[max];
00044
00045 initSample(sample, max);
00046 pos_mom = m_random->getSample(sample, &max);
00047 mom = pop->getInd(pos_mom);
00048
00049 for (unsigned i = 0; i < m_num; ++i) {
00050 pos_elem = m_random->getSample(sample, &max);
00051 elem = pop->getInd(pos_elem);
00052 dist = distreal(mom->sol(), elem->sol(), checkGen);
00053
00054 if (i == 0 || (dist > best_dist) ) {
00055 pos_best = pos_elem;
00056 best_dist = dist;
00057 }
00058 }
00059
00060 *pmom = pos_mom;
00061 *pdad = pos_best;
00062 }
00063
00064 SelectTournament::SelectTournament(unsigned nam) : m_num(nam) {
00065 assert(m_num > 0);
00066 }
00067
00079 tIndividualRealPtr applyTournament(PopulationRealPtr pop, unsigned tournament_size, Random *random, int *positions, int *maxpos) {
00080 tIndividualRealPtr ind;
00081
00082 int posi = random->getSample(positions, maxpos);
00083 tIndividualRealPtr best = pop->getInd(posi);
00084
00085 for (unsigned i = 1; i < tournament_size; i++) {
00086 posi = random->getSample(positions, maxpos);
00087 ind = pop->getInd(posi);
00088
00089 if (ind->isBetter(best)) {
00090 best = ind;
00091 }
00092 }
00093
00094 return ind;
00095 }
00096
00097 void SelectTournament::select(PopulationRealPtr pop, unsigned *pmom, unsigned *pdad) {
00098 int max = pop->size();
00099 int positions[max];
00100 tIndividualReal *mom, *dad;
00101 initSample(positions, max);
00102
00103 mom = applyTournament(pop, m_num, m_random, positions, &max);
00104 dad = applyTournament(pop, m_num, m_random, positions, &max);
00105
00106 *pmom = mom->getId();
00107 *pdad = dad->getId();
00108 }