试图让蛇学习不同的方向

人工智能 神经网络 遗传算法
2021-11-12 21:04:54

我对神经网络真的很陌生。我正在尝试使用遗传算法制作一个神经网络,这将使蛇学会寻找食物并避免撞到他的尾巴。

问题是我认为我已经做到了,但是由于没有墙,蛇只学会了向一个方向前进,而无需转 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。

我确定我正在做的,不是一件,而是很多事情都非常糟糕,因为我是这方面的新手,但对此有所了解会非常酷。

2个回答

据我了解,你不会因为吃得快而给蛇奖励。事实上,“每一步,1分”。意味着它找到食物的速度越慢越好。那么考虑到它是危险的,为什么它会转弯。

我观察了您使用的评分系统,并将其与字段大小和饥饿率进行了比较。虫子要么死了,要么没有努力得到10吃的奖励,所以我加了1000。

这仍然没有引入 180 度转弯。我不得不在 Neat 上调整这些设置:

  mutationRate: 0.7,
  mutationAmount: 6,

它介绍对这个截图的影响了蠕虫将其路径优化为对角线的位置,当被迫改变 90 度方向时,实际上屏幕上会出现一个微小的 180 度。

在相同的 mutationRate 和 mutationAmount 上,但 10 点我曾经观察到水平 180,当食物出现回来并且没有发明对角线运动时。此外,我在最后一个设置中观察到恒定 180 秒流动的运动,其中连续的垂直或水平 180 秒在屏幕上形成了一条两像素粗的线。

这些观察结果并非 100% 与您的动画一样,而是引入了非常接近的各种方式,或者在某些情况下可以成为此类现象的首创。

这张照片也显示了两条像素线。

白虫引入两条像素线,红色90度转微型180。

编辑

我像这样改变了漂亮的曲线比例:

     var ratio = 0.75 + ((mindir / maxdir) * 0.25* difstepsratio);

在 200 代左右,生活着一条蠕虫,能够向各个方向移动,如果需要,可以制造 180 条。

不幸的是,在我从手机上找到屏幕截图按钮之前它就死了,并且(s)他恰好在比赛中成为第二名,因此成为只存在一次的独角兽。

这种突变是否能在某一天存活并成为主要物种仍然是个谜。

补充说明:

我注意到当蛇代码发生突变时,相同的模式会被复制很多次。如果蛇在很长的时间里有连续左转或右转的想法,那么经常发生用尾巴自杀的情况。

我试图用比饥饿更高的蛇碰撞分数来标记这一点,在第 180 代左右,自杀 360 循环的 dna 诞生并保持了几代人。

然而,这一代并没有进化到我之前看到的想要的智能 180 蠕虫。相反,自杀是如此有益,以至于它很快就杀死了那个分支。