我正在进行一个小型副项目,目的是实验遗传算法。这个项目涉及两个类,生物和食物。生物每经过一个时间单位就会增加饥饿值,当找到食物时饥饿值会减少。生物可以移动,而食物是静止的。每个生物都有一个基因组,这只是一个随机生成的字符字符串。目标是经过几代之后,生物会进化出专门的移动模式,从而实现最佳的食物消耗。
目前,每个生物都由一个神经网络控制。神经网络的权重和偏置是从生物的基因组中导出的。神经网络的第一个输入是[0,0]。神经网络产生两个输出,分别决定生物的x和y方向的移动。这个输出将作为下一时间单位神经网络的输入。例如:
1: [0,0]->NN->[.598.., -.234...] // 生物向右上移动2: [.598...,-.234...]->NN->[-.409...,-.232...] // 生物向左上移动3: [-.409...,-.232...]->NN-> 等等
问题是,无论权重如何初始化,神经网络都会找到一种“固定点”。也就是说,经过两三次迭代后,输出和输入几乎相同,因此生物总是朝同一个方向移动。现在我没有训练神经网络,我也不想训练。所以我正在寻找一种生成输出的替代方法。
更具体地说,假设我有由基因组生成的n个随机权重。我需要一个由这些n个权重决定的关系,能够(以最宽泛的意义上)将[-1,1]范围内的两个输入映射到同一范围内的两个输出。关键是我希望权重对函数的行为有显著影响。我不想它像y=mx+b那样,我们只是改变y和b。
我知道这是一个相当模糊的描述。起初我认为神经网络会很完美,但似乎在没有训练的情况下,输入对输出的影响几乎为零(这也是合理的,因为神经网络是用来训练的)。
有什么建议吗?
回答:
这只是一个想法。
你有 f(genome) -> (w_1, w_2, ..., w_n)
,其中 f
基于 genome
生成 w
。
例如,你可以使用一个哈希函数 h
并计算 [h(w_1, ..., w_(n/2)), h(w_(n/2+1), ..., w_n))]
。
通常,哈希函数应该对输入的微小变化产生非常不同的输出。但并非总是如此。你可以寻找那些是连续的哈希函数(输入的微小变化,输出的微小变化)。这种类型的函数可用于相似性搜索,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]
内的随机数,并且假设对于所有 i
,w_i \in [-1,1]
。
对 y
进行类似的计算。
然后你的遗传算法将优化生物移动的速度和随机性,以便最佳地寻找食物。如果你有更多的权重(或更长的基因组),你可以尝试设计一个更复杂的函数,遵循类似的思路。
这实际上表明,在使用遗传算法时,问题解决的重点转移到了寻找好的基因组表示和好的适应度函数上,所以如果在这方面遇到一些困难,不要担心。