Javascript 遗传算法在二维数组中的应用

Javascript 遗传算法在二维数组中的应用,javascript,multidimensional-array,genetic-algorithm,Javascript,Multidimensional Array,Genetic Algorithm,我正在尝试做一个基本的遗传算法,其中一个步骤是通过n点的遗传杂交生成下一个种群,我任意选择了4个。问题是我的代码会无限期运行,除非我停止它。我以为这只会产生3个后代。有人能告诉我为什么它是递归的吗 let population = [ [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [0, 1, 1, 1, 0, 0, 1, 1, 0, 1], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [0, 1, 1, 1, 0, 0, 1

我正在尝试做一个基本的遗传算法,其中一个步骤是通过n点的遗传杂交生成下一个种群,我任意选择了4个。问题是我的代码会无限期运行,除非我停止它。我以为这只会产生3个后代。有人能告诉我为什么它是递归的吗

let population = [
    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [0, 1, 1, 1, 0, 0, 1, 1, 0, 1],
    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [0, 1, 1, 1, 0, 0, 1, 1, 0, 1],
]


kidsFactory()

function kidsFactory() {
    let newKid = []
    let parents = population
    for(i=0; i<(parents.length - 1);i++){
        parent1 = parents[i]
        parent2 = parents[i+1]
        console.log('parent1 '+parent1);
        console.log('parent2 '+parent2);
        newKid.push(parent1[0], parent1[1], parent2[2], parent2[3], parent1[4], parent1[5], parent2[6], parent2[7], parent1[8], parent1[9])
        console.log(newKid);
        population.push(newKid)
        newKid=[]
        console.log(population);
    }
}
let population=[
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[0, 1, 1, 1, 0, 0, 1, 1, 0, 1],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[0, 1, 1, 1, 0, 0, 1, 1, 0, 1],
]
基兹工厂()
函数kidsFactory(){
让newKid=[]
让父母=人口

对于(i=0;i而言,问题在于您在对数组进行迭代时修改了数组,从而更改了数组的长度。尽管您似乎只是在修改
填充
父项和
填充
都引用了相同的数组。您可以事先存储长度

for(let i = 0, len = parents.length; i < len - 1; i++){

您在迭代时正在推送到同一个数组。父数组和填充数组指向同一个数组实例。您可以尝试在迭代时创建新数组

let parents = [...population]
let population=[
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[0, 1, 1, 1, 0, 0, 1, 1, 0, 1],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[0, 1, 1, 1, 0, 0, 1, 1, 0, 1],
]
基兹工厂()
函数kidsFactory(){
让newKid=[]
让父母=[…人口];
对于(i=0;i<(parents.length-1);i++){
父母1=父母[i]
parent2=父母[i+1]
console.log('parent1'+parent1);
console.log('parent2'+parent2);
newKid.push(parent1[0],parent1[1],parent2[2],parent2[3],parent1[4],parent1[5],parent2[6],parent2[7],parent1[8],parent1[9])
console.log(newKid);
人口推动(新儿童)
newKid=[]
控制台日志(总体);
}

}
让parents=population
不创建新数组。两个变量都指向同一个数组,并且在每次迭代中都会增加它的长度
population.push(newKid)
哦,这是我的错误,为什么它不创建一个新数组?我如何用不同的名称复制一个数组?@DavidRomero您可以使用spread语法创建一个浅层副本,如我的答案所示。非常感谢您提供的答案和链接,特别是@hev1对我的代码进行的修改。我不知道到同一个数组。@DavidRomero没问题。