Estou tentando criar uma Rede Neural para aprender a jogar um jogo de ping pong. Em minha implementação cada Raquete tem um Cérebro que armazena os pesos da rede neural. Porem quando vou criar uma nova população de raquetes, passo como parâmetro o Cerebro da melhor Raquete da geração anterior, porem quando modifico o Cerebro do meu array de Raquetes, a minha Melhor Raquete tbm é modificada, sendo que ela não faz perte desse Array! Podem me ajudar?
Classe Raquete:
class Raquete{
constructor(cerebro){
this.x = random(0,500);
this.y = 460;
this.comprimento = 100;
this.altura = 10;
this.velocidade = 5;
this.corR = random(255);
this.corG = random(255);
this.corB = random(255);
this.pontos = 0;
this.cerebro = cerebro;
this.melhor = false;
}
show(){
fill(color(this.corR,this.corG,this.corB,500));
rect(this.x,this.y,this.comprimento,this.altura);
}
Classe Cerebro:
class Cerebro{
constructor(nPesos){
this.pesos = [];
for(let i=0;i < nPesos;i++){
this.pesos[i] = random(-1,1);
}
}
adivinhar(inputs){
var sum = 0;
for(let i=0; i < this.pesos.length; i++){
sum += inputs[i]*this.pesos[i];
}
var output = sign(sum);
return output;
}
mute(){
for(let i=0; i < this.pesos.length; i++){
this.pesos[i] += 1;
}
}
}
function sign(n){
if(n>=0)
return 1;
else
return -1;
}
Index:
geracao = 0;
pontos = 0;
function setup() {
createCanvas(1000, 500);
background(0);
this.TAM_POPULACAO = 10;
this.bolas = [];
this.raquetes = [];
this.melhorRaquete = [];
novaPop();
}
function draw() {
background(0);
textSize(32);
fill(255, 255, 255);
text('Geração: '+geracao, 10, 30);
for(let i=0; i<this.bolas.length;i++){
var inputs = [this.bolas[i].x, this.bolas[i].y, this.raquetes[i].x, this.raquetes[i].y];
this.raquetes[i].show();
this.raquetes[i].move(this.raquetes[i].cerebro.adivinhar(inputs));
this.bolas[i].show();
this.bolas[i].move();
}
raquetes.forEach(function(raquete, i){
if(this.bolas[i].y>=460){
this.raquetes.splice(i,1);
this.bolas.splice(i,1);
}
if(raquete.pontos>pontos){
pontos = raquete.pontos;
melhorRaquete[0] = raquete;
}
});
if(bolas.length == 0){
this.bolas.splice(0,1);
this.raquetes.splice(0,1);
geracao++;
novaPop();
}
}
function novaPop(){
if(this.geracao == 1 || this.melhorRaquete.length == 0){
for(let i=0; i<this.TAM_POPULACAO;i++){
this.raquetes.push(new Raquete(new Cerebro(4)));
this.bolas.push(new Bola(this.raquetes[i]));
this.bolas[i].index = i;
}
}
else{
var pesos=[];
for(let i=0; i<this.TAM_POPULACAO;i++){
pesos.push(melhorRaquete[0].cerebro.pesos);
this.raquetes.push(new Raquete(melhorRaquete[0].cerebro));
//melhorRaquete.cerebro.pesos;
this.bolas.push(new Bola(this.raquetes[i]));
this.bolas[i].index = i;
}
pesos[0][0] += 1;
console.log(pesos);
//mutar();
}
}
function mutar(){
raquetes.forEach(ra => {
if(ra.melhor == false)
ra.cerebro.mute();
});
}