我一直在创建神经网络,计划训练它们玩我制作的游戏(神经网络可以访问所有游戏数据)。 我对神经网络、遗传算法和 NEAT 实现有深入的了解。 然而,我遇到的问题是将玩家所看到的输入标准化。 如果我们有敌人对象、医疗包对象和武器对象,则需要对它们进行输入和区别对待。 我在here看到了 SethBling 的视频,他在视频中简要解释了他如何设置神经网络。 他只使用了值 1、0 和 -1。 然而,对于更复杂的游戏,这是行不通的。 我尝试过让一个小型模拟在输入为 0.25 时返回 true < x < .75 and false otherwise, however it couldn't find a solution. Therefore, it seems that I cannot just toss the IDs of the objects into the neural network. Any help?
我假设您使用 NEAT 算法作为您的游戏算法。现在,据我所知,您的问题是,由于您在游戏中需要与不同数量的实际对象进行交互,因此几乎不可能为每个帧给所有内容都贴上标签。因此,正如您似乎已经发现的那样,您需要为对象提供一个非整数域,无论是通过类总数规范化检测到的类 id,还是使用其他方法。为了尝试实现这一目标(或避免问题),我向您提出 3 个建议:
使用某种类型的图像处理(无论是分割还是阈值处理)、对象检测以及图像时刻来创建您感兴趣的对象的数据库,然后在玩游戏时,您可以重新创建实际游戏环境的简单版本
训练语义分割神经网络以执行类似于 1 的操作
训练(或使用预先训练的)深度卷积神经网络来提取高级特征。然后使用这些特征(以及可能的某种位置编码方法)作为 NEAT 算法的输入。然后,您的 NEAT 算法将选择它想要查看的过滤器组合以做出决定。
我想我个人会尝试选项 3,因为它在初始设置时需要最少的手动工作。
使用神经网络时,一个好的方法是将它们视为人类。人类需要知道什么? 我总是做的是为网络提供不同的传感器来处理不同类型的事物。我的传感器几乎总是有一定长度的光线。 在你的情况下,我相信你没有比使用例如 3 个硬币传感器、3 个医疗传感器等更好的选择了。 您还必须决定是否要使用布尔传感器(它只会告诉网络是否有东西触发传感器,无论距离有多近)或双传感器(它会返回一个值,告诉网络事件发生的距离有多近)或者如果您想两者结合。