NEAT алгоритм, определение функции отсутствует в предоставленных библиотеках - PullRequest
0 голосов
/ 02 июля 2018

Я пытался реализовать алгоритм 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));

Этот метод не выдавал никаких ошибок, но представил мне новую проблему. Раньше каждый член населения каждого поколения действовал независимо, создавая такой результат: Correct Output

Но теперь я получаю Incorrect Output

Дело не в том, что на втором изображении генерируется только один объект игрока, все 250 объектов генерируются, но все они накладываются друг на друга, создавая впечатление, что существует только один объект игрока. Это связано с

1/(1+Math.pow(Math.E, -val));

отправляя точно такое же значение на this.data[I][j], я заметил, что когда разные значения передаются на this.data[I][j], каждый объект игрока действует независимо. Кто-нибудь имеет какие-либо идеи относительно того, почему func. переменная в одном файле и func - это функция в другом файле?

Я прошу прощения за отсутствие ясности, так как это ошибка в файлах библиотеки, я не эксперт по операциям с матрицами, и я постарался максимально полно передать проблему, с которой я столкнулся. Никто из тех, кого я знаю, до сих пор не сталкивался с этими проблемами.

Все необходимые файлы можно найти здесь

...