繁体   English   中英

进化模拟器中的神经网络-如何在没有预期结果的情况下计算误差

[英]Neural networks in evolution simulator- how to calculate error without expected result

我正在用Java创建一个进化模拟器。 模拟包括具有冷/热区域以及高/低海拔等的地图。 我希望世界上的生物以两种方式进化-每个生物在其一生中都将进化为AI,并且当一个生物繁殖时就有变异的机会。 我认为最好使生物的大脑成为一个神经网络,该神经网络将传感器的数据作为输入(此时仅是眼睛),并向推进器发出命令(使生物四处移动)。

但是,我只有基本的神经网络经验,这些神经网络会从用户那里接收所需的输入并据此计算误差。 但是,在此模拟器中,没有最佳结果。 可以通过我创建的适应度函数对结果进行评分(该函数会计算能量变化,后代数量等),但是未知哪个输出节点错误以及哪个输出节点正确。

  1. 我是否使用正确的方法来解决此问题? 也许神经网络不是最佳解决方案?
  2. 如果这是实现我想要的目标的可行方法,那么如果我不知道它们,如何使神经网络调整正确的权重?

在此先感谢您,并感谢您的英语错误。

您在神经网络和游戏中遇到了一个常见问题。 如评论中所述,当没有“正确”的解决方案时,通常会使用遗传算法。 因此,您的目标基本上是将神经网络和遗传算法结合起来。 幸运的是,以前有人这样做过,并在本文中描述了该过程。

由于本文相对复杂,并且要花费大量时间来实现算法,因此您应该考虑使用库。 由于找不到适合我的库,因此我决定编写自己的库,您可以在这里找到该库应能很好地解决像您这样的“较小”问题。 您将在Main类中找到一些示例代码。

使用合并网络

Network.breedWith(Network other);

使用创建网络

Network net = new Network(int inputs, int outputs);

使用来突变网络

Network.innovate();

正如您将在示例代码中看到的那样,对于每个新网络,始终保持初始数量的突变非常重要。 这是因为在创建新网络时没有连接,因此需要创新(花哨的词来表示突变)来创建连接。 如果需要,您始终可以创建网络副本(Network.getCopy();)。 Network类及其所有属性实现可序列化,因此您可以使用ObjectOutputStream保存/加载网络。

如果您决定使用我的图书馆,请告诉我您获得了什么结果!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM