2016-08-05 3 views
0

Я работаю над генетическим алгоритмом для нейронных сетей вместе с некоторыми друзьями для школьного проекта, но мы столкнулись с проблемой. Мы пытаемся сделать следующее: (обратите внимание, что некоторые из этих изменений могут быть изменены и настроены только для тестирования)Значения в изменении массива по неизвестным причинам

У нас есть 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 - это массив.

+1

', но как-то эта строка сама меняет значение baseNetwork.' - Нет, это не так. – Jamiec

+0

Для чего-то такого сложного, вам действительно нужно предоставить [mcve], демонстрирующий проблему. – Jamiec

+0

. Трудно следовать. Попробуйте 'nn [networkNumber] = JSON.parse (JSON.stringify (baseNetwork));' и посмотрите, не имеет значения. Возможно, это некоторые странные указатели на массив или такой. Выполнение этого «скопирует» массив. – flott

ответ

0

Попробуйте

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

Возможно, вы даете ему ту же ссылку на объект, поэтому, изменяя один из них через эволюционировать fnction вы меняете оба. Используя Array.from(baseArray), вы создаете новый массив, который идентичен baseArray, но это другой объект

Смежные вопросы