| 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"); |
| } |