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 }