00001 00020 #include "domain.h" 00021 #include <string> 00022 #include <cassert> 00023 #include <cstdio> 00024 00025 using namespace std; 00026 using namespace realea; 00027 00028 DomainReal::DomainReal(unsigned int dim) : m_mins(dim), m_maxs(dim), m_dim(dim), m_isbound(true), m_search_ini(0), m_search_fin(dim-1) { 00029 m_check_dim = new bool[dim]; 00030 00031 fill(m_check_dim, m_check_dim+dim, true); 00032 } 00033 00034 void DomainReal::checkGen(unsigned int gen) { 00035 if (gen >= m_dim) { 00036 char msg[100]; 00037 sprintf(msg, "position %d is not valide for a gen", gen); 00038 throw new string(msg); 00039 } 00040 00041 } 00042 00043 void DomainReal::getValues(unsigned int gen, tReal *pmin, tReal *pmax, bool check) { 00044 if (check) 00045 checkGen(gen); 00046 00047 *pmin = m_mins[gen]; 00048 *pmax = m_maxs[gen]; 00049 } 00050 00051 void DomainReal::setValues(unsigned int gen, tReal min, tReal max,bool check) { 00052 if (check) 00053 checkGen(gen); 00054 00055 assert(min <= max); 00056 00057 m_mins[gen] = min; 00058 m_maxs[gen] = max; 00059 } 00060 00061 tReal DomainReal::clip(unsigned int gen, tReal value, bool check) { 00062 tReal min, max; 00063 00064 if (check) 00065 checkGen(gen); 00066 00067 if (!m_isbound) { 00068 return value; 00069 } 00070 00071 min = m_mins[gen]; 00072 max = m_maxs[gen]; 00073 00074 if (value < min) 00075 return min; 00076 else if (value > max) 00077 return max; 00078 else 00079 return value; 00080 } 00081 00082 bool DomainReal::canBeChanged(unsigned dim) { 00083 assert(dim < m_dim); 00084 00085 return m_check_dim[dim]; 00086 00087 if (dim >= m_search_ini && dim <= m_search_fin) 00088 return true; 00089 else 00090 return false; 00091 } 00092 00093 void DomainReal::clip(tChromosomeReal &crom) { 00094 assert(crom.size() == m_dim); 00095 00096 if (!m_isbound) { 00097 return; 00098 } 00099 00100 for (unsigned i = 0; i < m_dim; ++i) { 00101 crom[i] = clip(i, crom[i], false); 00102 } 00103 } 00104 00105 00106 00107 bool DomainReal::check(const tChromosomeReal &crom) { 00108 bool follow = true; 00109 assert(crom.size() != m_dim); 00110 00111 for (unsigned i = 0; i < m_dim && follow; ++i) { 00112 if (crom[i] < m_mins[i]) 00113 follow = false; 00114 else if (crom[i] > m_maxs[i]) 00115 follow = true; 00116 } 00117 00118 return follow; 00119 } 00120 00121 void DomainReal::setDomainCenter(tChromosomeReal center, double scale) { 00122 unsigned i; 00123 tReal min, max, range, value; 00124 00125 for (i = 0; i < m_dim; i++) { 00126 getValues(i, &min, &max); 00127 value = center[i]; 00128 range = (max-min)*scale/2; 00129 00130 if (value - range > min) { 00131 min = value - range; 00132 } 00133 if (value + range < max) { 00134 max = value + range; 00135 } 00136 00137 setValues(i, min, max); 00138 } 00139 00140 } 00141 00142 00143 #include "random.h" 00144 00145 void DomainReal::getInitRandom(Random *random, tChromosomeReal &crom) { 00146 for (unsigned i = 0; i < m_dim; ++i) { 00147 crom.push_back(random->randreal(m_mins[i], m_maxs[i])); 00148 } 00149 } 00150 00151 void DomainReal::getInit(Random *random, tChromosomeReal &crom) { 00152 getInitRandom(random, crom); 00153 } 00154 00155 DomainReal::~DomainReal(void) { 00156 if (m_check_dim != NULL) { 00157 delete []m_check_dim; 00158 } 00159 } 00160 00161 void DomainReal::setSearchDomain(bool *searchDim, int dim) { 00162 assert(dim == m_dim); 00163 copy(searchDim, searchDim+dim, m_check_dim); 00164 } 00165 00166 void DomainReal::getSearchDomain(bool *searchDim, int dim) { 00167 assert(dim == m_dim); 00168 copy(m_check_dim, m_check_dim+dim, searchDim); 00169 }