遗传算法函数 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
,但 parents
和 populations
都引用同一个数组。您可以预先存储长度。
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);
}
}
我正在尝试做一个基本的遗传算法,其中一个步骤是通过 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
,但 parents
和 populations
都引用同一个数组。您可以预先存储长度。
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);
}
}