目标搜索AI

在Github上编辑


在下面的模拟中,经过大致进化的神经网络100代人试图寻找目标。他们的目标是尽可能接近目标任何时候都尽可能。如果您想了解其中一个网络的外观,查看完全模拟

单击字段以重新定位目标!源代码在这里

神经毒剂实际上表现得很好。至少有一个代理将拥有大约20代人之后,“解决了问题”。这是因为解决方案的基础很容易:神经网络的输入之一是与目标的角度,所以这一切需要做的是输出一些与此输入值类似的值。这很容易做到通过身份激活功能,但令人惊讶的是,上述模拟中的大多数代理倾向于避免此功能。

您可以查看网络的拓扑结构在这里如果你能在不同的设置下更快或更好地进化基因组,请对执行拉入请求回购。

制造

在前一篇文章中,我深入探讨了算法的环境,但在本文中我将更多地关注算法本身的设置和输入/输出。

如果您对链接回购中的代码有任何疑问,请在上创建问题回购。

代理人

代理的任务非常简单。他们必须接近设定为大约的目标100像素,一旦他们在附近,每个代理的分数将按比例增加`(100-dist)``距离。不过还有一个额外的因素:对于代理网络中的每个节点,代理的得分将减少。这有两个原因;1.网络不应过满解决方案;2。拥有较小的网络降低计算能力。

代理人有某种动力。它们没有质量,但有加速度,所以需要一个小的代理在特定方向上达到最高速度的时间量。

每个代理都有以下输入:

  • 它在x轴上的自身速度
  • 其自身在y轴上的速度
  • 目标在x轴上的速度
  • 目标在y轴上的速度
  • 朝向目标的角度
  • 到目标的距离

每个代理的输出正好是所需的移动方向。

除了田地的墙外,没有任何碰撞。将来,可能会有兴趣添加多个代理和/或目标之间的冲突以揭示一些新策略。这需要代理了解周围代理的位置。

目标

目标相当容易。它被编程为不时按随机数量切换方向。那里但有一点很重要:目标以特工一半的速度移动,这可以确保特工总是有能力追赶目标。除此之外,目标的物理特性类似于代理人的物理。

遗传算法

遗传算法是人工智能的核心。在第一帧中玩家的数量是用神经网络作为大脑初始化的。大脑代表一代人的人口。这些大脑是由让所有人都参与进来,让他们参与竞争彼此相对。最合适的大脑被转移到下一代,不太合适的大脑被切除的可能性很高。

//网络不应该太大for(净种群中的var基因组){基因组=纯种群[基因组];genome.score-=genome.nodes.length*score_RADIUS/10;}//按分数对人口进行排序clean.sort();//绘制最佳基因组drawGraph(整洁.poperation[0].graph($('.best').width(),$('.mest').height()),'.best(),false);//初始化新流行音乐var newPopulation=[];//精英主义对于(var i=0;i<neat.elitism;i++){newPopulation.push(night.poperation[i]);}//培育下一批个体对于(var i=0;i<neat.popsize-neat.elitism;i++){newPopulation.push(night.getOffspring());}//以新人口取代旧人口neat.population=新人口;night.mutate();整洁。生成++;startEvaluation();

上面的代码显示了评估完成时运行的代码。它非常相似至内置进化()Neataptic的功能,但为了避免适应必须同时评估所有基因组的功能。

基因组的评分很容易:当达到一定的迭代次数时,每个基因组都根据其最终得分进行排序。得分较高的基因组有少量节点并在整个迭代过程中一直接近目标。

一些(可配置)设置:

  • 评估运行250帧
  • 突变率为0.3
  • 精英主义占10%
  • 每个基因组以0个隐藏节点开始
  • 允许所有突变方法

问题/未来改进

叉子

  • corpr8的叉子为每个神经代理提供自己的加速度,并让每个箭头每一代人都呆在同一个地方。这创造了更多“流体”过程。