我和一些朋友一起研究神经网络上的遗传算法用于学校项目,但我们遇到了一个问题。我们要做的是以下内容:(请注意,其中一些内容可能会发生变化,并且只会出于测试目的而设置此方式)
我们每代有10个神经网络。第一个是baseNetwork,其余的是baseNetwork上的细微变化。在生成结束时,选择性能最佳的网络作为下一代的新baseNetwork。 我们将神经网络存储为数组,例如nn [1]是第一个神经网络,它本身就是一个数组。 问题是,不知何故,baseNetwork在每个网络之后而不是在每一代结束时被更改。 这是遗传算法,有一些注释使其更容易理解:
function genAlg() {
if (networkNumber < nnPerGen) {
nn[networkNumber][0][1] = lastfitness; // stores fitness
nn[networkNumber][0][2] = deathwall; // stores fitness
networkNumber++; // select new network
nn[networkNumber] = baseNetwork; // is supposed to replace the currently selected network with the baseNetwork of the generation
for (i=1; i<=evolveAmt; i++) {
evolveGate = (Math.floor(gatesAmt * Math.random()) + 1);
evolve();
} // make new variation of currently selected network
} else {
generation++; // start new generation
for (i=1;i<=nnPerGen;i++) {
if (nn[i][0][1] > baseNetwork[0][1]) {
baseNetwork = nn[i];
} else if (nn[i][0][1] = baseNetwork[0][1]) {
if (nn[i][0][2] < baseNetwork[0][2]) {
baseNetwork = nn[i];
}
}
} //Testing fitness, replace baseNetwork if another network is better
networkNumber = 1; // start working with the first network again
}
}
经过非常彻底的测试,我们得出结论,问题在于这一行:
nn [networkNumber] = baseNetwork;
我们不知道为什么,但不知何故,这条线路改变了baseNetwork本身的价值。请记住,baseNetwork本身就是一个数组。
答案 0 :(得分:0)
尝试
nn[networkNumber] = Array.from(baseNetwork);
可能你给它提供了相同的对象引用,所以通过改进其中一个来改变它们。使用Array.from(baseArray)
创建一个与baseArray相同的新数组,但它是一个不同的对象