| carCanvas.height=window.innerHeight; | |
| carCanvas.width=200; | |
| networkCanvas.height=window.innerHeight; | |
| networkCanvas.width=298; | |
| const carCtx=carCanvas.getContext("2d"); | |
| const networkCtx=networkCanvas.getContext("2d"); | |
| const road=new Road(carCanvas.width/2,carCanvas.width*0.9); | |
| const N=100; | |
| const cars=generateCars(N); | |
| const traffic=[ | |
| new Car(100,-100,30,50,"DUMMY",2) | |
| ]; | |
| let bestCar=cars[0]; | |
| if(localStorage.getItem("bestBrain")){ | |
| for(let i=0;i<cars.length;i++){ | |
| cars[i].brain=JSON.parse( | |
| localStorage.getItem("bestBrain")); | |
| if(i>0){ | |
| NeuralNetwork.mutate(cars[i].brain,0.2); | |
| } | |
| } | |
| } | |
| animate(); | |
| function animate(){ | |
| for(let i=0;i<traffic.length;i++){ | |
| traffic[i].update([],[]); | |
| } | |
| for(let i=0;i<cars.length;i++){ | |
| cars[i].update(road.borders,traffic); | |
| } | |
| bestCar=cars.find( | |
| c=>c.y==Math.min( | |
| ...cars.map(c=>c.y) | |
| )); | |
| carCanvas.height=window.innerHeight; | |
| networkCanvas.height=window.innerHeight; | |
| carCtx.translate(0,-bestCar.y+carCanvas.height*0.7); | |
| road.draw(carCtx); | |
| for(let i=0;i<traffic.length;i++){ | |
| traffic[i].draw(carCtx); | |
| } | |
| carCtx.globalAlpha=0.2; | |
| for(let i=0;i<cars.length;i++){ | |
| cars[i].draw(carCtx); | |
| } | |
| carCtx.globalAlpha=1; | |
| bestCar.draw(carCtx,true); | |
| Visualizer.drawNetwork(networkCtx,bestCar.brain); | |
| requestAnimationFrame(animate); | |
| } | |
| function generateCars(N){ | |
| const cars=[]; | |
| for(let i=1;i<=N;i++){ | |
| cars.push(new Car(100,100,30,50,"AI")); | |
| } | |
| return cars; | |
| } | |
| function save(){ | |
| localStorage.setItem("bestBrain", | |
| JSON.stringify(bestCar.brain)); | |
| } | |
| function discard(){ | |
| localStorage.removeItem("bestBrain"); | |
| } |