44 GADefineIdentity(
"GA1DArrayGenome", GAID::ArrayGenome);
59 float nMut = pmut * STA_CAST(
float, child.length());
60 int length = child.length() - 1;
64 for (
int i = length; i >= 0; i--)
68 child.swap(i, GARandomInt(0, length));
75 for (
int n = 0; n < nMut; n++)
76 child.swap(GARandomInt(0, length), GARandomInt(0, length));
78 return (STA_CAST(
int, nMut));
95 if (sis.length() != bro.length())
97 if (sis.length() == 0)
100 for (
int i = sis.length() - 1; i >= 0; i--)
101 count += ((sis.gene(i) == bro.gene(i)) ? 0 : 1);
102 return count / sis.length();
129 if (sis.length() == bro.length()
130 && mom.length() == dad.length()
131 && sis.length() == mom.length())
133 for (
int i = sis.length() - 1; i >= 0; i--)
137 sis.gene(i, mom.gene(i));
138 bro.gene(i, dad.gene(i));
142 sis.gene(i, dad.gene(i));
143 bro.gene(i, mom.gene(i));
150 int max = (sis.length() > bro.length()) ? sis.length() : bro.length();
151 int min = (mom.length() < dad.length()) ? mom.length() : dad.length();
153 for (
int i = 0; i < max; i++)
154 mask[i] = GARandomBit();
155 int start = (sis.length() < min) ? sis.length() - 1 : min - 1;
156 for (
int i = start; i >= 0; i--)
157 sis.gene(i, (mask[i] ? mom.gene(i) : dad.gene(i)));
158 start = (bro.length() < min) ? bro.length() - 1 : min - 1;
159 for (
int i = start; i >= 0; i--)
160 bro.gene(i, (mask[i] ? dad.gene(i) : mom.gene(i)));
168 if (mom.length() == dad.length() && sis.length() == mom.length())
170 for (
int i = sis.length() - 1; i >= 0; i--)
171 sis.gene(i, (GARandomBit() ? mom.gene(i) : dad.gene(i)));
175 int min = (mom.length() < dad.length()) ? mom.length() : dad.length();
176 min = (sis.length() < min) ? sis.length() : min;
177 for (
int i = min - 1; i >= 0; i--)
178 sis.gene(i, (GARandomBit() ? mom.gene(i) : dad.gene(i)));
202 unsigned int momsite, momlen;
203 unsigned int dadsite, dadlen;
210 if (sis.resizeBehaviour() == GAGenome::FIXED_SIZE &&
211 bro.resizeBehaviour() == GAGenome::FIXED_SIZE)
213 if (mom.length() != dad.length() ||
214 sis.length() != bro.length() ||
215 sis.length() != mom.length())
217 GAErr(GA_LOC, mom.className(),
"one-point cross",
218 GAError::SameLengthReqd);
221 momsite = dadsite = GARandomInt(0, mom.length());
222 momlen = dadlen = mom.length() - momsite;
224 else if (sis.resizeBehaviour() == GAGenome::FIXED_SIZE ||
225 bro.resizeBehaviour() == GAGenome::FIXED_SIZE)
227 GAErr(GA_LOC, mom.className(),
"one-point cross",
228 GAError::SameBehavReqd);
233 momsite = GARandomInt(0, mom.length());
234 dadsite = GARandomInt(0, dad.length());
235 momlen = mom.length() - momsite;
236 dadlen = dad.length() - dadsite;
237 sis.resize(momsite + dadlen);
238 bro.resize(dadsite + momlen);
241 sis.copy(mom, 0, 0, momsite);
242 sis.copy(dad, momsite, dadsite, dadlen);
243 bro.copy(dad, 0, 0, dadsite);
244 bro.copy(mom, dadsite, momsite, momlen);
254 if (sis.resizeBehaviour() == GAGenome::FIXED_SIZE)
256 if (mom.length() != dad.length() ||
257 sis.length() != mom.length())
259 GAErr(GA_LOC, mom.className(),
"one-point cross",
260 GAError::SameLengthReqd);
263 momsite = dadsite = GARandomInt(0, mom.length());
264 momlen = dadlen = mom.length() - momsite;
268 momsite = GARandomInt(0, mom.length());
269 dadsite = GARandomInt(0, dad.length());
270 momlen = mom.length() - momsite;
271 dadlen = dad.length() - dadsite;
272 sis.resize(momsite + dadlen);
277 sis.copy(mom, 0, 0, momsite);
278 sis.copy(dad, momsite, dadsite, dadlen);
282 sis.copy(dad, 0, 0, dadsite);
283 sis.copy(mom, dadsite, momsite, momlen);
307 std::array<unsigned int, 2> momsite;
308 std::array<unsigned int, 2> momlen;
309 std::array<unsigned int, 2> dadsite;
310 std::array<unsigned int, 2> dadlen;
317 if (sis.resizeBehaviour() == GAGenome::FIXED_SIZE &&
318 bro.resizeBehaviour() == GAGenome::FIXED_SIZE)
320 if (mom.length() != dad.length() ||
321 sis.length() != bro.length() ||
322 sis.length() != mom.length())
324 GAErr(GA_LOC, mom.className(),
"two-point cross",
325 GAError::SameLengthReqd);
328 momsite.at(0) = GARandomInt(0, mom.length());
329 momsite.at(1) = GARandomInt(0, mom.length());
330 if (momsite.at(0) > momsite.at(1))
331 SWAP(momsite.at(0), momsite.at(1));
332 momlen.at(0) = momsite.at(1) - momsite.at(0);
333 momlen.at(1) = mom.length() - momsite.at(1);
335 dadsite.at(0) = momsite.at(0);
336 dadsite.at(1) = momsite.at(1);
337 dadlen.at(0) = momlen.at(0);
338 dadlen.at(1) = momlen.at(1);
340 else if (sis.resizeBehaviour() == GAGenome::FIXED_SIZE ||
341 bro.resizeBehaviour() == GAGenome::FIXED_SIZE)
347 momsite.at(0) = GARandomInt(0, mom.length());
348 momsite.at(1) = GARandomInt(0, mom.length());
349 if (momsite.at(0) > momsite.at(1))
350 SWAP(momsite.at(0), momsite.at(1));
351 momlen.at(0) = momsite.at(1) - momsite.at(0);
352 momlen.at(1) = mom.length() - momsite.at(1);
354 dadsite.at(0) = GARandomInt(0, dad.length());
355 dadsite.at(1) = GARandomInt(0, dad.length());
356 if (dadsite.at(0) > dadsite.at(1))
357 SWAP(dadsite.at(0), dadsite.at(1));
358 dadlen.at(0) = dadsite.at(1) - dadsite.at(0);
359 dadlen.at(1) = dad.length() - dadsite.at(1);
361 sis.resize(momsite.at(0) + dadlen.at(0) + momlen.at(1));
362 bro.resize(dadsite.at(0) + momlen.at(0) + dadlen.at(1));
365 sis.copy(mom, 0, 0, momsite.at(0));
366 sis.copy(dad, momsite.at(0), dadsite.at(0), dadlen.at(0));
367 sis.copy(mom, momsite.at(0) + dadlen.at(0), momsite.at(1), momlen.at(1));
368 bro.copy(dad, 0, 0, dadsite.at(0));
369 bro.copy(mom, dadsite.at(0), momsite.at(0), momlen.at(0));
370 bro.copy(dad, dadsite.at(0) + momlen.at(0), dadsite.at(1), dadlen.at(1));
380 if (sis.resizeBehaviour() == GAGenome::FIXED_SIZE)
382 if (mom.length() != dad.length() ||
383 sis.length() != mom.length())
385 GAErr(GA_LOC, mom.className(),
"two-point cross",
386 GAError::SameLengthReqd);
389 momsite.at(0) = GARandomInt(0, mom.length());
390 momsite.at(1) = GARandomInt(0, mom.length());
391 if (momsite.at(0) > momsite.at(1))
392 SWAP(momsite.at(0), momsite.at(1));
393 momlen.at(0) = momsite.at(1) - momsite.at(0);
394 momlen.at(1) = mom.length() - momsite.at(1);
396 dadsite.at(0) = momsite.at(0);
397 dadsite.at(1) = momsite.at(1);
398 dadlen.at(0) = momlen.at(0);
399 dadlen.at(1) = momlen.at(1);
403 momsite.at(0) = GARandomInt(0, mom.length());
404 momsite.at(1) = GARandomInt(0, mom.length());
405 if (momsite.at(0) > momsite.at(1))
406 SWAP(momsite.at(0), momsite.at(1));
407 momlen.at(0) = momsite.at(1) - momsite.at(0);
408 momlen.at(1) = mom.length() - momsite.at(1);
410 dadsite.at(0) = GARandomInt(0, dad.length());
411 dadsite.at(1) = GARandomInt(0, dad.length());
412 if (dadsite.at(0) > dadsite.at(1))
413 SWAP(dadsite.at(0), dadsite.at(1));
414 dadlen.at(0) = dadsite.at(1) - dadsite.at(0);
415 dadlen.at(1) = dad.length() - dadsite.at(1);
417 sis.resize(momsite.at(0) + dadlen.at(0) + momlen.at(1));
422 sis.copy(mom, 0, 0, momsite.at(0));
423 sis.copy(dad, momsite.at(0), dadsite.at(0), dadlen.at(0));
424 sis.copy(mom, momsite.at(0) + dadlen.at(0), momsite.at(1), momlen.at(1));
428 sis.copy(dad, 0, 0, dadsite.at(0));
429 sis.copy(mom, dadsite.at(0), momsite.at(0), momlen.at(0));
430 sis.copy(dad, dadsite.at(0) + momlen.at(0), dadsite.at(1), dadlen.at(1));
458 if (sis.length() == bro.length() && mom.length() == dad.length() &&
459 sis.length() == mom.length())
461 for (i = sis.length() - 1; i >= 1; i -= 2)
463 sis.gene(i, mom.gene(i));
464 bro.gene(i, dad.gene(i));
465 sis.gene(i - 1, dad.gene(i - 1));
466 bro.gene(i - 1, mom.gene(i - 1));
470 sis.gene(0, mom.gene(0));
471 bro.gene(0, dad.gene(0));
476 int min = (mom.length() < dad.length()) ? mom.length() : dad.length();
477 int start = (sis.length() < min) ? sis.length() - 1 : min - 1;
478 for (i = start; i >= 0; i--)
479 sis.gene(i, ((i % 2 == 0) ? mom.gene(i) : dad.gene(i)));
480 start = (bro.length() < min) ? bro.length() - 1 : min - 1;
481 for (i = start; i >= 0; i--)
482 bro.gene(i, ((i % 2 == 0) ? dad.gene(i) : mom.gene(i)));
493 if (mom.length() == dad.length() && sis.length() == mom.length())
495 for (i = sis.length() - 1; i >= 1; i -= 2)
497 sis.gene(i, mom.gene(i));
498 sis.gene(i - 1, dad.gene(i - 1));
502 sis.gene(0, mom.gene(0));
508 (mom.length() < dad.length()) ? mom.length() : dad.length();
509 min = (sis.length() < min) ? sis.length() - 1 : min - 1;
510 for (i = min; i >= 0; i--)
511 sis.gene(i, ((i % 2 == 0) ? mom.gene(i) : dad.gene(i)));
535 int a = GARandomInt(0, mom.length());
536 int b = GARandomInt(0, dad.length());
541 if (mom.length() != dad.length())
543 GAErr(GA_LOC, mom.className(),
"parial match cross",
544 GAError::BadParentLength);
553 sis.GAArray<T>::copy(mom);
554 for (i =
a, index =
a; i < b; i++, index++)
557 j < sis.length() - 1 && sis.gene(j) != dad.gene(index);
562 bro.GAArray<T>::copy(dad);
563 for (i =
a, index =
a; i < b; i++, index++)
566 j < bro.length() - 1 && bro.gene(j) != mom.gene(index);
592 sis.GAArray<T>::copy(*parent1);
593 for (i =
a, index =
a; i < b; i++, index++)
595 for (j = 0; j < sis.length() - 1 &&
596 sis.gene(j) != parent2->gene(index);
626 int a = GARandomInt(0, mom.length());
627 int b = GARandomInt(0, mom.length());
632 if (mom.length() != dad.length())
634 GAErr(GA_LOC, mom.className(),
"order cross", GAError::BadParentLength);
644 sis.GAArray<T>::copy(mom);
647 for (i = 0, index = b; i < sis.size(); i++, index++)
649 if (index >= sis.size())
651 if (GA1DArrayIsHole(sis, dad, index,
a, b))
655 for (; i < sis.size() - b +
a; i++, index++)
657 if (index >= sis.size())
665 }
while (GA1DArrayIsHole(sis, dad, j,
a, b));
671 for (i =
a; i < b; i++)
673 if (sis.gene(i) != dad.gene(i))
675 for (j = i + 1; j < b; j++)
676 if (sis.gene(j) == dad.gene(i))
682 bro.GAArray<T>::copy(dad);
685 for (i = 0, index = b; i < bro.size(); i++, index++)
687 if (index >= bro.size())
689 if (GA1DArrayIsHole(bro, mom, index,
a, b))
693 for (; i < bro.size() - b +
a; i++, index++)
695 if (index >= bro.size())
703 }
while (GA1DArrayIsHole(bro, mom, j,
a, b));
709 for (i =
a; i < b; i++)
711 if (bro.gene(i) != mom.gene(i))
713 for (j = i + 1; j < b; j++)
714 if (bro.gene(j) == mom.gene(i))
739 sis.GAArray<T>::copy(*parent1);
740 for (i = 0, index = b; i < sis.size(); i++, index++)
742 if (index >= sis.size())
744 if (GA1DArrayIsHole(sis, *parent2, index,
a, b))
747 for (; i < sis.size() - b +
a; i++, index++)
749 if (index >= sis.size())
757 }
while (GA1DArrayIsHole(sis, *parent2, j,
a, b));
760 for (i =
a; i < b; i++)
762 if (sis.gene(i) != parent2->gene(i))
764 for (j = i + 1; j < b; j++)
765 if (sis.gene(j) == parent2->gene(i))
805 if (mom.length() != dad.length())
807 GAErr(GA_LOC, mom.className(),
"cycle cross", GAError::BadParentLength);
817 mask.size(sis.length());
820 sis.gene(0, mom.gene(0));
822 while (dad.gene(current) != mom.gene(0))
824 for (
int i = 0; i < sis.size(); i++)
826 if (mom.gene(i) == dad.gene(current))
828 sis.gene(i, mom.gene(i));
836 for (
int i = 0; i < sis.size(); i++)
838 sis.gene(i, dad.gene(i));
842 bro.gene(0, dad.gene(0));
844 while (mom.gene(current) != dad.gene(0))
846 for (
int i = 0; i < bro.size(); i++)
848 if (dad.gene(i) == mom.gene(current))
850 bro.gene(i, dad.gene(i));
858 for (
int i = 0; i < bro.size(); i++)
860 bro.gene(i, mom.gene(i));
881 mask.size(sis.length());
884 sis.gene(0, parent1->gene(0));
886 while (parent2->gene(current) != parent1->gene(0))
888 for (
int i = 0; i < sis.size(); i++)
890 if (parent1->gene(i) == parent2->gene(current))
892 sis.gene(i, parent1->gene(i));
899 for (
int i = 0; i < sis.size(); i++)
901 sis.gene(i, parent2->gene(i));
919 GA1DArrayGenome(
unsigned int length, GAGenome::Evaluator f =
nullptr,
void *u =
nullptr)
921 GAGenome(DEFAULT_1DARRAY_INITIALIZER, DEFAULT_1DARRAY_MUTATOR, DEFAULT_1DARRAY_COMPARATOR)
925 nx = minX = maxX = length;
926 crossover(DEFAULT_1DARRAY_CROSSOVER);
945 for (
int i = 0; i < this->size(); i++)
946 gene(i, *(array + i));
951 GAGenome * clone(GAGenome::CloneMethod flag = CloneMethod::CONTENTS)
const override
954 if (flag == CloneMethod::CONTENTS)
960 cpy->GAGenome::copy(*
this);
976 void copy(
const GAGenome &orig)
override
992 int read(std::istream &)
override
994 GAErr(GA_LOC, className(),
"read", GAError::OpUndef);
1000 int write(std::ostream &os)
const override
1002 for (
unsigned int i = 0; i < nx; i++)
1003 os << gene(i) <<
" ";
1007 bool equal(
const GAGenome &c)
const override
1010 return ((
this == &c) ?
true : ((nx != b.nx) ? 0 :
GAArray<T>::equal(b, 0, 0, nx)));
1013 const T &gene(
unsigned int x = 0)
const {
return this->a[x]; }
1014 T &gene(
unsigned int x,
const T &value)
1016 if (this->a.at(x) != value)
1018 this->a.at(x) = value;
1021 return this->a.at(x);
1023 int length()
const {
return nx; }
1043 virtual int resize(
int len)
1045 if (len == STA_CAST(
int, nx))
1048 if (len == GAGenome::ANY_SIZE)
1049 len = GARandomInt(minX, maxX);
1052 else if (minX == maxX)
1056 if (len < STA_CAST(
int, minX))
1058 if (len > STA_CAST(
int, maxX))
1064 return this->size();
1073 int resizeBehaviour(
unsigned int lower,
unsigned int upper)
1077 GAErr(GA_LOC, className(),
"resizeBehaviour",
1078 GAError::BadResizeBehaviour);
1079 return resizeBehaviour();
1087 return resizeBehaviour();
1090 int resizeBehaviour()
const
1098 void copy(
const GA1DArrayGenome<T> &orig,
unsigned int r,
unsigned int x,
unsigned int l)
1100 if (l > 0 && x < orig.nx && r < nx)
1102 if (x + l > orig.nx)
1110 void swap(
unsigned int i,
unsigned int j)
1130 for (
int i =
a; i < b; i++)
1131 if (c.gene(index) == dad.gene(i))
1171 GADefineIdentity(
"GA1DArrayAlleleGenome", GAID::ArrayAlleleGenome);
1178 static void UniformInitializer(
GAGenome &c)
1181 child.
resize(GAGenome::ANY_SIZE);
1182 for (
int i = child.length() - 1; i >= 0; i--)
1183 child.gene(i, child.alleleset(i).allele());
1190 static void OrderedInitializer(
GAGenome &c)
1193 child.
resize(GAGenome::ANY_SIZE);
1194 int length = child.length() - 1;
1196 for (
int i = length; i >= 0; i--)
1198 child.gene(i, child.alleleset().allele(n++));
1199 if (n >= child.alleleset().size())
1202 for (
int i = length; i >= 0; i--)
1203 child.swap(i, GARandomInt(0, length));
1209 static int FlipMutator(
GAGenome &c,
float pmut)
1216 float nMut = pmut * STA_CAST(
float, child.length());
1220 for (
int i = child.length() - 1; i >= 0; i--)
1222 if (GAFlipCoin(pmut))
1224 child.gene(i, child.alleleset(i).allele());
1231 for (
int n = 0; n < nMut; n++)
1233 int i = GARandomInt(0, child.length() - 1);
1234 child.gene(i, child.alleleset(i).allele());
1237 return (STA_CAST(
int, nMut));
1242 GAGenome::Evaluator f =
nullptr,
void *u =
nullptr)
1258 for (
int i = 0; i < size(); i++)
1259 aset.at(i) = sa.set(i);
1294 GAGenome *clone(GAGenome::CloneMethod = GAGenome::CloneMethod::CONTENTS)
const override
1299 void copy(
const GAGenome &orig)
override
1308 if (size() != c->size())
1310 aset = std::vector<GAAlleleSet<T>>(c->size());
1312 for (std::size_t i = 0; i <
aset.size(); i++)
1322 int write(std::ostream &os)
const override
1327 bool equal(
const GAGenome &c)
const override
1342 unsigned int oldx = this->nx;
1344 if (this->nx > oldx)
1346 for (
unsigned int i = oldx; i < this->nx; i++)
1347 this->a.at(i) =
aset.at(i % size()).allele();
1354 return aset.at(i % size());
1357 int size()
const {
return aset.size(); }
Definition: GA1DArrayGenome.hpp:1169
std::vector< GAAlleleSet< T > > aset
the allele set(s) for this genome
Definition: GA1DArrayGenome.hpp:1361
int resize(int len) override
If we resize to a larger length then we need to set the contents to a valid value (ie one of our alle...
Definition: GA1DArrayGenome.hpp:1340
1 dimensional Array Genome
Definition: GA1DArrayGenome.hpp:42
static int SwapMutator(GAGenome &c, float pmut)
Randomly swap elements in the array.
Definition: GA1DArrayGenome.hpp:52
static float ElementComparator(const GAGenome &a, const GAGenome &b)
How similar are two genomes.
Definition: GA1DArrayGenome.hpp:90
static int UniformCrossover(const GAGenome &p1, const GAGenome &p2, GAGenome *c1, GAGenome *c2)
Randomly take bits from each parent.
Definition: GA1DArrayGenome.hpp:116
Definition: GAAllele.h:404
Definition: GAAllele.h:192
Array Base Class.
Definition: GAArray.h:29
std::vector< T > a
the contents of the array
Definition: GAArray.h:121
The base genome class just defines the genome interface - how to mutate, crossover,...
Definition: GAGenome.h:200
GAMask.
Definition: GAMask.h:15