用神经网络和遗传算法求解XOR的问题

时间:2015-02-19 11:24:59

标签: neural-network genetic-algorithm xor fitness

我正在尝试使用神经网络解决XOR问题。对于训练我正在使用遗传算法。

但经过一定代(200)后,错误卡在1.输出正确,除了1 x或0,其中输出为0而不是1 我不明白为什么会这样。

人口规模:100
交叉率:70
突变率:5
精英人数:2
激活功能:sigmoid
选择方法: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]。

  • 对于突变,我尝试了两种方法(突变一种随机选择的基因):

- &GT;在[-0.1 0.1]之间添加随机扰动,具有5%的突变率。这样,我在第1800代获得了最好的结果(网络输出,如所需的网络输出)

- &GT;用新的基因改变基因的价值。新值应属于该范围。在这种情况下,我不得不将突变率设置为50%,因为算法可以收敛。并且权重必须在至少-7和7之间,否则它将不会收敛。

1 个答案:

答案 0 :(得分:0)

您指定了sigmoid作为激活函数,但是您应用负数,sigmoid与正数一起使用。 我认为这是问题的原因。 您应指定另一个激活功能,例如双曲正切函数(tanh)。

编辑:我现在很确定:重点是适应值。我怀疑你将它评估为误差(即使其最小化),同时选择具有更大适应值的更好的个体。