diff options
Diffstat (limited to '2015-spacebot/include/brain')
-rw-r--r-- | 2015-spacebot/include/brain/bias_node.h | 12 | ||||
-rw-r--r-- | 2015-spacebot/include/brain/neural_link.h | 17 | ||||
-rw-r--r-- | 2015-spacebot/include/brain/neural_network.h | 41 | ||||
-rw-r--r-- | 2015-spacebot/include/brain/neural_node.h | 18 | ||||
-rw-r--r-- | 2015-spacebot/include/brain/neuron.h | 22 | ||||
-rw-r--r-- | 2015-spacebot/include/brain/sensor.h | 10 |
6 files changed, 120 insertions, 0 deletions
diff --git a/2015-spacebot/include/brain/bias_node.h b/2015-spacebot/include/brain/bias_node.h new file mode 100644 index 0000000..77c5884 --- /dev/null +++ b/2015-spacebot/include/brain/bias_node.h @@ -0,0 +1,12 @@ +#pragma once + +#include "brain/neural_node.h" + +class BiasNode: public NeuralNode +{ +public: +BiasNode() : NeuralNode("b0") + { + _activation = 1; + } +}; diff --git a/2015-spacebot/include/brain/neural_link.h b/2015-spacebot/include/brain/neural_link.h new file mode 100644 index 0000000..14f58b9 --- /dev/null +++ b/2015-spacebot/include/brain/neural_link.h @@ -0,0 +1,17 @@ +#pragma once + +#include "neural_node.h" + +class NeuralLink +{ +public: + NeuralLink(NeuralNode* input, double weight); + double weightedActivation() const; + + double weight() const { return _weight; } + std::string inputIdentifier() const { return _input->identifier(); } + +private: + NeuralNode* _input; + double _weight; +}; diff --git a/2015-spacebot/include/brain/neural_network.h b/2015-spacebot/include/brain/neural_network.h new file mode 100644 index 0000000..7fcf5f4 --- /dev/null +++ b/2015-spacebot/include/brain/neural_network.h @@ -0,0 +1,41 @@ +#pragma once + +#include <memory> +#include <istream> +#include <vector> +#include <map> +#include <string> + +#include "brain/neural_node.h" +#include "brain/sensor.h" +#include "brain/bias_node.h" +#include "brain/neuron.h" + +class NeuralNetwork +{ +public: + NeuralNetwork(std::istream &&networkConfigFile, unsigned int numberOfSensors, unsigned int numberOfOutputs); + NeuralNetwork(std::istream &&networkConfigFile, std::vector<bool> sensorInitialValues, unsigned int numberOfOutputs); + + void setInput(unsigned int inputIndex, double activation); + unsigned int findMaxOutputIndex() const; + + unsigned int numberOfSensors() const { return _sensors.size(); } + unsigned int numberOfOutputs() const { return _outputs.size(); } + unsigned int numberOfNeurons() const { return _neurons.size(); } + + bool linkExists(std::string srcIdentifier, std::string destIdentifier, double weight) const; + +private: + std::vector<std::shared_ptr<Sensor>> _sensors; + std::shared_ptr<BiasNode> _biasNode; + std::vector<std::shared_ptr<Neuron>> _neurons; + std::vector<std::shared_ptr<Neuron>> _outputs; + + void parseFile(std::istream &&file); + + void addLink(std::shared_ptr<NeuralNode> source, std::shared_ptr<Neuron> destination, double weight); + std::shared_ptr<Sensor> findOrAddSensor(unsigned int id); + std::shared_ptr<Neuron> findOrAddNeuron(unsigned int id); +}; + diff --git a/2015-spacebot/include/brain/neural_node.h b/2015-spacebot/include/brain/neural_node.h new file mode 100644 index 0000000..2684146 --- /dev/null +++ b/2015-spacebot/include/brain/neural_node.h @@ -0,0 +1,18 @@ +#pragma once + +#include <string> + +class NeuralNode +{ +public: + double activation() const { return _activation; } + std::string identifier() const { return _identifier; } + +NeuralNode(std::string identifier): _identifier(identifier) {} + +protected: + double _activation; + +private: + std::string _identifier; +}; diff --git a/2015-spacebot/include/brain/neuron.h b/2015-spacebot/include/brain/neuron.h new file mode 100644 index 0000000..ca26c73 --- /dev/null +++ b/2015-spacebot/include/brain/neuron.h @@ -0,0 +1,22 @@ +#pragma once + +#include <memory> +#include <vector> + +#include "neural_node.h" +#include "neural_link.h" + +class Neuron : public NeuralNode +{ +public: + void addInput(NeuralLink&& link); + bool calculateActivation(); + +Neuron(int index) : NeuralNode('n'+std::to_string(index)){}; + + bool hasInputWithWeight(std::string srcIdentifier, double weight) const; + +private: + std::vector<NeuralLink> _inputLinks; + double sigmoid(double input) const; +}; diff --git a/2015-spacebot/include/brain/sensor.h b/2015-spacebot/include/brain/sensor.h new file mode 100644 index 0000000..10f62a7 --- /dev/null +++ b/2015-spacebot/include/brain/sensor.h @@ -0,0 +1,10 @@ +#pragma once + +#include "brain/neural_node.h" + +class Sensor: public NeuralNode +{ +public: +Sensor(int index) :NeuralNode('s'+std::to_string(index)){} + void setActivation(double activation) { _activation = activation; } +}; |