From f35c5fca6a9faaa1caf3c1992844adf9033744e8 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 29 Aug 2015 20:22:40 +0200 Subject: Improved efficiency of network --- src/brain/neural_network.cpp | 77 +++++++++++++++++++++++--------------------- src/brain/neuron.cpp | 12 ++++--- src/move_string_mapper.cpp | 1 - src/spacebot.cpp | 2 +- 4 files changed, 49 insertions(+), 43 deletions(-) (limited to 'src') 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 -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(); - for (int i=0; i(); + auto sensor = std::make_shared(); + _sensors.push_back(sensor); } - for (int i=0; i(); + auto output = findOrAddNeuron(i); _outputs.push_back(output); - _neurons[i] = output; } parseFile(std::move(networkConfigFile)); } -NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, std::vector sensorInitialValues, int numberOfOutputs) +NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, std::vector sensorInitialValues, unsigned int numberOfOutputs) { + _neurons.reserve(400); + _sensors.reserve(sensorInitialValues.size()); + _sensors.reserve(numberOfOutputs); + _biasNode = std::make_shared(); for (unsigned int i=0; i(); sensor->setActivation(sensorInitialValues[i] ? 1 : 0); - _sensors[i] = sensor; + _sensors.push_back(sensor); } - for (int i=0; i(); + 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 source, std::shared_ptr destination, double weight) { - std::unique_ptr link(new NeuralLink(source, weight)); + NeuralLink link(source, weight); destination->addInput(std::move(link)); } -std::shared_ptr NeuralNetwork::findOrAddSensor(int id) +std::shared_ptr NeuralNetwork::findOrAddSensor(unsigned int id) { - auto sensor = _sensors[id]; - if (!sensor) + while (_sensors.size() <= id) { - sensor = std::make_shared(); - _sensors[id] = sensor; + auto sensor = std::make_shared(); + _sensors.push_back(sensor); } - return sensor; + + return _sensors.at(id); } -std::shared_ptr NeuralNetwork::findOrAddNeuron(int id) +std::shared_ptr NeuralNetwork::findOrAddNeuron(unsigned int id) { - auto neuron = _neurons[id]; - if (!neuron) + while (_neurons.size() <= id) { - neuron = std::make_shared(); - _neurons[id] = neuron; + auto neuron = std::make_shared(); + _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 && iterationcalculateActivation(); - 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&& 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(network.findMaxOutputIndex()); } -- cgit v1.2.3