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
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
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
00096 mutate(*deme);
00097
00098
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
00105 uint current = 0, remaining = (uint) pool.size();
00106 while(current < pool.size()) {
00107
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
00117 else {
00118 evaluate(pool[current]);
00119 current++;
00120 remaining--;
00121 }
00122 }
00123
00124
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
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
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
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 }