• 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, send job
00108             if(comm->messageWaiting()) {
00109                 remaining -= comm->recvDemeFitness(*deme, Comm::ANY_PROCESS);
00110                 uint iWorker = comm->getLastSource();
00111                 job.resize(0);
00112                 for(uint i = 0; i < jobSize && current < pool.size(); i++, current++)
00113                     job.push_back(pool[current]);
00114                 comm->sendIndividuals(job, iWorker);
00115             }
00116             // otherwise, do something useful
00117             else {
00118                 evaluate(pool[current]);
00119                 current++;
00120                 remaining--;
00121             }
00122         }
00123 
00124         // while all individuals not received
00125         job.resize(0);
00126         uint remainingWorkers = comm->getCommSize() - 1;
00127         while(remaining > 0 || remainingWorkers > 0) {
00128             remaining -= comm->recvDemeFitness(*deme, Comm::ANY_PROCESS);
00129 
00130             uint iWorker = comm->getLastSource();
00131             comm->sendIndividuals(job, iWorker);
00132             remainingWorkers--;
00133         }
00134 
00135         // elitism
00136         IndividualP random = selRandomOp->select(*deme);
00137         if(best->fitness->isBetterThan(random->fitness))
00138             replaceWith(random, best);
00139 
00140         for(uint i = 0; i < deme->size(); i++){
00141             ECF_LOG(state, 5, "deme[" + uint2str(i) + "]: " + dbl2str(deme->at(i)->fitness->getValue()));
00142         }
00143     }
00144 
00145     // WORKER
00146     else {
00147         std::vector<IndividualP> empty;
00148         empty.resize(0);
00149         comm->sendFitness(empty, MASTER);
00150 
00151         uint myJobSize;
00152         myJobSize = comm->recvReplaceIndividuals(myJob, MASTER);
00153 
00154         // while individuals to evaluate
00155         while(myJobSize > 0) {
00156             for(uint i = 0; i < myJobSize; i++)
00157                 evaluate(myJob[i]);
00158 
00159             comm->sendFitness(myJob, MASTER, myJobSize);
00160 
00161             myJobSize = comm->recvReplaceIndividuals(myJob, MASTER);
00162         }
00163     }
00164 
00165     return true;
00166 }

Generated on Thu Oct 6 2011 13:40:59 for ECF by  doxygen 1.7.1