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

时间:2017-07-08 17:11:14

标签: java neural-network

我正在用Java创建一个进化模拟器。模拟包括具有冷/热区域和高/低高度等的地图。 我希望世界上的生物以两种方式进化 - 每一个生物都会在其一生中发展它的AI,当一个生物再现时,就有可能发生变异。 我认为让这些生物的大脑成为一个神经网络,将传感器的数据作为输入(目前只有眼睛),然后向推进器(使生物移动)产生命令,这将是一件好事。

但是,我只有基本神经网络的经验,可以接收用户的所需输入并相应地计算错误。但是在这个模拟器中,没有最佳结果。结果可以通过我创建的适应度函数(其计算能量变化,后代数量等)进行评级,但不知道哪个输出节点是错误的,哪个是正确的。

  1. 我是否使用正确的方法来解决这个问题?或许神经网络不是最好的解决方案?
  2. 如果这是实现我想要的可行方式,如果我不知道它们怎么能让神经网络调整正确的权重呢?
  3. 提前致谢,对任何英语错误感到抱歉。

1 个答案:

答案 0 :(得分:0)

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

由于论文相对复杂,实现算法需要花费大量时间,因此您应该考虑使用库。 由于我找不到任何适合我的图书馆,我决定自己写一个,你可以找到它here 图书馆的工作应该足够小,以便“小”。像你这样的问题。您将在Main类中找到一些示例代码。

使用

组合网络
Network.breedWith(Network other);

使用

创建网络
Network net = new Network(int inputs, int outputs);

使用

突变网络
Network.innovate();

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

如果您决定使用我的图书馆,请告诉我您的结果!