根据NEAT论文,写出的程序出现了各种各样的问题,重新静下心来阅读后,标注下其中的关键点,并记录遇到的问题。
如下:
NEAT增强遗传拓扑有效的原因有以下三个方面,缺一不可(参见论文末尾的排除法验证)。
笔者实现该算法时遇到的问题,及可能产生的情况:
改动1:
笔者的计算方式为正向传递计算, 当长度不一致时,一个节点会计算多次。 每次有输入都会计算一次。在输出节点,最后统一计算。
如下:
计算完Node2后,Node2的输出又指向向了Node3, 则,Node3 会计算两次。 第一次Node1、Node3一起计算,第二次Node2激活后输出到Node3,又计算一次。
而输出节点,统一收集所有的结果,统一计算一次。计算方式目前测试对成功率无影响。
改动2:
笔者使用正态分布进行选择个体,虽然能较快的收敛。但几十代后出现了族群消失的问题, 只剩一个族群。 改为轮盘赌算法后,在xor测试案例上,100代内的成功率由97.7% 提升到 99.3%。
确认【族群】多样性对整个种群的提升是必要的。也就是说淘汰个体时,并不能一味的淘汰掉末尾适应度低的个体。 否则很可能陷入跨越局部最优解。