30 GADefineIdentity(
"GATreeGenome", GAID::TreeGenome);
37 static int DestructiveMutator(
GAGenome &c,
float pmut)
45 float nMut = pmut * STA_CAST(
float, n);
49 for (i = 0; i < n; i++)
51 if (GAFlipCoin(pmut) && child.warp(i))
60 for (i = 0; i < nMut; i++)
62 if (child.warp(GARandomInt(0, n - 1)))
68 return (STA_CAST(
int, nMut));
77 static int SwapNodeMutator(
GAGenome &c,
float pmut)
85 float nMut = pmut * STA_CAST(
float, n);
90 for (i = 0; i < n; i++)
94 child.swap(i, GARandomInt(0, n - 1));
101 for (i = 0; i < nMut; i++)
102 child.swap(GARandomInt(0, n - 1), GARandomInt(0, n - 1));
106 return (STA_CAST(
int, nMut * 2));
119 static int SwapSubtreeMutator(
GAGenome &c,
float pmut)
126 int n = child.size();
127 float nMut = pmut * STA_CAST(
float, n);
132 for (
int i = 0; i < n; i++)
134 if (GAFlipCoin(pmut))
136 int b = GARandomInt(0, n - 1);
137 if (!child.ancestral(i, b))
138 child.swaptree(i, b);
145 for (
int i = 0; i < nMut; i++)
147 int a = GARandomInt(0, n - 1);
148 int b = GARandomInt(0, n - 1);
149 if (!child.ancestral(a, b))
150 child.swaptree(a, b);
155 return (STA_CAST(
int, nMut * 2));
178 unsigned int a = GARandomInt(0, mom.size() - 1);
179 unsigned int b = GARandomInt(0, dad.size() - 1);
190 if (momiter.warp(a) && daditer.warp(b))
192 sis.GATree<T>::copy(mom);
193 tree = dad.GATree<T>::clone(b);
202 if (momiter.warp(a) && daditer.warp(b))
204 bro.GATree<T>::copy(dad);
205 tree = mom.GATree<T>::clone(a);
220 if (momiter.warp(a) && daditer.warp(b))
222 sis.GATree<T>::copy(mom);
223 tree = dad.GATree<T>::clone(b);
232 if (momiter.warp(a) && daditer.warp(b))
234 sis.GATree<T>::copy(dad);
235 tree = mom.GATree<T>::clone(a);
258 return STA_CAST(
float, _GATreeCompare(sis.rt, bro.rt));
264 GATreeGenome(GAGenome::Evaluator f =
nullptr,
void *u =
nullptr)
266 DEFAULT_TREE_COMPARATOR)
270 crossover(DEFAULT_TREE_CROSSOVER);
286 clone(GAGenome::CloneMethod flag = CloneMethod::CONTENTS)
const override
289 if (flag == CloneMethod::CONTENTS)
295 cpy->GAGenome::copy(*
this);
300 void copy(
const GAGenome &orig)
override
329 os << node->parent <<
" ";
331 os << node->child <<
" ";
333 os << node->next <<
" ";
335 os << node->prev <<
" ";
337 os << &(n->contents) <<
"\n";
338 _tt(os, DYN_CAST(
GANode<T> *, node->child));
340 for (
GANodeBASE *tmp = node->next; tmp && tmp != node; tmp = tmp->next)
345 os << tmp->parent <<
" ";
347 os << tmp->child <<
" ";
349 os << tmp->next <<
" ";
351 os << tmp->prev <<
" ";
353 os << &(DYN_CAST(
GANode<T> *, tmp)->contents) <<
"\n";
354 _tt(os, DYN_CAST(
GANode<T> *, tmp->child));
358 int write(std::ostream &os)
const override
360 os <<
"node parent child next prev "
366 bool equal(
const GAGenome &c)
const override
371 return _GATreeCompare(this->rt, b.rt) ? false :
true;
388 int swaptree(
unsigned int i,
unsigned int j)
393 int swap(
unsigned int i,
unsigned int j)
403 int insert(
GATree<T> *t, GATreeBASE::Location where = GATreeBASE::BELOW)
408 int insert(
const T &t, GATreeBASE::Location where = GATreeBASE::BELOW)
The base genome class just defines the genome interface - how to mutate, crossover,...
Definition: GAGenome.h:200
Definition: GATreeGenome.hpp:28
Definition: GATree.hpp:474
Definition: GATree.hpp:163
This is the basic node object.
Definition: GANode.h:18