由于未知原因导致数组中的值发生变化

时间:2016-08-05 14:35:04

标签: javascript arrays

我和一些朋友一起研究神经网络上的遗传算法用于学校项目,但我们遇到了一个问题。我们要做的是以下内容:(请注意,其中一些内容可能会发生变化,并且只会出于测试目的而设置此方式)

我们每代有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本身就是一个数组。

1 个答案:

答案 0 :(得分:0)

尝试

nn[networkNumber] = Array.from(baseNetwork);

可能你给它提供了相同的对象引用,所以通过改进其中一个来改变它们。使用Array.from(baseArray)创建一个与baseArray相同的新数组,但它是一个不同的对象