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
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
00121 else {
00122 evaluate(pool[current]);
00123 current++;
00124 remaining--;
00125 }
00126 }
00127
00128
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
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
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
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 }