Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Constructor A:
- * @param structure (ex. [4, 3, 2] 4 neurons in the input layer, 3 in the hidden layer and 2 in the output layer)
- *
- * Contructor B:
- * @param Brain dad
- * @param Brain mom
- * @param float mutation rate (0 = 0%, 1 = 100%)
- *
- * Examples:
- * to generate a new brain, use: new Brain([4, 3, 2])
- * to clone a brain, use: new Brain(brain_to_clone, brain_to_clone, 0)
- *
- */
- var Brain = function(a, b, mrate) {
- // The mutation rate, will be set later
- this.mrate = 0;
- this.network;
- this.outputs;
- this.inputs;
- if (b == null) {
- // Generate a new brain
- var struct = a;
- this.network = new Array(struct.length-1);
- this.outputs = new Array(this.network.length);
- for(var l = 0; l < struct.length-1; l++) {
- this.network[l] = new Array(struct[l+1]);
- this.outputs[l] = new Array(this.network[l].length);
- var syn = struct[l] + 1;
- for(var n = 0; n < this.network[l].length; n++) {
- this.network[l][n] = new Array(syn);
- for(var w = 0; w < syn; w++) {
- this.outputs[l][n] = 1;
- this.network[l][n][w] = Brain.genWeight(1);
- }
- }
- }
- } else {
- // Generate a new brain given its parents
- var dad = a,
- mom = b;
- if (mrate == null) {
- this.mrate = dad.mrate;
- } else {
- this.mrate = mrate;
- }
- var d = dad.network;
- var m = mom.network;
- var src;
- this.network = new Array(dad.network.length);
- this.outputs = new Array(this.network.length);
- for(var l = 0; l < this.network.length; l++) {
- this.network[l] = new Array(d[l].length);
- this.outputs[l] = new Array(this.network[l].length);
- for(var n = 0; n < this.network[l].length; n++) {
- this.network[l][n] = new Array(d[l][n].length);
- src = Math.random() < .5 ? d[l][n] : m[l][n];
- for(var w = 0; w < this.network[l][n].length; w++)
- this.network[l][n][w] = src[w] + (Math.random()*100 < this.mrate ? Brain.genWeight(.5) : 0);
- }
- }
- }
- // This is used to calculate the network outputs
- this.process = function(inp) {
- this.inputs = inp;
- for(var l = 0; l < this.network.length; l++) {
- if(l > 0)
- inp = this.outputs[l-1];
- for(var n = 0; n < this.network[l].length; n++) {
- this.outputs[l][n] = 0;
- for(var w = 0; w < this.network[l][n].length-1; w++) {
- this.outputs[l][n]+= inp[w] * this.network[l][n][w];
- }
- this.outputs[l][n]+= this.network[l][n][this.network[l][n].length-1];
- this.outputs[l][n] = this.activate(this.outputs[l][n]);
- }
- }
- return this.outputs[this.outputs.length-1];
- }
- // Get the last outputs
- this.getOutputs = function() {
- return this.outputs[this.outputs.length-1];
- }
- // The activation function
- this.activate = function(x) {
- //return Math.sin(x*10.0);
- if(x > 40)
- return 1;
- if(x < -40)
- return -1;
- return 2.0/(1 + Math.exp(-x))-1;
- }
- // Clone a brain
- this.clone = function() {
- return new Brain(this, this, 0);
- }
- // Get the number of inputs
- this.inputs = function() {
- return this.network[0][0].length-1;
- }
- }
- // Generate a random number between -factor and +factor
- Brain.genWeight = function(factor) {
- return (factor?factor:1)*(1-Math.random()*2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement