00001 #include "initind.h" 00002 #include <cmath> 00003 #include <cassert> 00004 00005 #define EPSILON 1E-18 00006 00007 using namespace realea; 00008 using namespace realea::internal; 00009 00010 void SimpleInitInd::createInd(DomainRealPtr domain, tChromosomeReal &crom) { 00011 domain->getInit(m_random, crom); 00012 } 00013 00014 void SimpleInitInd::reset(DomainRealPtr domain, unsigned count) { 00015 } 00016 00017 void SimpleInitInd::resetBest(DomainRealPtr domain,const tChromosomeReal &sol, unsigned count) { 00018 } 00019 00020 ElemDimInit::ElemDimInit(tGen min, tGen max, unsigned count, unsigned intervals) : m_min(min), m_size(intervals), m_interval(intervals) { 00021 m_range = (max-min)/m_size; 00022 00023 for (unsigned i = 0; i < m_size; i++) { 00024 ElemRangeInit elem; 00025 elem.interval = i; 00026 elem.count = count; 00027 m_interval[i] = elem; 00028 } 00029 00030 } 00031 00032 void ElemDimInit::reduce(tGen value) { 00033 unsigned pos_interval; 00034 00035 pos_interval = (unsigned) floor((value - m_min)/m_range+EPSILON); 00036 00037 if (pos_interval >= m_interval.size() ) { 00038 pos_interval = m_interval.size()-1; 00039 } 00040 m_interval[pos_interval].count--; 00041 assert(m_interval[pos_interval].count > 0); 00042 } 00043 00044 tGen ElemDimInit::random(Random *random) { 00045 unsigned pos_interval = random->randint(0, m_size-1); 00046 unsigned interval = m_interval[pos_interval].interval; 00047 assert(m_interval[pos_interval].count > 0); 00048 00049 tGen value = m_min + interval*m_range+random->randreal(0, m_range); 00050 00051 00052 m_interval[pos_interval].count--; 00053 00054 if (m_interval[pos_interval].count == 0) { 00055 m_interval[pos_interval] = m_interval[m_size-1]; 00056 m_size -= 1; 00057 } 00058 00059 return value; 00060 } 00061 00062 00063 void UniformInitInd::reset(DomainRealPtr domain, unsigned count) { 00064 unsigned ndim = domain->getDimension(); 00065 tGen min, max; 00066 00067 m_interval_dim.clear(); 00068 unsigned intervals = count/10; 00069 00070 for (unsigned i = 0; i < ndim; ++i) { 00071 domain->getValues(i, &min, &max); 00072 ElemDimInit elem(min, max, 10, intervals); 00073 m_interval_dim.push_back(elem); 00074 } 00075 00076 } 00077 00078 void UniformInitInd::resetBest(DomainRealPtr domain, const tChromosomeReal &best, unsigned count) { 00079 deque<ElemDimInit>::iterator elemDim; 00080 unsigned i, ndim = best.size(); 00081 reset(domain, count); 00082 00083 for (i = 0, elemDim = m_interval_dim.begin(); elemDim != m_interval_dim.end(); elemDim++, i++) { 00084 elemDim->reduce(best[i]); 00085 } 00086 } 00087 00088 void UniformInitInd::createInd(DomainRealPtr domain, tChromosomeReal &crom) { 00089 unsigned i, ndim = domain->getDimension(); 00090 deque<ElemDimInit>::iterator elemDim; 00091 00092 for (i = 0, elemDim = m_interval_dim.begin(); elemDim != m_interval_dim.end(); elemDim++, i++) { 00093 crom.push_back(elemDim->random(m_random)); 00094 } 00095 } 00096 00097 UniformInitInd::~UniformInitInd(void) { 00098 }