基本的な遺伝的アルゴリズムを実行しようとしています。ステップの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);
}
}
問題は、配列を反復しながら配列を変更しているため、配列の長さが変わることです。それは見えるがあなただけ変更している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];
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加