RustX/Autonomous_Driving_Simulation
3
1class NeuralNetwork{2 constructor(neuronCounts){3 this.levels=[];4 for(let i=0;i<neuronCounts.length-1;i++){5 this.levels.push(new Level(6 neuronCounts[i],neuronCounts[i+1]7 ));8 }9 }10 11 static feedForward(givenInputs,network){12 let outputs=Level.feedForward(13 givenInputs,network.levels[0]);14 for(let i=1;i<network.levels.length;i++){15 outputs=Level.feedForward(16 outputs,network.levels[i]);17 }18 return outputs;19 }20 21 static mutate(network,amount=1){22 network.levels.forEach(level => {23 for(let i=0;i<level.biases.length;i++){24 level.biases[i]=lerp(25 level.biases[i],26 Math.random()*2-1,27 amount28 )29 }30 for(let i=0;i<level.weights.length;i++){31 for(let j=0;j<level.weights[i].length;j++){32 level.weights[i][j]=lerp(33 level.weights[i][j],34 Math.random()*2-1,35 amount36 )37 }38 }39 });40 }41}42 43class Level{44 constructor(inputCount,outputCount){45 this.inputs=new Array(inputCount);46 this.outputs=new Array(outputCount);47 this.biases=new Array(outputCount);48 49 this.weights=[];50 for(let i=0;i<inputCount;i++){51 this.weights[i]=new Array(outputCount);52 }53 54 Level.#randomize(this);55 }56 57 static #randomize(level){58 for(let i=0;i<level.inputs.length;i++){59 for(let j=0;j<level.outputs.length;j++){60 level.weights[i][j]=Math.random()*2-1;61 }62 }63 64 for(let i=0;i<level.biases.length;i++){65 level.biases[i]=Math.random()*2-1;66 }67 }68 69 static feedForward(givenInputs,level){70 level.inputs=[...givenInputs];71 72 for(let i=0;i<level.outputs.length;i++){73 let sum=074 for(let j=0;j<level.inputs.length;j++){75 sum+=level.inputs[j]*level.weights[j][i];76 }77 78 if(sum>level.biases[i]){79 level.outputs[i]=1;80 }else{81 level.outputs[i]=0;82 }83 }84 85 return level.outputs;86 }87}