类神经网络数据结构

时间:2014-04-02 03:02:42

标签: data-structures artificial-intelligence genetic-algorithm

所以我正在研究一个侧面项目,目的是试验遗传算法。该项目涉及两个类,Critters和Food。当他们找到食物时,小动物每次蜱虫都会感到饥饿并且会失去饥饿感。小动物可以移动,食物是静止的。每个Critter都有一个基因组,它只是一串随机生成的字符。目标是经过几代人之后,小动物将发展出专门的运动模式,从而实现最佳的食物消费。

现在,每个小动物都受神经网络的支配。神经网络用来自Critter基因组的权重和偏差初始化。神经网络的第一个输入是[0,0]。神经网络产生两个输出,分别决定了Critter的x和y运动的方向。此输出用作下一个滴答处的神经网络的输入。例如:

1: [0,0]->NN->[.598.., -.234...] // Critter moves right and up
2: [.598...,-.234...]->NN->[-.409...,-.232...] // Critter moves left and up
3: [-.409...,-.232...]->NN-> etc.

问题是,无论权重如何初始化,神经网络都会找到一种“固定点”。也就是说,在两次或三次迭代之后,输出和输入实际上是相同的,因此Critter总是朝着相同的方向移动。现在我没有训练神经网络,我真的不想。所以我正在寻找的是另一种生成输出的方法。

更具体地说,假设我有基因组生成的n个随机权重。我需要一个由n个权重确定的关系,这些权重可以(在最松散的意义上)将[-1,1]范围内的2个输入映射到相同范围内的两个输出。主要的是我希望权重对函数的行为产生显着影响。我不希望它像y = mx + b那样我们只改变y和b。

我知道这是一个非常含糊的描述。起初我认为神经网络是完美的,但似乎输入在没有训练的情况下对输出几乎没有影响(这是公平的,因为神经网络应该被训练)。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

只是一个想法。

您有f(genome) -> (w_1, w_2, ..., w_n),其中f根据w生成genome

例如,您可以使用哈希函数h并计算[h(w_1, ..., w_(n/2)), h(w_(n/2+1), ..., w_n))]

通常,哈希函数应该为输入的微小变化提供非常明显的输出。但不总是。您可以查找continuous的哈希函数(输入变化很小,输出变化很小)。这种功能将用于相似性搜索,http://en.wikipedia.org/wiki/Locality_sensitive_hashing可能会提供一些想法。这样你就可以直接在基因组上使用哈希。

否则,您可以尝试拆分基因组或权重,并为分裂提供不同的目的。我们说n = 4

(w_1, w_2)会影响x

(w_3, w_4)会影响y

然后,您可以将x计算为(w_1 + w_2*Random_[-1,1])/2,其中Random_[-1,1]是区间[-1,1]中的随机数,并假设所有w_i \in [-1,1] i }}

同样适用于y

然后,您的遗传算法将优化Critters移动的速度和随机性,以便最佳地找到食物。如果你有更多的权重(或更长的基因组),你可以尝试以类似的精神提出一个更高级的功能。

这实际上表明,通过遗传算法,问题解决转向寻找良好的基因组表示和良好的适应度函数,所以如果你被卡住了就不要担心。