From 87ef7e90829053b7bc336f7316c3facb6c51e781 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sun, 2 Aug 2015 19:01:01 +0200 Subject: Reading brain in from a file --- src/brain/neural_network.cpp | 19 +++++++++++++++++++ src/game_state.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++- src/spacebot.cpp | 13 ++++--------- 3 files changed, 65 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/brain/neural_network.cpp b/src/brain/neural_network.cpp index 15eedca..30da46c 100644 --- a/src/brain/neural_network.cpp +++ b/src/brain/neural_network.cpp @@ -17,6 +17,24 @@ NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, int numberOfSenso parseFile(std::move(networkConfigFile)); } +NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, std::vector sensorInitialValues, int numberOfOutputs) +{ + _biasNode = std::make_shared(); + + for (int i=0; i(i); + sensor->setActivation(sensorInitialValues.at(i) ? 1 : 0); + _sensors.push_back(sensor); + } + for (int i=0; i(i)); + } + + parseFile(std::move(networkConfigFile)); +} + void NeuralNetwork::parseFile(std::istream &&file) { double weight; @@ -123,6 +141,7 @@ void NeuralNetwork::setInput(int inputIndex, double activation) if (sensor->id() == inputIndex) { sensor->setActivation(activation); + break; } } } diff --git a/src/game_state.cpp b/src/game_state.cpp index 5fed683..e6deae7 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -2,9 +2,11 @@ #include #include #include +#include const int OPENING_LINES = 6; const int GAME_AREA_LINES = 25; +const int GAME_WIDTH = 19; void moveToNextChar(int &x, int &y, int &width, char &nextChar, std::istream &mapFile) { @@ -91,5 +93,44 @@ void GameState::logState() std::vector GameState::toBitArray() const { - return std::vector(); + std::vector result; + + std::vector alienNodes((GAME_AREA_LINES-2) * (GAME_WIDTH-2), false); + for (auto alien : _aliens) + { + alienNodes.at((alien.y()-1)*(GAME_WIDTH-2)+(alien.x()-1)) = true; + } + result.insert(result.end(), alienNodes.begin(), alienNodes.end()); + + std::vector bulletNodes((GAME_AREA_LINES-2) * (GAME_WIDTH-2), false); + for (auto bullet : _bullets) + { + bulletNodes.at((bullet.y()-1)*(GAME_WIDTH-2)+(bullet.x()-1)) = true; + } + result.insert(result.end(), bulletNodes.begin(), bulletNodes.end()); + + std::vector missileNodes((GAME_AREA_LINES-2) * (GAME_WIDTH-2), false); + for (auto missile : _missiles) + { + missileNodes.at((missile.y()-1)*(GAME_WIDTH-2)+(missile.x()-1)) = true; + } + result.insert(result.end(), missileNodes.begin(), missileNodes.end()); + + std::vector shieldNodes(2 * (GAME_WIDTH-2), false); + for (auto shield : _shields) + { + int row = shield.y() > GAME_AREA_LINES/2 ? 1 : 0; + shieldNodes.at(row*(GAME_WIDTH-2)+(shield.x()-1)) = true; + } + + for (auto spaceship : _spaceships) + { + std::bitset<5> spaceshipBits(spaceship.x()); + for (int i=0; i -Spacebot::Spacebot(std::string outputPath) +Spacebot::Spacebot(std::string outputPath, std::string brainFilename) : _outputFilename(outputPath+"/move.txt"), - _networkConfigFilename("brain.nn"), + _brainFilename(brainFilename), _gameState(std::ifstream(outputPath+"/map.txt")) { } @@ -20,15 +20,10 @@ Move Spacebot::chooseMove() { auto sensorInputs = _gameState.toBitArray(); - NeuralNetwork network(std::ifstream(_networkConfigFilename), - sensorInputs.size(), + NeuralNetwork network(std::ifstream(_brainFilename), + sensorInputs, static_cast(Move::BUILD_SHIELD)); - for (int i=0; i(moveInt); } -- cgit v1.2.3