UNPKG

nntsreinforcement

Version:

A Neural Network for Reinforcement Learning in TypeScript

103 lines (102 loc) 4.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NeuralNetwork = void 0; var layer_1 = require("./layer"); var NeuralNetwork = /** @class */ (function () { function NeuralNetwork(numOfNeurons, layers) { this.layers = []; if (layers == undefined) { // Create new layers for (var _i = 0, numOfNeurons_1 = numOfNeurons; _i < numOfNeurons_1.length; _i++) { var numOfNeuronsForLayer = numOfNeurons_1[_i]; this.layers.push(new layer_1.Layer(numOfNeuronsForLayer)); } } else { if (layers.length == numOfNeurons.length) { this.layers = layers; } else { console.warn('The length of layers is different to the length of neurons'); } } this.numOfNeurons = numOfNeurons; } NeuralNetwork.prototype.initRandomConnections = function () { for (var i = 1; i < this.layers.length; i++) { for (var _i = 0, _a = this.layers[i].neurons; _i < _a.length; _i++) { var neuron = _a[_i]; neuron.initRandomConnectionsFromLayer(this.layers[i - 1]); } } }; NeuralNetwork.prototype.feedForward = function (inputs) { this.layers[0].setValues(inputs); for (var i = 1; i < this.layers.length; i++) { var layer = this.layers[i]; layer.compute(this.layers[i - 1].getActivations()); } return this.layers[this.layers.length - 1].getActivations(); }; NeuralNetwork.prototype.mutate = function (rate) { for (var _i = 0, _a = this.layers; _i < _a.length; _i++) { var layer = _a[_i]; layer.mutate(rate); } }; NeuralNetwork.prototype.deepCopy = function () { var layers = []; for (var i = 0; i < this.layers.length; i++) { var layer = new layer_1.Layer(this.numOfNeurons[i]); var neurons = []; for (var _i = 0, _a = this.layers[i].neurons; _i < _a.length; _i++) { var neuron = _a[_i]; neurons.push(neuron.deepCopy()); } if (i > 0) { //Connect to prev layer this.connectNeuronsToLayer(neurons, layers[i - 1]); } layer.neurons = neurons; layers[i] = layer; } return new NeuralNetwork(this.numOfNeurons, layers); }; NeuralNetwork.prototype.crossover = function (brain) { var layers = []; for (var i = 0; i < this.layers.length; i++) { var layer = new layer_1.Layer(this.numOfNeurons[i]); var crossOverPoint = (Math.random() * (this.layers[i].neurons.length - 1)) / 2 - (this.layers[i].neurons.length - 1) / 4; var neurons = []; for (var j = 0; j < this.layers[i].neurons.length; j++) { var neuronCopy = this.layers[i].neurons[j].deepCopy(); for (var k = 0; k < neuronCopy.weights.length; k++) { neuronCopy.weights[k] = j > crossOverPoint ? brain.layers[i].neurons[j].weights[k] : this.layers[i].neurons[j].weights[k]; } neurons.push(neuronCopy); } if (i > 0) { //Connect to prev layer this.connectNeuronsToLayer(neurons, layers[i - 1]); } layer.neurons = neurons; layers.push(layer); } return new NeuralNetwork(this.numOfNeurons, layers); }; NeuralNetwork.prototype.linearInterpolation = function (a, b, d) { return a + (b - a) * d; }; NeuralNetwork.prototype.connectNeuronsToLayer = function (neurons, prevLayer) { for (var _i = 0, neurons_1 = neurons; _i < neurons_1.length; _i++) { var neuron = neurons_1[_i]; neuron.prevNeurons = prevLayer.neurons; } }; return NeuralNetwork; }()); exports.NeuralNetwork = NeuralNetwork;