summaryrefslogtreecommitdiff
path: root/src/brain/neural_network.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/brain/neural_network.cpp')
-rw-r--r--src/brain/neural_network.cpp77
1 files changed, 41 insertions, 36 deletions
diff --git a/src/brain/neural_network.cpp b/src/brain/neural_network.cpp
index f3753f7..64d6979 100644
--- a/src/brain/neural_network.cpp
+++ b/src/brain/neural_network.cpp
@@ -2,39 +2,46 @@
#include "brain/neuron.h"
#include <limits>
-NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, int numberOfSensors, int numberOfOutputs)
+NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, unsigned int numberOfSensors, unsigned int numberOfOutputs)
{
+ _neurons.reserve(400);
+ _sensors.reserve(numberOfSensors);
+ _sensors.reserve(numberOfOutputs);
+
_biasNode = std::make_shared<BiasNode>();
- for (int i=0; i<numberOfSensors; ++i)
+ for (unsigned int i=0; i<numberOfSensors; ++i)
{
- _sensors[i] = std::make_shared<Sensor>();
+ auto sensor = std::make_shared<Sensor>();
+ _sensors.push_back(sensor);
}
- for (int i=0; i<numberOfOutputs; ++i)
+ for (unsigned int i=0; i<numberOfOutputs; ++i)
{
- auto output = std::make_shared<Neuron>();
+ auto output = findOrAddNeuron(i);
_outputs.push_back(output);
- _neurons[i] = output;
}
parseFile(std::move(networkConfigFile));
}
-NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, std::vector<bool> sensorInitialValues, int numberOfOutputs)
+NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, std::vector<bool> sensorInitialValues, unsigned int numberOfOutputs)
{
+ _neurons.reserve(400);
+ _sensors.reserve(sensorInitialValues.size());
+ _sensors.reserve(numberOfOutputs);
+
_biasNode = std::make_shared<BiasNode>();
for (unsigned int i=0; i<sensorInitialValues.size(); ++i)
{
auto sensor = std::make_shared<Sensor>();
sensor->setActivation(sensorInitialValues[i] ? 1 : 0);
- _sensors[i] = sensor;
+ _sensors.push_back(sensor);
}
- for (int i=0; i<numberOfOutputs; ++i)
+ for (unsigned int i=0; i<numberOfOutputs; ++i)
{
- auto output = std::make_shared<Neuron>();
+ auto output = findOrAddNeuron(i);
_outputs.push_back(output);
- _neurons[i] = output;
}
parseFile(std::move(networkConfigFile));
@@ -44,8 +51,8 @@ void NeuralNetwork::parseFile(std::istream &&file)
{
double weight;
char srcType;
- int srcId;
- int destId;
+ unsigned int srcId;
+ unsigned int destId;
while (file.get(srcType) &&
file >> srcId &&
@@ -77,59 +84,57 @@ void NeuralNetwork::parseFile(std::istream &&file)
void NeuralNetwork::addLink(std::shared_ptr<NeuralNode> source, std::shared_ptr<Neuron> destination, double weight)
{
- std::unique_ptr<NeuralLink> link(new NeuralLink(source, weight));
+ NeuralLink link(source, weight);
destination->addInput(std::move(link));
}
-std::shared_ptr<Sensor> NeuralNetwork::findOrAddSensor(int id)
+std::shared_ptr<Sensor> NeuralNetwork::findOrAddSensor(unsigned int id)
{
- auto sensor = _sensors[id];
- if (!sensor)
+ while (_sensors.size() <= id)
{
- sensor = std::make_shared<Sensor>();
- _sensors[id] = sensor;
+ auto sensor = std::make_shared<Sensor>();
+ _sensors.push_back(sensor);
}
- return sensor;
+
+ return _sensors.at(id);
}
-std::shared_ptr<Neuron> NeuralNetwork::findOrAddNeuron(int id)
+std::shared_ptr<Neuron> NeuralNetwork::findOrAddNeuron(unsigned int id)
{
- auto neuron = _neurons[id];
- if (!neuron)
+ while (_neurons.size() <= id)
{
- neuron = std::make_shared<Neuron>();
- _neurons[id] = neuron;
+ auto neuron = std::make_shared<Neuron>();
+ _neurons.push_back(neuron);
}
- return neuron;
+
+ return _neurons.at(id);
}
-void NeuralNetwork::setInput(int inputIndex, double activation)
+void NeuralNetwork::setInput(unsigned int inputIndex, double activation)
{
_sensors.at(inputIndex)->setActivation(activation);
}
-int NeuralNetwork::findMaxOutputIndex() const
+unsigned int NeuralNetwork::findMaxOutputIndex() const
{
bool anyNodeChanged = true;
- for (unsigned int iteration=0; anyNodeChanged && iteration<_neurons.size()*10; ++iteration)
+ auto maxIterations = _neurons.size()*10;
+ for (unsigned int iteration=0; anyNodeChanged && iteration<maxIterations; ++iteration)
{
anyNodeChanged = false;
for (auto const& neuron : _neurons)
{
- neuron.second->calculateActivation();
- if (neuron.second->activationChanged())
- {
- anyNodeChanged = true;
- }
+ bool activationChanged = neuron->calculateActivation();
+ anyNodeChanged = anyNodeChanged || activationChanged;
}
}
int currentMaxIndex = 0;
- double currentMaxActivation = _outputs[0]->activation();
+ double currentMaxActivation = _outputs.at(0)->activation();
for (unsigned int i=1; i<_outputs.size(); ++i)
{
- double activation = _outputs[i]->activation();
+ double activation = _outputs.at(i)->activation();
if (activation >= currentMaxActivation)
{
currentMaxActivation = activation;