From 550caeee11086bd56db69176b3149ddfa160ee30 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 17 Oct 2015 17:02:24 +0200 Subject: Reverted to a simple decision tree Turns out it's much easier to write a bot by hand with if statements. --- src/brain/neural_network.cpp | 110 +++++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 46 deletions(-) (limited to 'src/brain/neural_network.cpp') diff --git a/src/brain/neural_network.cpp b/src/brain/neural_network.cpp index 0c23771..c8177e8 100644 --- a/src/brain/neural_network.cpp +++ b/src/brain/neural_network.cpp @@ -12,13 +12,13 @@ NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, unsigned int numb for (unsigned int i=0; i(); - _sensors.push_back(sensor); + auto sensor = std::make_shared(i); + _sensors.push_back(sensor); } for (unsigned int i=0; i for (unsigned int i=0; i(); - sensor->setActivation(sensorInitialValues[i] ? 1 : 0); - _sensors.push_back(sensor); + auto sensor = std::make_shared(i); + sensor->setActivation(sensorInitialValues[i] ? 1 : 0); + _sensors.push_back(sensor); } for (unsigned int i=0; i> srcId && - file.ignore(std::numeric_limits::max(), 'n') && - file >> destId && - file >> weight && - file.ignore(std::numeric_limits::max(), '\n')) + file >> srcId && + file.ignore(std::numeric_limits::max(), 'n') && + file >> destId && + file >> weight && + file.ignore(std::numeric_limits::max(), '\n')) { + std::shared_ptr source; + std::shared_ptr destination; + switch (srcType) + { + case 's': + source = findOrAddSensor(srcId); + break; + case 'b': + source = _biasNode; + break; + default: + source = findOrAddNeuron(srcId); + } + destination = findOrAddNeuron(destId); - std::shared_ptr source; - std::shared_ptr destination; - switch (srcType) - { - case 's': - source = findOrAddSensor(srcId); - break; - case 'b': - source = _biasNode; - break; - default: - source = findOrAddNeuron(srcId); - } - destination = findOrAddNeuron(destId); - - addLink(source, destination, weight); + addLink(source, destination, weight); } } @@ -92,8 +91,8 @@ std::shared_ptr NeuralNetwork::findOrAddSensor(unsigned int id) { while (_sensors.size() <= id) { - auto sensor = std::make_shared(); - _sensors.push_back(sensor); + auto sensor = std::make_shared(_sensors.size()); + _sensors.push_back(sensor); } return _sensors.at(id); @@ -103,8 +102,8 @@ std::shared_ptr NeuralNetwork::findOrAddNeuron(unsigned int id) { while (_neurons.size() <= id) { - auto neuron = std::make_shared(); - _neurons.push_back(neuron); + auto neuron = std::make_shared(_neurons.size()); + _neurons.push_back(neuron); } return _neurons.at(id); @@ -121,12 +120,12 @@ unsigned int NeuralNetwork::findMaxOutputIndex() const auto maxIterations = _neurons.size()*10; for (unsigned int iteration=0; anyNodeChanged && iterationcalculateActivation(); - anyNodeChanged = anyNodeChanged || activationChanged; - } + anyNodeChanged = false; + for (auto const& neuron : _neurons) + { + bool activationChanged = neuron->calculateActivation(); + anyNodeChanged = anyNodeChanged || activationChanged; + } } int currentMaxIndex = 0; @@ -134,12 +133,31 @@ unsigned int NeuralNetwork::findMaxOutputIndex() const for (unsigned int i=1; i<_outputs.size(); ++i) { - double activation = _outputs.at(i)->activation(); - if (activation >= currentMaxActivation) - { - currentMaxActivation = activation; - currentMaxIndex = i; - } + double activation = _outputs.at(i)->activation(); + if (activation >= currentMaxActivation) + { + currentMaxActivation = activation; + currentMaxIndex = i; + } } return currentMaxIndex; } + +bool NeuralNetwork::linkExists(std::string srcIdentifier, std::string destIdentifier, double weight) const +{ + std::shared_ptr dest; + + for (auto const& node : _neurons) + { + if (node->identifier() == destIdentifier) + { + dest = node; + } + } + + if (!dest) + { + return false; + } + return dest->hasInputWithWeight(srcIdentifier, weight); +} -- cgit v1.2.3