NEAT算法,提供的库中缺少函数定义

时间:2018-07-02 11:31:49

标签: javascript machine-learning artificial-intelligence genetic-algorithm

我一直在尝试为蓬松的鸟类克隆实现增强神经拓扑进化(NEAT)算法,请参考youtube上的教程。

在本教程之后,我遇到了以下问题: 执行index.html时,出现以下错误。

TypeError: func is not a function matrix.js:104:27

这令人困惑,因为matrix.jsnn.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]的S形值,所以我编写了自己的Sigmoid函数,将激活函数的值馈送到this.data[I][j]。在执行时引发了错误 ReferenceError: NeuralNetwork is not defined[Learn More] bird.js:25:7

因此,我决定放弃尝试编写函数的决定,并决定将S型激活函数的值直接复制到变量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是另一个文件中的函数吗?

我很抱歉,因为我不够清楚,因为这是库文件中的错误,我不是矩阵运算的专家,并且我已尽我所能尝试传达了我所面临的问题。到目前为止,我所认识的人都没有遇到过这些问题。

所有必需的文件都可以找到here

0 个答案:

没有答案