• Main Page
  • Classes
  • Files
  • File List

D:/Radagast_D/Projekt/ECF_trunk/ECF/Migration.cpp

00001 #include "ECF_base.h"
00002 #include "ECF_derived.h"
00003 
00004 #include "Migration.h"
00005 
00006 
00007 void Migration::registerParameters(StateP state)
00008 {
00009     uint* freq = new uint(0);
00010     state->getRegistry()->registerEntry("migration.freq", (voidP) freq, ECF::UINT);
00011 
00012     uint* num = new uint(1);
00013     state->getRegistry()->registerEntry("migration.number", (voidP) num, ECF::UINT);
00014 }
00015 
00016 
00017 bool Migration::initialize(StateP state)
00018 {
00019     state_ = state;
00020 
00021     voidP sptr = state->getRegistry()->getEntry("migration.freq");
00022     migFrequency_ = *((uint*) sptr.get());
00023 
00024     if(migFrequency_ == 0 && state->getPopulation()->getNoDemes() > 1) {
00025         state->getLogger()->log(1, "Warning: migration operator is not configured (migration will not occur between demes).");
00026     }
00027 
00028     if(migFrequency_ == 0)
00029         return true;
00030 
00031     sptr = state->getRegistry()->getEntry("migration.number");
00032     nEmigrants_ = *((uint*) sptr.get());
00033 
00034     if(nEmigrants_ >= state->getPopulation()->getLocalDeme()->getSize()) {
00035         state->getLogger()->log(1, "Error: number of emmigrants greater than deme size!");
00036         throw "";
00037     }
00038 
00039     if(state->getPopulation()->getNoDemes() == 1) {
00040         state->getLogger()->log(1, "Warning: migration operator not applicable with a single deme population!");
00041         migFrequency_ = 0;
00042     }
00043 
00044     selOp_.push_back(static_cast<SelectionOperatorP> (new SelBestOp));
00045     selOp_.push_back(static_cast<SelectionOperatorP> (new SelRandomOp));
00046 
00047     selOp_[BEST]->initialize(state);
00048     selOp_[RANDOM]->initialize(state);
00049 
00050     return true;
00051 }
00052 
00053 
00054 #ifndef _MPI
00055 
00056 bool Migration::operate(StateP state)
00057 {
00058     if(migFrequency_ == 0 || state->getGenerationNo() % migFrequency_ != 0)
00059         return true;
00060 
00061     std::vector< std::vector<IndividualP> > outPool_, inPool_;
00062     outPool_.resize(state->getPopulation()->getNoDemes());
00063     inPool_.resize(state->getPopulation()->getNoDemes());
00064 
00065     //
00066     // emigrant selection: best + random
00067     // emigrant no: 'nEmigrants' parameter
00068     //
00069     for(uint iDeme = 0; iDeme < state->getPopulation()->getNoDemes(); iDeme++) {
00070 
00071         DemeP myDeme = state->getPopulation()->at(iDeme);
00072         std::vector<IndividualP> emigrants;
00073         IndividualP myBest = selOp_[BEST]->select(*myDeme);
00074         emigrants.push_back(myBest);
00075         for(uint i = 1; i < nEmigrants_; i++)
00076             emigrants.push_back(selOp_[RANDOM]->select(*myDeme));
00077 
00078         outPool_[iDeme] = emigrants;
00079     }
00080 
00081     // copy selected individuals
00082     for(uint i = 0; i < outPool_.size(); i++)
00083         for(uint j = 0; j < outPool_[i].size(); j++)
00084             outPool_[i][j] = (IndividualP) outPool_[i][j]->copy();
00085 
00086     //
00087     // topology: ring
00088     //
00089     for(uint iDeme = 0; iDeme < state->getPopulation()->getNoDemes(); iDeme++) {
00090 
00091         uint destDeme = (iDeme + 1) % state->getPopulation()->getNoDemes();
00092         inPool_[destDeme] = outPool_[iDeme];
00093     }
00094 
00095     //
00096     // replacement: random (protect the best)
00097     //
00098     for(uint iDeme = 0; iDeme < state->getPopulation()->getNoDemes(); iDeme++) {
00099 
00100         DemeP myDeme = state->getPopulation()->at(iDeme);
00101         IndividualP myBest = selOp_[BEST]->select(*myDeme);
00102         std::vector<IndividualP> immigrants = inPool_[iDeme];
00103         state->getLogger()->log(4, "Received inds fitness: " + dbl2str(immigrants[0]->fitness->getValue()));
00104 
00105         for(int i = (int) immigrants.size() - 1; i >= 0; i--) {
00106             IndividualP victim;
00107             do
00108                 victim = selOp_[RANDOM]->select(*myDeme);
00109             while(victim == myBest);
00110 
00111             state->getAlgorithm()->replaceWith(victim, immigrants[i]);
00112         }
00113     }
00114 
00115     return true;
00116 }
00117 
00118 
00119 #else // _MPI
00120 
00121 bool Migration::operate(StateP state)
00122 {
00123     if(migFrequency_ == 0 || state->getGenerationNo() % migFrequency_ != 0)
00124         return true;
00125 
00126     CommunicatorP comm = state->getCommunicator();
00127 
00128     //
00129     // emigrant selection: best + random
00130     // emigrant no: 'nEmigrants' parameter
00131     //
00132     DemeP myDeme = state->getPopulation()->at(0);
00133     std::vector<IndividualP> emigrants;
00134     IndividualP myBest = selOp_[BEST]->select(*myDeme);
00135     emigrants.push_back(myBest);
00136     for(uint i = 1; i < nEmigrants_; i++)
00137         emigrants.push_back(selOp_[RANDOM]->select(*myDeme));
00138 
00139     //
00140     // topology: ring
00141     //
00142     uint destDeme = (state->getPopulation()->getDemeId() + 1) % state->getPopulation()->getNoDemes();
00143     uint destProcess = comm->getDemeMaster(destDeme);
00144     comm->sendIndividualsGlobal(emigrants, destProcess);
00145 
00146     //
00147     // replacement: random (protect the best)
00148     //
00149     std::vector<IndividualP> immigrants = comm->recvIndividualsGlobal();
00150     state->getLogger()->log(3, "Received inds fitness: " + dbl2str(immigrants[0]->fitness->getValue()));
00151 
00152     for(int i = (int) immigrants.size() - 1; i >= 0; i--) {
00153         IndividualP victim;
00154         do
00155             victim = selOp_[RANDOM]->select(*myDeme);
00156         while(victim == myBest);
00157 
00158         state->getAlgorithm()->replaceWith(victim, immigrants[i]);
00159     }
00160 
00161     return true;
00162 }
00163 
00164 #endif // _MPI

Generated on Wed Sep 1 2010 14:31:21 for ECF by  doxygen 1.7.1