• Main Page
  • Modules
  • Classes
  • Files
  • File List

D:/Projekt/ECF_trunk/ECF/AlgSGenGPEA.cpp

00001 #include "ECF_base.h"
00002 #include "ECF_derived.h"
00003 #include "ECF_macro.h"
00004 
00005 #include "AlgSGenGPEA.h"
00006 
00007 const int MASTER = 0;
00008 
00009 
00010 AlgSGenGpea::AlgSGenGpea()
00011 {
00012     name_ = "AlgSGenGPEA";
00013     selFitPropOp = static_cast<SelFitnessProportionalOpP> (new SelFitnessProportionalOp);
00014     selRandomOp = static_cast<SelRandomOpP> (new SelRandomOp);
00015     selBestOp = static_cast<SelBestOpP> (new SelBestOp);
00016 }
00017 
00018 
00019 void AlgSGenGpea::registerParameters(StateP state)
00020 {
00021     double* crxRate = new double(0.5);
00022     state->getRegistry()->registerEntry(name_ + ".crxprob", (voidP) crxRate, ECF::DOUBLE);
00023 
00024     double* selPress = new double(2);
00025     state->getRegistry()->registerEntry(name_ + ".selpressure", (voidP) selPress, ECF::DOUBLE);
00026 
00027     uint* jobSize = new uint(10);
00028     state->getRegistry()->registerEntry(name_ + ".jobsize", (voidP) jobSize, ECF::UINT);
00029 }
00030 
00031 
00032 bool AlgSGenGpea::initialize(StateP state)
00033 {
00034     selFitPropOp->initialize(state);
00035     selRandomOp->initialize(state);
00036     selBestOp->initialize(state);
00037 
00038     voidP crRateP = state->getRegistry()->getEntry(name_ + ".crxprob");
00039     crxRate = *((double*) crRateP.get());
00040 
00041     voidP selPressP = state->getRegistry()->getEntry(name_ + ".selpressure");
00042     selPressure = *((double*) selPressP.get());
00043     selFitPropOp->setSelPressure(selPressure);
00044 
00045     voidP jobSizeP = state->getRegistry()->getEntry(name_ + ".jobsize");
00046     jobSize = *((uint*) jobSizeP.get());
00047 
00048     if(state->getCommunicator()->getCommRank() != MASTER) {
00049         myJob.resize(0);
00050     }
00051 
00052     return true;
00053 }
00054 
00055 
00056 bool AlgSGenGpea::advanceGeneration(StateP state, DemeP deme)
00057 {
00058     CommunicatorP comm = state->getCommunicator();
00059 
00060     if(comm->getCommRank() == MASTER) {
00061 
00062         // elitism
00063         IndividualP best = selBestOp->select(*deme);
00064         best = copy(best);
00065 
00066         std::vector<IndividualP> wheel;
00067         wheel = selFitPropOp->selectMany(*deme, (uint) deme->size());
00068 
00069         for(uint i = 0; i < wheel.size(); ++i) 
00070             wheel[i] = copy(wheel[i]);
00071 
00072         // replace population
00073         for(uint i = 0; i < deme->size(); i++)
00074             replaceWith(deme->at(i), wheel[i]);
00075 
00076         ECF_LOG(state, 5, "Selected individuals:");
00077         for(uint i = 0; i < deme->size(); i++){
00078             ECF_LOG(state, 5, dbl2str(deme->at(i)->fitness->getValue()));
00079         }
00080 
00081         uint noCrx = (int)(deme->size() * crxRate /2);
00082 
00083         for(uint i = 0; i < noCrx; i++){
00084             IndividualP parent1 = selRandomOp->select(*deme);
00085             IndividualP parent2 = selRandomOp->select(*deme);
00086             ECF_LOG(state, 5, "Parents: " + dbl2str(parent1->fitness->getValue()) + ", " + dbl2str(parent2->fitness->getValue()));
00087             IndividualP child1 = copy(parent1);
00088             IndividualP child2 = copy(parent2);
00089             mate(parent1, parent2, child1);
00090             mate(parent1, parent2, child2);
00091             replaceWith(parent1, child1);
00092             replaceWith(parent2, child2);
00093         }
00094 
00095         // perform mutation on whole population
00096         mutate(*deme);
00097 
00098         // prepare vector of individuals to evaluate
00099         std::vector<IndividualP> pool, job;
00100         for(uint i = 0; i < deme->size(); i++)
00101             if(!deme->at(i)->fitness->isValid()) 
00102                 pool.push_back(deme->at(i));
00103 
00104         // while all individuals not sent
00105         uint current = 0, remaining = (uint) pool.size();
00106         while(current < pool.size()) {
00107             // if a worker is ready, receive and send new job
00108             if(comm->messageWaiting()) {
00109                 // receive fitness objects, increase total number of evaluations
00110                 uint received = comm->recvDemeFitness(*deme, Comm::ANY_PROCESS);
00111                 state->increaseEvaluations(received);
00112                 remaining -= received;
00113 
00114                 uint iWorker = comm->getLastSource();
00115                 job.resize(0);
00116                 for(uint i = 0; i < jobSize && current < pool.size(); i++, current++)
00117                     job.push_back(pool[current]);
00118                 comm->sendIndividuals(job, iWorker);
00119             }
00120             // otherwise, do something useful
00121             else {
00122                 evaluate(pool[current]);
00123                 current++;
00124                 remaining--;
00125             }
00126         }
00127 
00128         // while all individuals not received
00129         job.resize(0);
00130         uint remainingWorkers = comm->getCommSize() - 1;
00131         while(remaining > 0 || remainingWorkers > 0) {
00132             uint received = comm->recvDemeFitness(*deme, Comm::ANY_PROCESS);
00133             state->increaseEvaluations(received);
00134             remaining -= received;
00135 
00136             uint iWorker = comm->getLastSource();
00137             comm->sendIndividuals(job, iWorker);
00138             remainingWorkers--;
00139         }
00140 
00141         // elitism
00142         IndividualP random = selRandomOp->select(*deme);
00143         if(best->fitness->isBetterThan(random->fitness))
00144             replaceWith(random, best);
00145 
00146         for(uint i = 0; i < deme->size(); i++){
00147             ECF_LOG(state, 5, "deme[" + uint2str(i) + "]: " + dbl2str(deme->at(i)->fitness->getValue()));
00148         }
00149     }
00150 
00151     // WORKER
00152     else {
00153         std::vector<IndividualP> empty;
00154         empty.resize(0);
00155         comm->sendFitness(empty, MASTER);
00156 
00157         uint myJobSize;
00158         myJobSize = comm->recvReplaceIndividuals(myJob, MASTER);
00159 
00160         // while individuals to evaluate
00161         while(myJobSize > 0) {
00162             for(uint i = 0; i < myJobSize; i++)
00163                 evaluate(myJob[i]);
00164 
00165             comm->sendFitness(myJob, MASTER, myJobSize);
00166 
00167             myJobSize = comm->recvReplaceIndividuals(myJob, MASTER);
00168         }
00169     }
00170 
00171     return true;
00172 }

Generated on Tue Nov 4 2014 13:04:30 for ECF by  doxygen 1.7.1