【问题标题】:Genetic Algorithm Function JS 2D arrays遗传算法函数 JS 二维数组
【发布时间】:2020-11-21 15:07:55
【问题描述】:

我正在尝试做一个基本的遗传算法,其中一个步骤是通过 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 parents = population 不会创建新数组。两个变量都指向同一个数组,你在每次迭代中增加它的长度population.push(newKid)
  • 哦,那是我的错误,为什么它不创建一个新数组?以及如何以不同的名称复制数组?
  • @DavidRomero 您可以使用扩展语法创建浅拷贝,如我的回答所示。
  • 非常感谢你们的答案和链接,特别是@hev1 对我的代码的修改。不知道它指向同一个数组。

标签: javascript multidimensional-array genetic-algorithm


【解决方案1】:

问题是您在迭代数组时正在修改数组,这会改变它的长度。尽管您似乎只是在修改 populationparentspopulations 都引用同一个数组。您可以改为预先存储长度。

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];

【讨论】:

  • @DavidRomero 没问题。
【解决方案2】:

您在迭代时推送到同一个数组。 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);
  }
}

【讨论】:

    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2019-12-26
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多