00001 00020 #include "iea.h" 00021 #include <cassert> 00022 00023 using namespace realea; 00024 using namespace realea::internal; 00025 00026 ClassEAlgorithm::ClassEAlgorithm(Random *random) : m_problem(NULL), m_init_eval(NULL), m_new_eval(NULL), m_running(NULL), m_pop(NULL), m_stat(NULL) { 00027 setRandom(random); 00028 m_maxeval = 0; 00029 } 00030 00031 void ClassEAlgorithm::setNewEval(IEval *eval) { 00032 assert(m_running != NULL); 00033 assert(m_new_eval == NULL); 00034 m_new_eval = new EvalRunning(eval, m_running); 00035 } 00036 00037 void ClassEAlgorithm::setInitEval(IEval *eval) { 00038 assert(m_running != NULL); 00039 assert(m_init_eval == NULL); 00040 m_init_eval = new EvalRunning(eval, m_running); 00041 } 00042 00043 void ClassEAlgorithm::setMaxEval(unsigned int maxeval) { 00044 m_maxeval = maxeval; 00045 00046 if (m_running) { 00047 m_running->setMaxEval(m_maxeval); 00048 } 00049 } 00050 00051 unsigned int ClassEAlgorithm::getMaxEval(void) { 00052 return m_maxeval; 00053 } 00054 00055 00056 ClassEAlgorithm::~ClassEAlgorithm(void) { 00057 if (m_pop) 00058 delete m_pop; 00059 00060 if (m_init_eval) 00061 delete m_init_eval; 00062 00063 if (m_new_eval) 00064 delete m_new_eval; 00065 00066 m_new_eval = m_init_eval = NULL; 00067 } 00068 00069 void ClassEAlgorithm::setPopsize(unsigned int popsize) { 00070 if (m_pop) { 00071 delete m_pop; 00072 } 00073 00074 m_pop = new PopulationReal(m_random, popsize, popsize); 00075 } 00076 00077 void ClassEAlgorithm::reset(void) { 00078 if (m_running) 00079 m_running->reset(); 00080 } 00081 00082 void ClassEAlgorithm::setRunning(Running *running) { 00083 if (m_running != NULL) { 00084 delete m_running; 00085 } 00086 00087 m_running = running; 00088 00089 if (m_maxeval > 0 && m_running != NULL) { 00090 m_running->setMaxEval(m_maxeval); 00091 } 00092 00093 } 00094 00095 RunningPtr ClassEAlgorithm::getRunning(void) { 00096 assert(m_running != NULL); 00097 return m_running; 00098 } 00099 00100 void ClassEAlgorithm::storeIndividual(tIndividualRealPtr ind, tGen **paind, unsigned *pmax, 00101 tGen **paoptional, unsigned *psize_optional) { 00102 vector<tGen> sol = ind->sol(); 00103 unsigned size = sol.size()+1; 00104 00105 tGen *aind = new tGen[size]; 00106 copy(sol.begin(), sol.end(), aind); 00107 aind[size-1] = ind->perf(); 00108 00109 *pmax = size; 00110 *paind = aind; 00111 *paoptional = NULL; 00112 *psize_optional= 0; 00113 } 00114 00115 void ClassEAlgorithm::recoverIndividual(unsigned pos, tGen *aind, unsigned size, tGen *aoptional, unsigned optional_size) { 00116 assert(size > 1 && (size == m_pop->ndim()+1) ); 00117 vector<tGen> sol(size-1); 00118 00119 copy(aind, aind+size-2, sol.begin()); 00120 tFitness fitness = aind[size-1]; 00121 00122 tIndividualRealPtr ind = m_pop->getInstance(sol, fitness); 00123 m_pop->replace(pos, ind); 00124 } 00125 00126 ICrossEAlgorithm::ICrossEAlgorithm(Random *random) : ClassEAlgorithm(random), m_cross(NULL), m_icross(NULL) { 00127 } 00128 00129 ICrossEAlgorithm::~ICrossEAlgorithm(void) { 00130 if (m_cross) 00131 delete m_cross; 00132 } 00133 00134 void ICrossEAlgorithm::setCross(ICrossBinaryPtr cross) { 00135 m_icross = cross; 00136 } 00137 00138 void ICrossEAlgorithm::setProblem(Problem *problem) { 00139 ClassEAlgorithm::setProblem(problem); 00140 } 00141 00142 00143 void ICrossEAlgorithm::reset(void) { 00144 if (m_cross) { 00145 m_cross->reset(); 00146 } 00147 else if (m_icross) { 00148 m_icross->setRandom(m_random); 00149 m_icross->setDomain(m_problem->getDomain()); 00150 m_icross->setRunning(m_running); 00151 m_cross = new CrossBinary(m_icross); 00152 appendSignal(m_cross); 00153 } 00154 00155 ClassEAlgorithm::reset(); 00156 }