我最近试图自己实现NEAT(增强拓扑的神经进化),解决XOR问题时似乎陷入了某种局部最大值。
我的实现能够按照NEAT算法的要求添加隐藏的节点和连接,而且我的算法有可能解决它,因为它能够在几百代后的极少数情况下解决它。
我在该项目中的所有代码都可以在https://github.com/Maxwell-Hunt/NEAT上找到,有关该算法的原始论文可以在http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf上找到。
当我尝试使其求解XOR时,通常可以得到正确的结果:[0,0]-> [0],[0,1]-> [1],[1,0]- > [1],但也会得到[1,1]-> 1,这是不正确的。
答案 0 :(得分:0)
我已经在Ruby中实现了NEAT,可以很好地解决XOR问题。
https://github.com/flajann2/rubyneat
请随时仔细阅读并从我的代码中窃取。
调试类似的东西可能很棘手。对于初学者,请密切注意您的健身配方。我没有机会查看您的代码,但是它应该提供部分答案,您会在我的代码中看到它:
https://github.com/flajann2/rubyneat_examples
您可能还需要密切注意S型函数的工作方式。它不应该太陡峭等等。
另外,您的选择和配对算法也可能是有问题的。如果您没有正确理解它们,则可能无法开始进化。
我的代码需要大约100-200次运行才能转换为XOR的正确解决方案。但是,它应该快很多,而且我知道我需要做些什么来改进它,但是它确实有效。
希望这会有所帮助。