diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | include/brain/bias_node.h | 7 | ||||
-rw-r--r-- | include/brain/neural_node.h | 14 | ||||
-rw-r--r-- | include/brain/neuron.h | 5 | ||||
-rw-r--r-- | include/brain/sensor.h | 11 | ||||
-rw-r--r-- | src/brain/bias_node.cpp | 6 | ||||
-rw-r--r-- | src/brain/neural_network.cpp | 31 | ||||
-rw-r--r-- | src/brain/neural_node.cpp | 6 | ||||
-rw-r--r-- | src/brain/neuron.cpp | 16 | ||||
-rw-r--r-- | src/brain/sensor.cpp | 5 |
10 files changed, 46 insertions, 57 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index fd6a32d..9cbfa61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.2.2) project(Spacebot) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wpedantic -Wextra") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=native -Wall -Wpedantic -Wextra -fprofile-use") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) diff --git a/include/brain/bias_node.h b/include/brain/bias_node.h index 501a0a0..8920eb3 100644 --- a/include/brain/bias_node.h +++ b/include/brain/bias_node.h @@ -5,6 +5,9 @@ class BiasNode: public NeuralNode { public: - BiasNode(); - virtual double activation() const { return 1; } + BiasNode() + { + _activation = 1; + _activationChanged = false; + } }; diff --git a/include/brain/neural_node.h b/include/brain/neural_node.h index c7b4335..57523eb 100644 --- a/include/brain/neural_node.h +++ b/include/brain/neural_node.h @@ -3,13 +3,9 @@ class NeuralNode { public: - NeuralNode(char type, int id); - - virtual double activation() const = 0; - - char type() const { return _type; } - int id() const { return _id; } -private: - char _type; - int _id; + double activation() const { return _activation; } + bool activationChanged() const { return _activationChanged; } +protected: + double _activation; + bool _activationChanged; }; diff --git a/include/brain/neuron.h b/include/brain/neuron.h index d017b0d..2746372 100644 --- a/include/brain/neuron.h +++ b/include/brain/neuron.h @@ -9,11 +9,8 @@ class Neuron : public NeuralNode { public: - Neuron(int id); - virtual ~Neuron() {} - virtual double activation() const; - void addInput(std::unique_ptr<NeuralLink>&& link); + void calculateActivation(); private: std::vector<std::unique_ptr<NeuralLink>> _inputLinks; diff --git a/include/brain/sensor.h b/include/brain/sensor.h index b33080b..652ce07 100644 --- a/include/brain/sensor.h +++ b/include/brain/sensor.h @@ -5,12 +5,9 @@ class Sensor: public NeuralNode { public: - Sensor(int id); - virtual ~Sensor() {} - + Sensor() + { + _activationChanged = false; + }; void setActivation(double activation) { _activation = activation; } - virtual double activation() const { return _activation; } - -private: - double _activation; }; diff --git a/src/brain/bias_node.cpp b/src/brain/bias_node.cpp deleted file mode 100644 index 99ae70d..0000000 --- a/src/brain/bias_node.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "brain/bias_node.h" - -BiasNode::BiasNode() - :NeuralNode('b', 0) -{ -} diff --git a/src/brain/neural_network.cpp b/src/brain/neural_network.cpp index 9061194..f3753f7 100644 --- a/src/brain/neural_network.cpp +++ b/src/brain/neural_network.cpp @@ -8,11 +8,11 @@ NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, int numberOfSenso for (int i=0; i<numberOfSensors; ++i) { - _sensors[i] = std::make_shared<Sensor>(i); + _sensors[i] = std::make_shared<Sensor>(); } for (int i=0; i<numberOfOutputs; ++i) { - auto output = std::make_shared<Neuron>(i); + auto output = std::make_shared<Neuron>(); _outputs.push_back(output); _neurons[i] = output; } @@ -26,13 +26,13 @@ NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, std::vector<bool> for (unsigned int i=0; i<sensorInitialValues.size(); ++i) { - auto sensor = std::make_shared<Sensor>(i); + auto sensor = std::make_shared<Sensor>(); sensor->setActivation(sensorInitialValues[i] ? 1 : 0); _sensors[i] = sensor; } for (int i=0; i<numberOfOutputs; ++i) { - auto output = std::make_shared<Neuron>(i); + auto output = std::make_shared<Neuron>(); _outputs.push_back(output); _neurons[i] = output; } @@ -86,7 +86,7 @@ std::shared_ptr<Sensor> NeuralNetwork::findOrAddSensor(int id) auto sensor = _sensors[id]; if (!sensor) { - sensor = std::make_shared<Sensor>(id); + sensor = std::make_shared<Sensor>(); _sensors[id] = sensor; } return sensor; @@ -97,7 +97,7 @@ std::shared_ptr<Neuron> NeuralNetwork::findOrAddNeuron(int id) auto neuron = _neurons[id]; if (!neuron) { - neuron = std::make_shared<Neuron>(id); + neuron = std::make_shared<Neuron>(); _neurons[id] = neuron; } return neuron; @@ -110,9 +110,24 @@ void NeuralNetwork::setInput(int inputIndex, double activation) int NeuralNetwork::findMaxOutputIndex() const { - double currentMaxActivation = 0; + bool anyNodeChanged = true; + for (unsigned int iteration=0; anyNodeChanged && iteration<_neurons.size()*10; ++iteration) + { + anyNodeChanged = false; + for (auto const& neuron : _neurons) + { + neuron.second->calculateActivation(); + if (neuron.second->activationChanged()) + { + anyNodeChanged = true; + } + } + } + int currentMaxIndex = 0; - for (unsigned int i=0; i<_outputs.size(); ++i) + double currentMaxActivation = _outputs[0]->activation(); + + for (unsigned int i=1; i<_outputs.size(); ++i) { double activation = _outputs[i]->activation(); if (activation >= currentMaxActivation) diff --git a/src/brain/neural_node.cpp b/src/brain/neural_node.cpp deleted file mode 100644 index 9bdd7c6..0000000 --- a/src/brain/neural_node.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "brain/neural_node.h" - -NeuralNode::NeuralNode(char type, int id) - :_type(type), _id(id) -{ -} diff --git a/src/brain/neuron.cpp b/src/brain/neuron.cpp index 527e7da..f4fa12f 100644 --- a/src/brain/neuron.cpp +++ b/src/brain/neuron.cpp @@ -1,25 +1,23 @@ #include "brain/neuron.h" #include <cmath> -Neuron::Neuron(int id) - :NeuralNode('n', id) -{ -} - double Neuron::sigmoid(double input) const { double slope = 4.924273; return (1/(1+(std::exp(-(slope*input))))); } -double Neuron::activation() const +void Neuron::calculateActivation() { - double activationSum = 0; + double newActivation = 0; for (auto const& link : _inputLinks) { - activationSum += link->weightedActivation(); + newActivation += link->weightedActivation(); } - return sigmoid(activationSum); + newActivation = sigmoid(newActivation); + + _activationChanged = newActivation != _activation; + _activation = newActivation; } void Neuron::addInput(std::unique_ptr<NeuralLink>&& link) diff --git a/src/brain/sensor.cpp b/src/brain/sensor.cpp deleted file mode 100644 index 3069659..0000000 --- a/src/brain/sensor.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "brain/sensor.h" - -Sensor::Sensor(int id) - :NeuralNode('s', id) -{} |