我对神经网络真的很陌生。我正在尝试使用遗传算法制作一个神经网络,这将使蛇学会寻找食物并避免撞到他的尾巴。
问题是我认为我已经做到了,但是由于没有墙,蛇只学会了向一个方向前进,而无需转 180 圈[GIF 这里]。
我试图通过降低总是走相同方向的蛇的分数来激励使它们转动的突变,但它不起作用。我只是让它们变得更笨,需要更多品种才能接触到另一条“聪明”的线性蛇。
我制作了一个有 5 个输入的网络:
- 相对于我的位置和方向的食物位置(2 个输入。x 和 y)
- 如果我左转,最近的墙(我的尾巴)
- 如果我不转,最近的墙(我的尾巴)
- 如果我右转,最近的墙(我的尾巴)
输出为 3,第一个左转,第二个不转,第三个右转。我让蛇成为 3 个输出中最高的一个。
我添加了 1 个 8 个神经元的隐藏层(输入 + 输出前提)。
我计算分数的方法是:
- 每一步,1分。
- 每种食物吃过,10分。
- 如果蛇在不吃食物的情况下持续太长时间,就会死亡。
- 如果撞到他的尾巴,就会死。
然后我保存每次这条蛇的方向(上、右、下、左)并将它们加一。当蛇死时,我用最低和最高值之间的差来加权最终得分。如果差异很大,他们会受到很大的惩罚(降低到他们得分的 0.25)。这样,如果一条蛇几乎是线性的,则会受到较高的惩罚,而如果蛇的模式很酷,则会受到较低的惩罚。
此外,与上次方向变化相比,我会记录每次方向变化发生的时间,因此如果一条蛇继续绕圈行驶,由于“酷模式方法”用于所有 4 个方向,因此不会获得高分。
有了这一切,我不明白为什么我最好的蛇总是线性的:-/
我生成了 20 条蛇,并在每个人都死后获得了每一代中最好的 4 条。
对于几代人,我使用neaptics.js,对于神经网络,我使用synaptics.js。我在这里有一个小提琴:http: //jsfiddle.net/Llorx/gunsct5r/
在线10
您可以看到网络定义。在211
您可以看到蛇“视图”(食物位置和墙壁。它获取输入的位置)并且164
您可以根据我之前提到的步骤看到分数权重计算。
所有输入都从 0 标准化到 1。
我确定我正在做的,不是一件,而是很多事情都非常糟糕,因为我是这方面的新手,但对此有所了解会非常酷。