Я пытался реализовать алгоритм NeuroEvolution of Augmenting Topologies (NEAT) для клонов с нестабильными птицами, ссылаясь на руководство по YouTube.
Следуя инструкции, я столкнулся со следующей проблемой:
При выполнении index.html
я получаю следующую ошибку.
TypeError: func is not a function matrix.js:104:27
Это сбивает с толку, поскольку matrix.js
и nn.js
являются библиотечными функциями, предоставленными мне лицом, проводящим урок.
Глядя на код matrix.js, я обнаружил, что строка с ошибкой была
this.data[i][j] = func(val,i,j);
но я не смог найти определение функции для функции func()
где-либо в matrix.js
или nn.js
.
Но в коде nn.js
я обнаружил, что func
упоминается как переменная, а не функция.
class ActivationFunction {
constructor(func, dfunc) {
this.func = func;
this.dfunc = dfunc;
}
}
let sigmoid = new ActivationFunction(
x => 1 / (1 + Math.exp(-x)),
y => y * (1 - y)
);
let tanh = new ActivationFunction(
x => Math.tanh(x),
y => 1 - (y * y)
);
и
setActivationFunction(func = sigmoid) {
this.activation_function = func;
}
Итак, я предположил, что func предназначался для предоставления значения сигмоида от val
до this.data[I][j]
, поэтому я написал свою собственную функцию сигмоида, которая передавала значения функции активации в this.data[I][j]
. который при исполнении выдал ошибку
ReferenceError: NeuralNetwork is not defined[Learn More] bird.js:25:7
Поэтому я решил отказаться от попытки написать функцию и решил скопировать значение функции активации сигмоида непосредственно в переменную this.data[I][j]
следующим образом:
this.data[i][j] = 1/(1+Math.pow(Math.E, -val));
Этот метод не выдавал никаких ошибок, но представил мне новую проблему.
Раньше каждый член населения каждого поколения действовал независимо, создавая такой результат:
Но теперь я получаю
Дело не в том, что на втором изображении генерируется только один объект игрока, все 250 объектов генерируются, но все они накладываются друг на друга, создавая впечатление, что существует только один объект игрока. Это связано с
1/(1+Math.pow(Math.E, -val));
отправляя точно такое же значение на this.data[I][j]
, я заметил, что когда разные значения передаются на this.data[I][j]
, каждый объект игрока действует независимо.
Кто-нибудь имеет какие-либо идеи относительно того, почему func. переменная в одном файле и func - это функция в другом файле?
Я прошу прощения за отсутствие ясности, так как это ошибка в файлах библиотеки, я не эксперт по операциям с матрицами, и я постарался максимально полно передать проблему, с которой я столкнулся. Никто из тех, кого я знаю, до сих пор не сталкивался с этими проблемами.
Все необходимые файлы можно найти здесь