nntsreinforcement
Version:
A Neural Network for Reinforcement Learning in TypeScript
103 lines (102 loc) • 4.14 kB
JavaScript
"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;