summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--include/brain/bias_node.h7
-rw-r--r--include/brain/neural_node.h14
-rw-r--r--include/brain/neuron.h5
-rw-r--r--include/brain/sensor.h11
-rw-r--r--src/brain/bias_node.cpp6
-rw-r--r--src/brain/neural_network.cpp31
-rw-r--r--src/brain/neural_node.cpp6
-rw-r--r--src/brain/neuron.cpp16
-rw-r--r--src/brain/sensor.cpp5
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)
-{}