SedSat3 1.1.6
Sediment Source Apportionment Tool - Advanced statistical methods for environmental pollution research
Loading...
Searching...
No Matches
Individual.cpp
Go to the documentation of this file.
1// Individual.cpp: implementation of the CIndividual class.
2//
4
5#include "Individual.h"
6#include "Binary.h"
7#include "DistributionNUnif.h"
8#include <cstdlib>
9#include "QuickSort.h"
10#include <algorithm>
11
13// Construction/Destruction
15
16
18{
19 nParams = 1;
20 x.resize(nParams);
21 pert.resize(nParams);
22 dir.resize(nParams);
23 perteff.resize(nParams);
24 precision.resize(nParams);
25 minrange.resize(nParams);
26 maxrange.resize(nParams);
27 fit_measures.resize(3);
28
29}
30
35
37{
38 nParams = n;
39 x.resize(nParams);
40 pert.resize(nParams);
41 dir.resize(nParams);
42 perteff.resize(nParams);
43 precision.resize(nParams);
44 minrange.resize(nParams);
45 maxrange.resize(nParams);
46 for (int i=0; i<nParams; i++)
47 {
48 x[i] = 0;
49 pert[i] = 0;
50 dir[i] = 0;
51 minrange[i] = 0;
52 maxrange[i] = 1;
53 perteff[i] = 0;
54 }
55 fit_measures.resize(3);
56}
57
58
60{
61 nParams = C.nParams;
62 x.resize(nParams);
63 pert.resize(nParams);
64 dir.resize(nParams);
65 perteff.resize(nParams);
66 precision.resize(nParams);
67 minrange.resize(nParams);
68 maxrange.resize(nParams);
69 for (int i=0; i<nParams; i++)
70 {
71 pert[i] = C.pert[i];
72 dir[i] = C.dir[i];
73 x[i] = C.x[i];
74 precision[i] = C.precision[i];
75 minrange[i] = C.minrange[i];
76 maxrange[i] = C.maxrange[i];
77 perteff[i] = C.perteff[i];
78 }
79
80 fitness = C.fitness;
81 fit_measures.resize(3);
84
85}
86
88{
89 nParams = C.nParams;
90 x.resize(nParams);
91 pert.resize(nParams);
92 dir.resize(nParams);
93 perteff.resize(nParams);
94 precision.resize(nParams);
95 minrange.resize(nParams);
96 maxrange.resize(nParams);
97 for (int i=0; i<nParams; i++)
98 {
99 pert[i] = C.pert[i];
100 dir[i] = C.dir[i];
101 x[i] = C.x[i];
102 precision[i] = C.precision[i];
103 minrange[i] = C.minrange[i];
104 maxrange[i] = C.maxrange[i];
105 perteff[i] = C.perteff[i];
106 }
107
108 fitness = C.fitness;
112 return *this;
113}
114
116{
117 for (int i=0; i<nParams; i++)
118 {
119 x[i] = GetRndUnif(0,1)*(maxrange[i] - minrange[i]) + minrange[i];
120 //MM
121 //x[i] = (i/4.0)*(maxrange[i] - minrange[i]) + minrange[i];
122 }
123
124}
125
126double GetRndUnif(double xmin, double xmax)
127{
128 return double(rand())/double(RAND_MAX)*(xmax-xmin) + xmin;
129}
130
131void cross(const CIndividual &I1, const CIndividual &I2, CIndividual &IR1, CIndividual &IR2)
132{
133 IR1 = I1;
134 IR2 = I2;
135
136 CBinary B1 = code(I1.x[0], I1.minrange[0], I1.maxrange[0], I1.precision[0]);
137 CBinary B2 = code(I2.x[0], I2.minrange[0], I2.maxrange[0], I2.precision[0]);
138
139 vector<double> endpos(I1.nParams);
140
141 endpos[0] = B1.nDigits;
142
143 for (int i=1; i<I1.nParams; i++)
144 {
145 B1 = B1 + code(I1.x[i], I1.minrange[i], I1.maxrange[i], I1.precision[i]);
146 B2 = B2 + code(I2.x[i], I2.minrange[i], I2.maxrange[i], I2.precision[i]);
147 endpos[i] = B1.nDigits;
148 }
149
150 int nn = max(1,static_cast<int>(GetRndUnif(0,1)*(I1.nParams/4)));
151 vector<int> rndint(nn);
152 for (int i=0; i<rndint.size(); i++) rndint[i] = static_cast<int>(GetRndUnif(0,1)*B1.nDigits);
153 rndint.push_back(0);
154 rndint.push_back(B1.nDigits-1);
155 rndint = QSort(rndint);
156
157 cross(B1, B2, rndint);
158
159 CBinary BT1 = B1.extract(0, endpos[0]-1);
160 CBinary BT2 = B2.extract(0, endpos[0]-1);
161 BT1.precision = I1.precision[0];
162 BT2.precision = I2.precision[0];
163
164 IR1.x[0] = BT1.decode(I1.minrange[0]);
165 IR2.x[0] = BT2.decode(I2.minrange[0]);
166 if (IR1.x[0]>IR1.maxrange[0])
167 IR1.x[0]=IR1.maxrange[0];
168 if (IR2.x[0]>IR2.maxrange[0])
169 IR2.x[0]=IR2.maxrange[0];
170
171 for (int i=1; i<I1.nParams; i++)
172 {
173 CBinary BT1 = B1.extract(endpos[i-1], endpos[i]-1);
174 CBinary BT2 = B2.extract(endpos[i-1], endpos[i]-1);
175 BT1.precision = I1.precision[i];
176 BT2.precision = I2.precision[i];
177 IR1.x[i] = BT1.decode(I1.minrange[i]);
178 if (IR1.x[i]>IR1.maxrange[i])
179 IR1.x[i]=IR1.maxrange[i];
180 IR2.x[i] = BT2.decode(I2.minrange[i]);
181 if (IR2.x[i]>IR2.maxrange[i])
182 IR2.x[i]=IR2.maxrange[i];
183
184 }
185
186}
187
188void cross_RC_L(const CIndividual &I1, const CIndividual &I2, CIndividual &IR1, CIndividual &IR2)
189{
190 IR1 = I1;
191 IR2 = I2;
192
193 for (int i=0; i<IR1.nParams; i++)
194 { double rnd = GetRndUnif(0,1);
195 IR1.x[i] = I1.x[i]*rnd + I2.x[i]*(1-rnd);
196 IR2.x[i] = I2.x[i]*rnd + I1.x[i]*(1-rnd);
197 }
198
199
200}
201
202
203void CIndividual::mutate(double mu)
204{
205 for (int i=0; i<nParams; i++)
206 {
207 CBinary B = code(x[i],minrange[i],maxrange[i], precision[i]);
208 B.mutate(mu);
209 x[i] = B.decode(minrange[i]);
210 if (x[i]>maxrange[i]) x[i] = maxrange[i];
211 }
212}
213
214void cross2p(const CIndividual &I1, const CIndividual &I2, CIndividual &IR1, CIndividual &IR2)
215{
216 IR1 = I1;
217 IR2 = I2;
218
219 CBinary B1 = code(I1.x[0], I1.minrange[0], I1.maxrange[0], I1.precision[0]);
220 CBinary B2 = code(I2.x[0], I2.minrange[0], I2.maxrange[0], I2.precision[0]);
221
222 int endpos[10];
223
224 endpos[0] = B1.nDigits;
225
226 for (int i=1; i<I1.nParams; i++)
227 {
228 B1 = B1 + code(I1.x[i], I1.minrange[i], I1.maxrange[i], I1.precision[i]);
229 B2 = B2 + code(I2.x[i], I2.minrange[i], I2.maxrange[i], I2.precision[i]);
230 endpos[i] = B1.nDigits;
231 }
232
233 int rndint1 = static_cast<int>(GetRndUnif(0,1)*B1.nDigits);
234 int rndint2 = static_cast<int>(GetRndUnif(0,1)*B1.nDigits);
235
236 if (rndint1>rndint2)
237 {
238 int tmp = rndint2;
239 rndint2 = rndint1;
240 rndint1 = tmp;
241 }
242
243 cross2p(B1, B2, rndint1, rndint2);
244
245 CBinary BT1 = B1.extract(0, endpos[0]-1);
246 CBinary BT2 = B2.extract(0, endpos[0]-1);
247 BT1.precision = I1.precision[0];
248 BT2.precision = I2.precision[0];
249
250 IR1.x[0] = BT1.decode(I1.minrange[0]);
251 IR2.x[0] = BT2.decode(I2.minrange[0]);
252 if (IR1.x[0]>IR1.maxrange[0])
253 IR1.x[0]=IR1.maxrange[0];
254 if (IR2.x[0]>IR2.maxrange[0])
255 IR2.x[0]=IR2.maxrange[0];
256
257
258
259
260 for (int i=1; i<I1.nParams; i++)
261 {
262 CBinary BT1 = B1.extract(endpos[i-1], endpos[i]-1);
263 CBinary BT2 = B2.extract(endpos[i-1], endpos[i]-1);
264 BT1.precision = I1.precision[i];
265 BT2.precision = I2.precision[i];
266 IR1.x[i] = BT1.decode(I1.minrange[i]);
267 if (IR1.x[i]>IR1.maxrange[i])
268 IR1.x[i]=IR1.maxrange[i];
269 IR2.x[i] = BT2.decode(I2.minrange[i]);
270 if (IR2.x[i]>IR2.maxrange[i])
271 IR2.x[i]=IR2.maxrange[i];
272
273 }
274
275}
276
277void CIndividual::shake(double shakescale)
278{
279 for (int i=0; i<nParams; i++)
280 {
281 double dev = GetRndUnif(-shakescale,+shakescale);
282 x[i] *= (1+dev);
283 if (x[i]>maxrange[i]) x[i] = maxrange[i];
284 if (x[i]<minrange[i]) x[i] = minrange[i];
285 }
286}
CBinary code(double x, double minrange, double maxrange, int precision)
Definition Binary.cpp:86
void cross_RC_L(const CIndividual &I1, const CIndividual &I2, CIndividual &IR1, CIndividual &IR2)
void cross(const CIndividual &I1, const CIndividual &I2, CIndividual &IR1, CIndividual &IR2)
double GetRndUnif(double xmin, double xmax)
void cross2p(const CIndividual &I1, const CIndividual &I2, CIndividual &IR1, CIndividual &IR2)
double GetRndUnif(double xmin, double xmax)
void mutate(double mu)
Definition Binary.cpp:225
CBinary extract(int spoint, int epoint)
Definition Binary.cpp:120
int precision
Definition Binary.h:16
int nDigits
Definition Binary.h:14
double decode(double minrange)
Definition Binary.cpp:72
void shake(double shakescale)
double actual_fitness
Definition Individual.h:19
std::vector< int > dir
Definition Individual.h:16
void mutate(double mu)
std::vector< double > pert
Definition Individual.h:15
void initialize()
std::vector< double > perteff
Definition Individual.h:17
CIndividual operator=(const CIndividual &C)
std::vector< double > x
Definition Individual.h:14
std::vector< int > precision
Definition Individual.h:22
virtual ~CIndividual()
std::vector< double > minrange
Definition Individual.h:23
double actual_fitness2
Definition Individual.h:19
std::vector< double > fit_measures
Definition Individual.h:28
std::vector< double > maxrange
Definition Individual.h:23
double fitness
Definition Individual.h:18