Ajuda com Javascript p5.js

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

Comece a utilizar Object.assign({}, objeto) quando for atribuir ao array.

Object.assign({}, Raquete)

Isso é a forma mais elegante de fazer uma cópia de um objeto.

Se isto não funcionar, precisará fazer um parse de um stringfy, o que eu raramente precisei fazer, somente quando a Object.assign realmente não funcionava, como quando eu queria “limpar” um objeto que mesmo usando o Object.assign, a variável não ficava “limpa”

JSON.parse(JSON.stringfy(Raquete))

Segue um link do código que utilizei para provar o uso.