Я работаю над генетическим алгоритмом для нейронных сетей вместе с некоторыми друзьями для школьного проекта, но мы столкнулись с проблемой. Мы пытаемся сделать следующее: (обратите внимание, что некоторые из этих изменений могут быть изменены и настроены только для тестирования)Значения в изменении массива по неизвестным причинам
У нас есть 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
}
}
После очень тщательного тестирования мы пришли к выводу, что проблема заключается в этой строке:
пп [NetworkNumber] = baseNetwork ;
Мы не знаем почему, но так или иначе эта строка изменяет значение самой baseNetwork. Имейте в виду, что baseNetwork - это массив.
', но как-то эта строка сама меняет значение baseNetwork.' - Нет, это не так. – Jamiec
Для чего-то такого сложного, вам действительно нужно предоставить [mcve], демонстрирующий проблему. – Jamiec
. Трудно следовать. Попробуйте 'nn [networkNumber] = JSON.parse (JSON.stringify (baseNetwork));' и посмотрите, не имеет значения. Возможно, это некоторые странные указатели на массив или такой. Выполнение этого «скопирует» массив. – flott