summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin Worthe <justin.worthe@gmail.com>2015-08-29 20:22:40 +0200
committerJustin Worthe <justin.worthe@gmail.com>2015-08-29 20:22:40 +0200
commitf35c5fca6a9faaa1caf3c1992844adf9033744e8 (patch)
tree766049f6ca2841a9c95a64f80cc316dada0f43fb /src
parent5afd2af2d2c13c9062f131bd728c018d3ac3adb9 (diff)
Improved efficiency of network
Diffstat (limited to 'src')
-rw-r--r--src/brain/neural_network.cpp77
-rw-r--r--src/brain/neuron.cpp12
-rw-r--r--src/move_string_mapper.cpp1
-rw-r--r--src/spacebot.cpp2
4 files changed, 49 insertions, 43 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;
diff --git a/src/brain/neuron.cpp b/src/brain/neuron.cpp
index f4fa12f..d1dd338 100644
--- a/src/brain/neuron.cpp
+++ b/src/brain/neuron.cpp
@@ -3,24 +3,26 @@
double Neuron::sigmoid(double input) const
{
- double slope = 4.924273;
+ const double slope = 4.924273;
return (1/(1+(std::exp(-(slope*input)))));
}
-void Neuron::calculateActivation()
+bool Neuron::calculateActivation()
{
double newActivation = 0;
for (auto const& link : _inputLinks)
{
- newActivation += link->weightedActivation();
+ newActivation += link.weightedActivation();
}
newActivation = sigmoid(newActivation);
- _activationChanged = newActivation != _activation;
+ const double errorMargin = 0.000001;
+ bool activationChanged = std::abs(newActivation - _activation) > errorMargin;
_activation = newActivation;
+ return activationChanged;
}
-void Neuron::addInput(std::unique_ptr<NeuralLink>&& link)
+void Neuron::addInput(NeuralLink&& link)
{
_inputLinks.push_back(std::move(link));
}
diff --git a/src/move_string_mapper.cpp b/src/move_string_mapper.cpp
index 37d5d7e..74fa0b5 100644
--- a/src/move_string_mapper.cpp
+++ b/src/move_string_mapper.cpp
@@ -12,7 +12,6 @@ MoveStringMapper::MoveStringMapper()
moveMap[Move::SHOOT] = "Shoot";
moveMap[Move::BUILD_ALIEN_FACTORY] = "BuildAlienFactory";
moveMap[Move::BUILD_MISSILE_CONTROLLER] = "BuildMissileController";
- moveMap[Move::BUILD_SHIELD] = "BuildShield";
}
std::string MoveStringMapper::toString(const Move &move)
diff --git a/src/spacebot.cpp b/src/spacebot.cpp
index 15f2221..dcf491e 100644
--- a/src/spacebot.cpp
+++ b/src/spacebot.cpp
@@ -23,7 +23,7 @@ Move Spacebot::chooseMove()
NeuralNetwork network(std::ifstream(_brainFilename),
sensorInputs,
- 7);
+ 6);
return static_cast<Move>(network.findMaxOutputIndex());
}