00001 #include "combinels.h"
00002 #include <cassert>
00003
00004 using namespace realea;
00005
00006 class CombineParams : public ILSParameters {
00007 public:
00008 int m_type;
00009 ILSParameters *m_option;
00010
00011 ~CombineParams(void) {
00012 if (m_option != NULL) {
00013 delete m_option;
00014 }
00015 }
00016 };
00017
00018 CombinedLS::CombinedLS(void) : m_pool() {
00019 m_initpool = false;
00020 }
00021
00022 void CombinedLS::addLocalSearch(ILocalSearch *ls) {
00023 m_pool.insert(m_pool.begin(), ls);
00024
00025 }
00026
00027 CombinedLS::~CombinedLS(void) {
00028 vector<ILocalSearch*>::iterator item;
00029
00030 for (item = m_pool.begin(); item != m_pool.end(); item++) {
00031 delete (*item);
00032 *item = NULL;
00033 }
00034
00035 }
00036
00037 void CombinedLS::setLSPool(void) {
00038
00039 vector<ILocalSearch*>::iterator item;
00040
00041 for (item = m_pool.begin(); item != m_pool.end(); item++) {
00042 (*item)->setPopulation(m_pop);
00043 (*item)->setRunning(m_running);
00044 (*item)->setProblem(m_problem);
00045 (*item)->setRandom(m_random);
00046 (*item)->setEval(m_eval);
00047 }
00048 }
00049
00050 ILSParameters *CombinedLS::getInitOptions(tChromosomeReal &sol) {
00051 int sizeLs = m_pool.size();
00052
00053 assert(sizeLs > 0);
00054
00055 if (!m_initpool) {
00056 setLSPool();
00057 m_initpool = true;
00058 }
00059
00060 int typeLs = m_random->randint(0, sizeLs-1);
00061 ILocalSearch *ls = m_pool[typeLs];
00062 CombineParams *options = new CombineParams();
00063 options->m_type = typeLs;
00064 options->m_option = ls->getInitOptions(sol);
00065 return options;
00066 }
00067
00068 unsigned CombinedLS::apply(ILSParameters *opt, tChromosomeReal &sol, tFitness &fitness, unsigned itera) {
00069 CombineParams *p = (CombineParams *) opt;
00070 ILocalSearch *ls = m_pool[p->m_type];
00071
00072 return ls->apply(p->m_option, sol, fitness, itera);
00073 }