27 RandomizerP randP = cart->state_->getRandomizer();
28 const uint nConstants = cart->nConstants_;
29 const uint nOutputs = cart->nOutputs_;
30 const uint nVariables = cart->nVariables_;
31 const uint nRows = cart->nRows_;
32 const uint nCols = cart->nCols_;
33 const uint nLevelsBack = cart->nLevelsBack_;
34 const uint maxArity = cart->maxArity_;
35 const uint nInputs = cart->nInputs_;
37 std::vector<uint> activeNodes;
38 cart->getActiveFunctionNodes(activeNodes);
41 if (activeNodes.size() == nRows * nCols)
44 std::vector<uint> allNodes;
45 for (uint i = 0; i < nRows * nCols; i++) {
46 allNodes.push_back(i + nInputs);
49 std::vector<uint> silentNodes;
50 std::sort(activeNodes.begin(), activeNodes.end());
51 set_difference(allNodes.begin(), allNodes.end(), activeNodes.begin(), activeNodes.end(), inserter(silentNodes, silentNodes.begin()));
54 uint silentNodeIndex = randP->getRandomInteger(0, silentNodes.size() - 1);
55 uint silentNode = silentNodes.at(silentNodeIndex);
57 uint nodeColumn = (silentNode - nInputs) / nRows;
58 int minColumn = nodeColumn - nLevelsBack;
59 uint lowerBound = nInputs + minColumn * nRows;
60 if (minColumn < 0) lowerBound = 0;
61 uint upperBound = nInputs + nodeColumn * nRows;
62 uint newSilentNodeInput = randP->getRandomInteger(lowerBound, upperBound - 1);
65 uint inputIndex = randP->getRandomInteger(1, maxArity);
67 uint genotypeIndex = (silentNode - nInputs) * (maxArity + 1);
69 cart->at(genotypeIndex + inputIndex) = newSilentNodeInput;