00001 #include <iostream>
00002 #include <stdlib.h>
00003 #include <NLstl_utils.h>
00004
00005 #include "GLBaseBreeder.h"
00006 #include "GLBaseCrossover.h"
00007 #include "GLBaseEvaluator.h"
00008 #include "GLBaseGaStatus.h"
00009 #include "GLBaseGaStopper.h"
00010 #include "GLBaseGeneticAlgorithm.h"
00011 #include "GLBaseMutator.h"
00012 #include "GLBasePopulation.h"
00013 #include "GLBaseRanker.h"
00014 #include "GLBaseSelectionist.h"
00015 #include "GLBaseVariator.h"
00016 #include "GLFactory.h"
00017 #include "GLParametersGeneticAlgorithm.h"
00018 #include "gl_utils.h"
00019
00020 using namespace std;
00026 GLBaseGeneticAlgorithm::GLBaseGeneticAlgorithm(
00027 const GLParametersGeneticAlgorithm& parameters,
00028 GLFactory* factory)
00029 {
00030 m_parameters = nlutils::transform_pointer<GLParametersGeneticAlgorithm,
00031 GLBaseParameters>(parameters.copy());
00032 initialise(factory);
00033 m_evaluator = NULL;
00034 }
00035
00036 GLBaseGeneticAlgorithm::~GLBaseGeneticAlgorithm()
00037 {
00038 if (m_breeder != NULL) delete m_breeder;
00039 if (m_parameters != NULL) delete m_parameters;
00040 if (m_selectionist != NULL) delete m_selectionist;
00041 if (m_variator != NULL) delete m_variator;
00042 }
00043
00049 void GLBaseGeneticAlgorithm::initialise(GLFactory *factory)
00050 {
00051
00052
00053
00054 GLBaseCrossover* crossover = factory->createCrossover(
00055 m_parameters->m_crossover_type,
00056 m_parameters->m_crossover_params,
00057 this);
00058 GLBaseMutator* mutator = factory->createMutator(
00059 m_parameters->m_mutator_type,
00060 m_parameters->m_mutation_rate,
00061 m_parameters->m_mutator_params,
00062 this);
00063 GLBaseRanker* ranker = factory->createRanker(
00064 m_parameters->m_ranker_type,
00065 m_parameters->m_ranker_params,
00066 this);
00067
00068 m_breeder = factory->createBreeder(
00069 m_parameters->m_breeder_type,
00070 crossover,
00071 m_parameters->m_breeder_params,
00072 this);
00073
00074 m_selectionist = factory->createSelectionist(
00075 m_parameters->m_selectionist_type,
00076 ranker,
00077 m_parameters->m_selectionist_params,
00078 this);
00079
00080 m_variator = factory->createVariator(
00081 m_parameters->m_variator_type,
00082 mutator,
00083 m_parameters->m_variator_params,
00084 this);
00085 }
00086
00087
00095 void GLBaseGeneticAlgorithm::reset()
00096 {
00097 m_breeder->reset();
00098 m_selectionist->reset();
00099 m_variator->reset();
00100 }
00112 bool GLBaseGeneticAlgorithm::toFinish(const TListOfStoppers& stoppers,
00113 bool bool_operator)
00114 {
00115 if (stoppers.empty()) return true;
00116
00117 const GLBaseGaStatus* status = getStatus();
00118 if (status->m_current_state != GLConstants::GA_STATE_RUNNING)
00119 return false;
00120
00121
00122 bool stopper_status = false;
00123 TListOfStoppers::const_iterator it = stoppers.begin();
00124 while (it != stoppers.end())
00125 {
00126 stopper_status = (*it)->stop(status);
00127
00128 if ((bool_operator == GLConstants::AND_OPERATOR) &&
00129 (!stopper_status)) return false;
00130
00131 if ((bool_operator == GLConstants::OR_OPERATOR) &&
00132 (stopper_status)) return true;
00133 ++it;
00134 }
00135
00136
00137
00138 return bool_operator == GLConstants::AND_OPERATOR;
00139 }