遗传算法函数 JS 二维数组

Genetic Algorithm Function JS 2D arrays

我正在尝试做一个基本的遗传算法,其中一个步骤是通过 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);
    }
}

问题是您在迭代数组时修改数组,这会改变数组的长度。虽然看起来你只是在修改 population,但 parentspopulations 都引用同一个数组。您可以预先存储长度。

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

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(let i = 0, len = parents.length; i < len - 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);
    }
}
.as-console-wrapper{max-height: 100%;top: 0;}

您还可以使用扩展语法创建数组的浅表副本。

let parents = [...population];

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

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

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