我使用PyGame制作了乒乓球游戏,现在我想使用遗传算法让AI学会玩这个游戏。我希望AI只知道自己的球拍和球的位置以及控制方式。我只是不知道如何让AI自己移动球拍。我不想使用像“如果球在你上面,就向上移动”这样的规则,我希望它尝试随机的动作,直到学会该做什么。
所以我的问题是,如何让AI尝试不同的控制方式并找出有效的方法?
回答:
学习Atari-乒乓球已经成为强化学习中的标准任务。例如,OpenAI baselines的GitHub仓库实现了可以应用于各种任务的RL算法。
你完全不需要那些高级算法来学习你描述的乒乓球游戏,但你可以从他们使用的API中学习如何区分任务(在强化学习术语中称为“环境”)和AI部分(“控制器”或“代理”)。为此,我建议你阅读OpenAI Gym文档,了解如何添加新的环境。
简而言之,你可以使用一些浮点数(球的位置和速度,或者两个位置代替速度,以及球拍的位置)。或者你可以使用离散输入(整数,或者只是像素,这更难学习)。这些输入可以连接到一个小型神经网络。
对于命令输出,最简单的方法是预测向上或向下移动的概率。这是一个好主意,因为当你评估你的控制器时,它将有一些非零的得分机会,因此你的遗传算法可以比较不同控制器(具有不同权重)的表现。只需在你的神经网络输出上使用sigmoid函数,并将其解释为概率。
如果你将所有神经网络权重初始化到一个好的随机范围内,你可能会通过长时间尝试随机权重得到一个不完全糟糕的乒乓球玩家(即使没有GA)。
附注:如果你没有计划使用神经网络:如果只需要实现前向传递,它们真的很简单从头开始实现。例如,如果你不实现反向传播训练,而是使用GA来学习权重(或进化策略,或只是随机权重)。最难的部分是找到初始随机权重的好范围。