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

Java 进化模拟器中的神经网络——如何在没有预期结果的情况下计算误差,java,neural-network,Java,Neural Network,我正在用Java创建一个进化模拟器。模拟包括一张带有冷/热区域和高/低海拔等的地图。 我希望世界上的生物以两种方式进化——每一种生物在其一生中都会进化出它的人工智能,而当一种生物繁殖时,就有可能发生突变。 我认为最好是让生物的大脑成为一个神经网络,将传感器的数据作为输入(目前只有眼睛),并向推进器发出指令(推动生物四处移动) 然而,我只有基本神经网络的经验,这些神经网络从用户那里接收所需的输入并相应地计算误差。然而,在这个模拟器中,没有最优结果。结果可以通过我创建的适应度函数进行评级(该函数计算

我正在用Java创建一个进化模拟器。模拟包括一张带有冷/热区域和高/低海拔等的地图。 我希望世界上的生物以两种方式进化——每一种生物在其一生中都会进化出它的人工智能,而当一种生物繁殖时,就有可能发生突变。 我认为最好是让生物的大脑成为一个神经网络,将传感器的数据作为输入(目前只有眼睛),并向推进器发出指令(推动生物四处移动)

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

  • 对于这个问题,我是否使用了正确的方法?或者神经网络不是最好的解决方案
  • 如果这是一个可行的方法来实现我的愿望,我如何使神经网络调整正确的权重,如果我不知道他们

  • 提前感谢,并为所有英语错误感到抱歉。

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

    由于该论文比较复杂,实现该算法的时间非常长,因此应该考虑使用库。 因为我找不到适合我的图书馆,所以我决定自己写一本,你可以找到 这个库应该可以很好地处理像你这样的“小”问题。您将在主类中找到一些示例代码

    使用

    Network.breedWith(Network other);
    
    Network net = new Network(int inputs, int outputs);
    
    Network.innovate();
    
    使用创建网络

    Network.breedWith(Network other);
    
    Network net = new Network(int inputs, int outputs);
    
    Network.innovate();
    
    使用

    Network.breedWith(Network other);
    
    Network net = new Network(int inputs, int outputs);
    
    Network.innovate();
    
    正如您将在示例代码中看到的,始终为每个新网络设置初始数量的突变非常重要。这是因为当你创建一个新的网络时,没有连接,所以需要创新来创建连接。 如果需要,您可以始终创建网络副本(Network.getCopy();)。Network类及其所有属性实现可序列化,因此您可以使用ObjectOutputStream保存/加载网络


    如果你决定使用我的图书馆,请让我知道你得到了什么结果

    这篇精彩的教程描述了您正在谈论的具体场景,我认为您会发现它非常有用。所以你是说我应该使用遗传算法而不是神经网络?@AlexT。问题是我不能一次做出超过一个的决定,因为每个生物都必须做出每一个决定。我希望能够选择做什么,然后根据决定的结果学习下一次做什么。老实说,我有一部分人认为神经网络对所显示的内容有点过火。你看过《生活密码游戏》吗?我认为你提出的问题,用眼睛作为这个热图的输入,将得到很好的定义,而神经网络用于不适定问题。比如,一旦你弄清楚热图上有什么好的和坏的,那么真正需要训练的是什么呢?也许你应该研究一下路径规划算法,比如势场图?