数组中的值由于未知原因而更改

Values in an array change due to unknown causes

本文关键字:未知 于未知 数组      更新时间:2023-09-26

我正在和一些朋友一起为一个学校项目研究神经网络的遗传算法,但我们遇到了一个问题。我们试图做的是:(注意,其中一些可能会发生变化,仅出于测试目的而设置(

我们每一代有10个神经网络。其中第一个是baseNetwork,其余的是baseNetwork的微小变化。在生成结束时,选择性能最好的网络作为下一代的新基础网络。我们将神经网络存储为数组,例如nn[1]是第一个神经网络,它本身就是一个数组。问题是,以某种方式,基本网络在每个网络之后都会发生变化,而不是在每一代网络结束时。以下是遗传算法,其中有一些注释,使其更容易遵循:

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本身就是一个数组。

尝试

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

可能您给了它相同的对象引用,所以通过evolution操作更改其中一个对象,您可以同时更改这两个对象。使用Array.from(baseArray)可以创建一个与baseArray相同的新数组,但它是一个不同的对象