ECF 1.7
CartesianMutOnePointActive.cpp
1#include "CartesianMutOnePointActive.h"
2#include "Cartesian_c.h"
3#include "FunctionSet.h"
4#include <cmath>
5#include <vector>
6#include <algorithm>
7
8namespace Cartesian {
9
11 {
12 myGenotype_->registerParameter(state, "mut.onepointactive", (voidP) new double(0), ECF::DOUBLE);
13 }
14
15
17 {
18 voidP sptr = myGenotype_->getParameterValue(state, "mut.onepointactive");
19 probability_ = *((double*)sptr.get());
20 return true;
21 }
22
24 {
25 Cartesian* cart = (Cartesian*)(gene.get());
26 RandomizerP rand = cart->state_->getRandomizer();
27 const uint size = cart->getGenomeSize();
28 const uint nConstants = cart->nConstants_;
29 const uint nOutputs = cart->nOutputs_;
30 const uint nRows = cart->nRows_;
31 const uint nCols = cart->nCols_;
32 const uint nFunctions = cart->nFunctions_;
33 const uint nInputs = cart->nInputs_;
34 uint randomGeneIndex;
35
36 // select random active function or output node
37 std::vector<uint> validNodes;
38 cart->getActiveFunctionNodes(validNodes);
39 for (uint i = 0; i < nOutputs; i++)
40 validNodes.push_back((uint) cart->nodes_.size() + i);
41 randomGeneIndex = validNodes[rand->getRandomInteger((uint) validNodes.size())];
42
43 if (randomGeneIndex < (size + nInputs - nOutputs)) {
44 // Function node
45 uint iColumn = (randomGeneIndex - nInputs) / nRows;
46 if (rand->getRandomInteger(2) == 0) {
47 // mutate function and arguments
48 int functionID = rand->getRandomInteger(nFunctions);
49 Function* func = cart->functionSet_->vFunctions[functionID].get();
50 cart->nodes_[randomGeneIndex].setPrimitive(cart->functionSet_->vFunctions[functionID]);
51 // generate random arguments
52 cart->nodes_[randomGeneIndex].arguments_.resize(func->getNumberOfArguments());
53 for (uint k = 0; k < func->getNumberOfArguments(); k++) {
54 uint iArgument = cart->randomNodeInputConnection(iColumn);
55 cart->nodes_[randomGeneIndex].arguments_[k] = iArgument;
56 }
57 } else {
58 // mutate one of the arguments
59 uint iArg = rand->getRandomInteger(cart->nodes_[randomGeneIndex].primitive_->getNumberOfArguments());
60 cart->nodes_[randomGeneIndex].arguments_[iArg] = cart->randomNodeInputConnection(iColumn);
61 }
62 } else {
63 // Output gene
64 cart->outputs_[randomGeneIndex - cart->nodes_.size()] = cart->randomOutputConnection();
65 }
66
67 //std::cout << randomGeneIndex << "\n";
68
69 return true;
70 }
71
72}
bool mutate(GenotypeP gene)
Performs mutation of a genotype object. The genotype object must be initialized!
void registerParameters(StateP)
Register parameters with the system. Called before MutationOp::initialize.
bool initialize(StateP)
Initialize mutation operator. Called before first mutation operation.
double probability_
probability of usage of this mutation operator
Definition Mutation.h:40
GenotypeP myGenotype_
pointer to the Genotype that defines this MutationOp
Definition Mutation.h:41