00001 00020 #ifndef _IEA_H 00021 00022 #define _IEA_H 1 00023 00024 #include "problem.h" 00025 #include "random.h" 00026 #include "populationreal.h" 00027 #include "statistics.h" 00028 #include "cross.h" 00029 00030 using namespace std; 00031 00032 namespace realea { 00033 00034 namespace internal { 00035 class EvalRunning : public IEvalInd { 00036 public: 00037 EvalRunning(IEval *eval, Running *m_running): m_eval(eval), m_running(m_running) { 00038 } 00039 00040 tFitness eval(const tChromosomeReal &sol) { 00041 tFitness fit = m_eval->eval(sol); 00042 m_running->notifyEval(fit); 00043 return fit; 00044 } 00045 00046 unsigned eval(tIndividualReal *newind) { 00047 newind->eval(this); 00048 return 1; 00049 } 00050 ~EvalRunning(void) {} 00051 00052 private: 00053 IEval *m_eval; 00054 Running *m_running; 00055 }; 00056 } 00057 00058 00059 class IEAlgorithm : public Resetable { 00060 public: 00064 virtual unsigned getDefaultPopsize(void)=0; 00065 00069 virtual unsigned init(void)=0; 00070 00077 virtual unsigned realApply(tChromosomeReal &sol, tFitness &fitness)=0; 00078 00084 virtual void setPopsize(unsigned int popsize)=0; 00085 00086 virtual void setRandom(Random *random)=0; 00087 00088 virtual Random *getRandom(void)=0; 00089 00090 virtual void setProblem(Problem *problem)=0; 00091 00092 virtual void setRunning(Running *running)=0; 00093 virtual RunningPtr getRunning(void)=0; 00094 virtual void setStat(Statistics *stat)=0; 00095 00101 virtual void setMaxEval(unsigned int maxeval)=0; 00102 virtual unsigned getMaxEval(void)=0; 00103 00109 virtual void reset(void)=0; 00110 00111 virtual PopulationReal *getPop(void)=0; 00112 00113 virtual void setNewEval(IEval*eval)=0; 00114 00115 virtual void setInitEval(IEval*eval)=0; 00116 00117 00129 virtual void storeIndividual(tIndividualRealPtr ind, tGen **paind, unsigned *pmax, tGen **paditional, unsigned *pmaxad)=0; 00130 00142 virtual void recoverIndividual(unsigned posind, tGen *aind, unsigned size, tGen *aoptional, unsigned size_optional) = 0; 00143 }; 00144 00145 typedef IEAlgorithm IEA; 00146 00147 00148 class ClassEAlgorithm : public IEAlgorithm { 00149 public: 00150 00151 00155 virtual unsigned getDefaultPopsize(void)=0; 00156 00166 virtual unsigned realApply(tChromosomeReal &sol, tFitness &fitness)=0; 00167 00173 virtual void setPopsize(unsigned int popsize); 00174 00175 ClassEAlgorithm(Random *random); 00176 00177 void setRandom(Random *random) { 00178 m_random = random; 00179 } 00180 00181 Random *getRandom(void) { 00182 return m_random; 00183 } 00184 00185 00186 void setProblem(Problem *problem) { 00187 m_problem = problem; 00188 } 00189 00190 void setRunning(Running *running); 00191 RunningPtr getRunning(void); 00192 00198 void setStat(Statistics *stat) { 00199 m_stat = stat; 00200 } 00201 00207 void setMaxEval(unsigned int maxeval); 00208 00209 00210 unsigned getMaxEval(void); 00211 00212 00213 virtual ~ClassEAlgorithm(void); 00214 00215 virtual void setNewEval(IEval*eval); 00216 00217 virtual void setInitEval(IEval*eval); 00218 00219 virtual void reset(void); 00220 00221 virtual PopulationReal *getPop(void) { 00222 return m_pop; 00223 } 00224 00236 virtual void storeIndividual(tIndividualRealPtr ind, tGen **paind, unsigned *pmax, tGen **paoptional, unsigned *psize_optional); 00237 00238 virtual void recoverIndividual(unsigned pos, tGen *aind, unsigned size, tGen *aoptional, unsigned size_optional); 00239 00240 protected: 00241 Problem *m_problem; 00242 IEvalInd *m_init_eval; 00243 IEvalInd *m_new_eval; 00245 RunningPtr m_running; 00246 PopulationReal *m_pop; 00247 Random *m_random; 00248 Statistics *m_stat; 00249 unsigned m_maxeval; 00250 }; 00251 00252 00253 class ICrossEAlgorithm : public ClassEAlgorithm { 00254 public: 00255 ICrossEAlgorithm(Random *random); 00256 00262 virtual void setCross(ICrossBinaryPtr cross); 00263 00264 virtual ~ICrossEAlgorithm(void); 00265 00266 virtual void setProblem(Problem *problem); 00267 virtual void reset(void); 00268 00269 protected: 00270 internal::CrossBinaryPtr m_cross; 00271 ICrossBinaryPtr m_icross; 00272 }; 00273 00274 } 00275 #endif