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
00067
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
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
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
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
00130
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
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
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