• Main Page
  • Classes
  • Files
  • File List

D:/Radagast_D/Projekt/ECF_trunk/ECF/Algorithm.h

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_;                  //<! last consistent version of an individual
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         // implicit evaluation
00216         if(bImplicitEvaluation_)
00217             implicitEvaluate(ind);
00218         // if implicit mutation is active, check is evaluation needed
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 // common functions (serial and parallel)
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 

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