00001
00020 #include "localsearch.h"
00021 #include "random.h"
00022 #include <cassert>
00023
00024 using namespace realea::internal;
00025
00026 NewIndividualLocalSearchManager::NewIndividualLocalSearchManager(ILocalSearch *ls) : m_ls(ls) {
00027 }
00028
00029 NewIndividualLocalSearchManager::~NewIndividualLocalSearchManager(void) {
00030 if (m_ls) {
00031 delete m_ls;
00032 }
00033 }
00034
00035 bool RatioLocalSearchManager::applyNewSol(tChromosomeReal &sol, tFitness *pfitness, ILSParameters *par) {
00036 ILSParameters *params;
00037 bool initconf;
00038 bool mustApply;
00039 bool applied=false;
00040
00041
00042 if (!m_random) {
00043 throw new ConfigException("LocalSearch::random");
00044 }
00045
00046 mustApply = (m_random->rand() < m_ratio);
00047
00048 if (mustApply) {
00049 if (m_ls == NULL) {
00050 throw new ConfigException("LocalSearch::ls");
00051 }
00052
00053 initconf = (params != NULL);
00054
00055 if (initconf) {
00056 params = m_ls->getInitOptions(sol);
00057 }
00058 else {
00059 params = par;
00060 }
00061
00062 applied = true;
00063 m_ls->apply(params, sol, *pfitness, m_intensity);
00064
00065 if (initconf) {
00066 delete params;
00067 }
00068 }
00069
00070 return applied;
00071 }
00072
00073 RatioLocalSearchManager::RatioLocalSearchManager(ILocalSearch *ls, unsigned intensity, double ratio) : NewIndividualLocalSearchManager(ls) {
00074 assert(intensity > 0);
00075 m_intensity = intensity;
00076 assert(ratio > 0 && ratio <= 1);
00077 m_ratio = ratio;
00078 }
00079
00080 unsigned RatioLocalSearchManager::getIntensity(void) {
00081 return m_intensity;
00082 }
00083
00084 void NewIndividualLocalSearchManager::reset(void) {
00085 }
00086
00087 void RatioLocalSearchManager::setRandom(Random *random) {
00088 m_random = random;
00089 }
00090