diff options
Diffstat (limited to 'src/brain/neural_network.cpp')
-rw-r--r-- | src/brain/neural_network.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
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) |