00001 00020 #ifndef _HYBRID_H 00021 00022 #define _HYBRID_H 1 00023 00024 #include <realea/common/iea.h> 00025 #include <realea/common/random.h> 00026 #include <realea/common/ilocalsearch.h> 00027 00028 namespace realea { 00029 00037 class ProxyEA : public IEAlgorithm { 00038 public: 00039 ProxyEA(IEAlgorithm *alg) : m_alg(alg) {} 00040 00041 unsigned getDefaultPopsize(void) { 00042 return m_alg->getDefaultPopsize(); 00043 } 00044 00045 virtual unsigned realApply(tChromosomeReal &sol, tFitness &fitness)=0; 00046 virtual unsigned init(void)=0; 00047 00053 void setPopsize(unsigned int popsize) { 00054 m_alg->setPopsize(popsize); 00055 } 00056 00057 void setProblem(Problem *problem) { 00058 m_problem = problem; 00059 m_alg->setProblem(problem); 00060 } 00061 00062 void setRunning(Running *running) { 00063 m_running = running; 00064 } 00065 00066 virtual void recoverIndividual(unsigned pos, tGen *aind, unsigned size, tGen *aoptional, unsigned addsize) { 00067 m_alg->recoverIndividual(pos,aind, size, aoptional, addsize); 00068 } 00069 00070 virtual void storeIndividual(tIndividualRealPtr ind, tGen **paind, unsigned *pmax, tGen **paoptional, unsigned *paddsize) { 00071 m_alg->storeIndividual(ind, paind, pmax, paoptional, paddsize); 00072 } 00073 00074 virtual void setRandom(Random *random) { 00075 m_alg->setRandom(random); 00076 } 00077 00078 virtual Random *getRandom(void) { 00079 return m_alg->getRandom(); 00080 } 00081 00082 void setStat(Statistics *stat) { 00083 m_alg->setStat(stat); 00084 } 00085 00086 virtual void setMaxEval(unsigned int maxeval)= 0; 00087 00088 unsigned getMaxEval(void) { 00089 return m_alg->getMaxEval(); 00090 } 00091 00092 void reset(void) { 00093 m_alg->reset(); 00094 } 00095 00096 PopulationReal *getPop(void) { 00097 return m_alg->getPop(); 00098 } 00099 00100 virtual ~ProxyEA(void) { 00101 if (m_alg) 00102 delete m_alg; 00103 00104 if (m_eval) 00105 delete m_eval; 00106 } 00107 00108 virtual void setInitEval(IEval*eval) { 00109 m_alg->setInitEval(eval); 00110 } 00111 00112 virtual void setNewEval(IEval*eval); 00113 00114 00115 protected: 00116 IEAlgorithm *m_alg; 00117 Problem *m_problem; 00118 IEvalInd *m_eval; 00119 Running *m_running; 00120 }; 00121 00127 class Hybrid : public ProxyEA { 00128 public: 00135 Hybrid(IEAlgorithm *alg, ILocalSearch *ls); 00136 00143 virtual void setEffortRatio(double ratio)=0; 00144 00149 void setIntensity(unsigned intensity) { 00150 m_intensity = intensity; 00151 } 00152 00153 ~Hybrid(void) { 00154 if (m_ls) { 00155 delete m_ls; 00156 } 00157 } 00158 00162 void initLs(void); 00163 00164 virtual void setRandom(Random *random) { 00165 m_alg->setRandom(random); 00166 m_random = random; 00167 } 00168 00169 Random *getRandom(void) { 00170 return m_alg->getRandom(); 00171 } 00172 00173 00174 00175 protected: 00176 ILocalSearch *m_ls; 00177 unsigned m_intensity; 00178 Random *m_random; 00179 }; 00180 00181 00182 } 00183 00184 #endif