00001
00020 #include "ea.h"
00021 #include <cassert>
00022
00023 using namespace realea;
00024 using namespace realea::internal;
00025
00026
00027
00028
00029 EAlgorithm::EAlgorithm(IEAlgorithm *alg, ProblemParamPtr problem) : m_alg(alg), default_popsize(alg->getDefaultPopsize()), m_cross(NULL), m_stat(NULL) {
00030 setProblem(problem);
00031 }
00032
00033 void EAlgorithm::setShow(Statistics *stat) {
00034 if (m_problem)
00035 stat->setProblem(m_problem);
00036
00037 m_alg->setStat(stat);
00038 m_stat = stat;
00039 }
00040
00041 void EAlgorithm::setEval(IEval *eval) {
00042 m_eval = eval;
00043 }
00044
00045 void EAlgorithm::setProblem(ProblemParamPtr problem) {
00046 m_problem = problem.get();
00047 m_alg->setProblem(m_problem);
00048 m_running = new Running(m_problem->getFinishCriterion());
00049 m_running->setMaxEval(m_problem->getMaxEval());
00050 m_alg->setRunning(m_running);
00051 m_alg->setMaxEval(m_running->maxEval());
00052 m_alg->setInitEval(m_problem);
00053 m_alg->setNewEval(m_problem);
00054
00055
00056 if (problem->minimize())
00057 tIndividualReal::setMinimize();
00058 else
00059 tIndividualReal::setMinimize();
00060
00061 appendSignal(m_alg);
00062
00063 if (m_stat)
00064 m_stat->setProblem(m_problem);
00065 }
00066
00067 EAlgorithm::~EAlgorithm(void) {
00068
00069 if (m_alg)
00070 delete m_alg;
00071
00072 if (m_stat)
00073 delete m_stat;
00074
00075 if (m_running)
00076 delete m_running;
00077 }
00078
00079 void EAlgorithm::setMaxEval(unsigned int maxeval) {
00080 m_alg->setMaxEval(maxeval);
00081 }
00082
00083 void EAlgorithm::setPopsize(unsigned int popsize) {
00084 m_alg->setPopsize(popsize);
00085 }
00086
00087 RunningPtr EAlgorithm::getRunning(void) {
00088 return m_running;
00089 }
00090
00091 void EAlgorithm::setDefaultPopsize(void) {
00092 unsigned maxeval = m_alg->getMaxEval();
00093 unsigned max;
00094
00095 if (maxeval < default_popsize) {
00096 max = maxeval;
00097 }
00098 else {
00099 max = default_popsize;
00100 }
00101
00102
00103 m_alg->setPopsize(max);
00104 }
00105
00111 unsigned EAlgorithm::apply(tChromosomeReal &sol, tFitness *pfitness) {
00112
00113 if (m_alg->getPop() == NULL)
00114 setDefaultPopsize();
00115
00116 if (m_problem == NULL) {
00117 throw new ConfigException("problem");
00118 }
00119
00120 if (m_stat)
00121 m_stat->newExperiment();
00122
00123 unsigned res = m_alg->init();
00124
00125 res += m_alg->realApply(sol, *pfitness);
00126
00127 if (m_stat)
00128 m_stat->endExperiment();
00129
00130 return res;
00131 }