我正在尝试使用神经网络解决 XOR 问题。对于训练,我使用遗传算法。
但是经过一定数量的代数(200),错误停留在 1 中。并且输出是正确的,除了 1 xor 0 输出为 0 而不是 1 我不明白为什么会发生这种情况。
人口规模:100
交叉率:70
突变率:5
精英数:2
激活函数:S 型
选择方法:7 名参与者的锦标赛选择
变异算法 =
for (int i=0; i< individual.getNbrOfWeights(); i++)
if (random(0,100) < mutationRate)
{
genome[i] = genome[i] + random(-0.1,0.1);
}
适应度计算 =
double error = 0;
error = error + feedForward({0, 1}, 1);
error = error + feedForward({1, 0}, 1);
error = error + feedForward({1, 1}, 0);
error = error + feedForward({0, 0}, 0);
fitness = error;
其中错误是目标输出
我尝试在突变中设置 [-2 2] 范围内的权重,但它变得更糟(错误停留在 1.6 中)。因此,如果有义务将权重设置在某个范围内,我现在不...
我真的需要你的帮助,在此先感谢。
编辑
事实上,问题在于权重初始化和变异方法。
当我在 [-1 1] 之间设置权重时,算法不会收敛。但是我越是扩大范围,它就越能提供更好的结果,比如在 [-4 4] 之间。
对于突变,我尝试了两种方法(突变一个随机选择的基因):
--> 在 [-0.1 0.1] 之间添加一个随机扰动,突变率为 5%。这样,我在第 1800 代得到了最好的结果(网络输出就像期望的一样)
--> 用一个新的改变基因的值。新值应属于该范围。在这种情况下,我必须将突变率设置为 50%,这样算法才能收敛。并且权重必须至少在 -7 和 7 之间,否则它不会收敛。