From 8eebf1079fbed2848ee47cf990f5def5926a0c1f Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 21:24:15 +0200 Subject: Refile for merging repos --- 2015-spacebot/src/brain/neural_network.cpp | 163 +++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 2015-spacebot/src/brain/neural_network.cpp (limited to '2015-spacebot/src/brain/neural_network.cpp') diff --git a/2015-spacebot/src/brain/neural_network.cpp b/2015-spacebot/src/brain/neural_network.cpp new file mode 100644 index 0000000..c8177e8 --- /dev/null +++ b/2015-spacebot/src/brain/neural_network.cpp @@ -0,0 +1,163 @@ +#include "brain/neural_network.h" +#include "brain/neuron.h" +#include + +NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, unsigned int numberOfSensors, unsigned int numberOfOutputs) +{ + _neurons.reserve(400); + _sensors.reserve(numberOfSensors); + _outputs.reserve(numberOfOutputs); + + _biasNode = std::make_shared(); + + for (unsigned int i=0; i(i); + _sensors.push_back(sensor); + } + for (unsigned int i=0; i sensorInitialValues, unsigned int numberOfOutputs) +{ + _neurons.reserve(400); + _sensors.reserve(sensorInitialValues.size()); + _outputs.reserve(numberOfOutputs); + + _biasNode = std::make_shared(); + + for (unsigned int i=0; i(i); + sensor->setActivation(sensorInitialValues[i] ? 1 : 0); + _sensors.push_back(sensor); + } + for (unsigned int i=0; i> srcId && + file.ignore(std::numeric_limits::max(), 'n') && + file >> destId && + file >> weight && + file.ignore(std::numeric_limits::max(), '\n')) + { + std::shared_ptr source; + std::shared_ptr destination; + switch (srcType) + { + case 's': + source = findOrAddSensor(srcId); + break; + case 'b': + source = _biasNode; + break; + default: + source = findOrAddNeuron(srcId); + } + destination = findOrAddNeuron(destId); + + addLink(source, destination, weight); + } + +} + +void NeuralNetwork::addLink(std::shared_ptr source, std::shared_ptr destination, double weight) +{ + NeuralLink link(source.get(), weight); + destination->addInput(std::move(link)); +} + +std::shared_ptr NeuralNetwork::findOrAddSensor(unsigned int id) +{ + while (_sensors.size() <= id) + { + auto sensor = std::make_shared(_sensors.size()); + _sensors.push_back(sensor); + } + + return _sensors.at(id); +} + +std::shared_ptr NeuralNetwork::findOrAddNeuron(unsigned int id) +{ + while (_neurons.size() <= id) + { + auto neuron = std::make_shared(_neurons.size()); + _neurons.push_back(neuron); + } + + return _neurons.at(id); +} + +void NeuralNetwork::setInput(unsigned int inputIndex, double activation) +{ + _sensors.at(inputIndex)->setActivation(activation); +} + +unsigned int NeuralNetwork::findMaxOutputIndex() const +{ + bool anyNodeChanged = true; + auto maxIterations = _neurons.size()*10; + for (unsigned int iteration=0; anyNodeChanged && iterationcalculateActivation(); + anyNodeChanged = anyNodeChanged || activationChanged; + } + } + + int currentMaxIndex = 0; + double currentMaxActivation = _outputs.at(0)->activation(); + + for (unsigned int i=1; i<_outputs.size(); ++i) + { + double activation = _outputs.at(i)->activation(); + if (activation >= currentMaxActivation) + { + currentMaxActivation = activation; + currentMaxIndex = i; + } + } + return currentMaxIndex; +} + +bool NeuralNetwork::linkExists(std::string srcIdentifier, std::string destIdentifier, double weight) const +{ + std::shared_ptr dest; + + for (auto const& node : _neurons) + { + if (node->identifier() == destIdentifier) + { + dest = node; + } + } + + if (!dest) + { + return false; + } + return dest->hasInputWithWeight(srcIdentifier, weight); +} -- cgit v1.2.3