00001 #ifndef Algorithm_h
00002 #define Algorithm_h
00003
00004 #include "State.h"
00005 #include "SelectionOperator.h"
00006 #include "Crossover.h"
00007 #include "Mutation.h"
00008 #include "EvaluateOp.h"
00009 #include<vector>
00010
00018 class Algorithm
00019 {
00020 protected:
00021 DemeP activeDeme_;
00022 std::string name_;
00023 bool bImplicitParallel_;
00024 std::vector<SelectionOperatorP> selectionOp;
00025 StateP state_;
00026
00035 bool registerParameter(StateP state, std::string name, voidP value, enum ECF::type T)
00036 {
00037 return state->getRegistry()->registerEntry(name_ + "." + name, value, T);
00038 }
00039
00046 voidP getParameterValue(StateP state, std::string name)
00047 {
00048 return state->getRegistry()->getEntry(name_ + "." + name);
00049 }
00050
00051 #ifdef _MPI
00052 std::vector<IndividualP> requests_, stored_;
00053 std::vector<uint> requestIds_;
00054 std::vector<IndividualP> demeCopy_;
00055 std::vector<IndividualP> myJob_;
00056 CommunicatorP comm_;
00057 uint jobSize_;
00058 uint totalEvaluations_, wastedEvaluations_;
00059 bool bImplicitEvaluation_;
00060 bool bImplicitMutation_;
00061 bool bSynchronized_;
00062 SelectionOperatorP selBestOp;
00063 std::vector<IndividualP> requestsMut_, receivedMut_;
00064 std::vector<uint> requestMutIds_;
00065 IndividualP currentBest_;
00066
00067 std::vector<IndividualP> storedInds_;
00068 std::vector< std::vector<IndividualP> > sentInds_;
00069 std::vector<bool> isConsistent_;
00070
00071 void storeIndividual(IndividualP);
00072 void storeGenotypes(std::vector<IndividualP>&);
00073 void setConsistency(IndividualP);
00074 void restoreIndividuals(std::vector<uint>);
00075 void restorePopulation();
00076 #endif
00077
00078
00079 public:
00080 CrossoverP crossover_;
00081 MutationP mutation_;
00082 EvaluateOpP evalOp_;
00083
00084 Algorithm()
00085 { bImplicitParallel_ = false; }
00086
00087 virtual ~Algorithm()
00088 { }
00089
00090 std::string getName()
00091 { return name_; }
00092
00093 virtual bool isParallel()
00094 { return false; }
00095
00096 bool isImplicitParallel()
00097 { return bImplicitParallel_; }
00098
00104 virtual bool advanceGeneration(StateP, DemeP) = 0;
00105
00111 virtual bool initialize(StateP)
00112 { return true; }
00113
00119 virtual void registerParameters(StateP) {}
00120
00124 virtual bool initializePopulation(StateP);
00125
00126 virtual void read() {}
00127
00128 #ifndef _MPI
00129
00135 virtual bool advanceGeneration(StateP state)
00136 {
00137 bool bResult = true;
00138 for(uint iDeme = 0; iDeme < state->getPopulation()->size(); iDeme++) {
00139 activeDeme_ = state->getPopulation()->at(iDeme);
00140 bResult |= advanceGeneration(state, state->getPopulation()->at(iDeme));
00141 }
00142 return bResult;
00143 }
00144
00148 void evaluate(IndividualP ind)
00149 { ind->fitness = evalOp_->evaluate(ind); }
00150
00154 uint mutate(const std::vector<IndividualP>& pool)
00155 { return mutation_->mutation(pool); }
00156
00160 uint mutate(const IndividualP victim)
00161 {
00162 std::vector<IndividualP> pool;
00163 pool.push_back(victim);
00164 return mutation_->mutation(pool);
00165 }
00166
00172 void replaceWith(IndividualP oldInd, IndividualP newInd)
00173 { activeDeme_->replace(oldInd->index, newInd); }
00174
00175 void registerParallelParameters(StateP state)
00176 { }
00177
00178 bool initializeParallel(StateP state)
00179 { return true; }
00180
00181 #else // implicit parallel version
00182
00186 virtual bool advanceGeneration(StateP state);
00187
00191 virtual void bcastTermination(StateP state);
00192
00196 void registerParallelParameters(StateP state);
00197
00201 bool initializeParallel(StateP state);
00202
00203 void initializeImplicit(StateP state);
00204
00208 bool implicitParallelOperate(StateP state);
00209
00213 void evaluate(IndividualP ind)
00214 {
00215
00216 if(bImplicitEvaluation_)
00217 implicitEvaluate(ind);
00218
00219 else if(bImplicitMutation_ && ind->fitness->isValid())
00220 return;
00221 else
00222 ind->fitness = evalOp_->evaluate(ind);
00223 }
00224
00228 void implicitEvaluate(IndividualP ind);
00229
00233 uint mutate(const IndividualP victim)
00234 {
00235 std::vector<IndividualP> pool;
00236 pool.push_back(victim);
00237 return mutate(pool);
00238 }
00239
00243 uint mutate(const std::vector<IndividualP>& pool)
00244 {
00245 if(bImplicitMutation_) {
00246 uint nMutations = 0;
00247 for(uint i = 0; i < pool.size(); i++) {
00248 nMutations += implicitMutate(pool[i]);
00249 }
00250 return nMutations;
00251 }
00252 else
00253 return mutation_->mutation(pool);
00254 }
00255
00259 uint implicitMutate(IndividualP ind);
00260
00264 void replaceWith(IndividualP oldInd, IndividualP newInd);
00265
00266 #endif
00267
00268
00269
00273 bool mate(IndividualP p1, IndividualP p2, IndividualP child)
00274 { return crossover_->mate(p1, p2, child); }
00275
00279 IndividualP copy(IndividualP source)
00280 { return (IndividualP) source->copy(); }
00281
00285 bool removeFrom(IndividualP victim, std::vector<IndividualP> &pool)
00286 {
00287 uint iWorst = 0;
00288 while(iWorst < pool.size() && pool[iWorst] != victim)
00289 iWorst++;
00290 if(iWorst == pool.size())
00291 return false;
00292 pool.erase(pool.begin() + iWorst);
00293 return true;
00294 }
00295
00299 bool isMember(IndividualP single, std::vector<IndividualP> &pool)
00300 {
00301 uint index = 0;
00302 while(index < pool.size() && pool[index] != single)
00303 index++;
00304 if(index == pool.size())
00305 return false;
00306 return true;
00307 }
00308 };
00309 typedef boost::shared_ptr<Algorithm> AlgorithmP;
00310
00311 #endif // Algorithm_h
00312