你会如何设计一个机器学习系统来玩愤怒的小鸟?

机器算法验证 机器学习 强化学习
2022-02-14 22:49:38

在玩了太多愤怒的小鸟之后,我开始观察自己的策略。事实证明,我开发了一种非常具体的方法来在每个级别上获得 3 颗星。

这让我想知道开发一个能够玩《愤怒的小鸟》的机器学习系统所面临的挑战。与游戏互动并发射小鸟是微不足道的。但我的一个问题是关于系统的“构建块”。

机器学习系统似乎使用简单的概念或对问题的理解。这通常被编码为作为输入的特征。因此,系统似乎需要具备理解一些高级概念的能力才能生成策略。

这是真的?此外,开发这样一个系统的挑战或困难部分是什么?

编辑#1:

这里有一些澄清。获得 3 星是一个难题,因为您必须最大化积分。这可以通过两种非排他性的方式来完成: 1) 尽量减少使用的鸟的数量(每只未使用的鸟您将获得 10,000 分)。2)最大限度地破坏玻璃、木头等物体。每个被摧毁的物体都会给你积分。一只鸟可以摧毁超过10,000点的物体。

这是关于“高级概念”的更多解释。为了最大化上述点,您需要使用每只鸟的特殊力量。因此,这意味着根据地图的布局发射具有不同轨迹的不同鸟类。而且,在玩游戏时,我制定了一种策略,以特定的顺序用特定的鸟类摧毁特定区域。

似乎如果不了解如何使用每只鸟来摧毁特定区域,系统就无法学会获得 3 颗星。那么,你如何管理和编码这样的东西呢?您如何确保系统可以学习这些高级概念?

4个回答

假设您可以在软件中获得正确的钩子(或者您使用自己的模型),有些事情在这里会很容易,有些则不那么容易。我认为这是一个相当棘手的问题。正如 carlosdc 提到的,强化学习 (RL)是一种可能的途径,尽管我不确定它是否正确。

当你开始时,你必须定义你的状态空间动作空间转换动态奖励函数是什么。状态/动作空间可以是连续的或离散的,转换动态可以由问题给出或以数学方式建模。最后,奖励函数可以先验地给出,或者可以被采样(有或没有噪声)。

动作空间很简单:它只是你射击当前鸟的方向和力量。对于人类来说,这是一个离散的问题(鼠标/触摸屏是数字输入设备)——假设(例如)有 32 个可能的方向和 10 个可能的功率,给出 320 个可能的动作。

奖励函数也很容易推导出来:目标是用最少的鸟消灭所有的猪(好吧,其他事情还有额外的分数,但我们现在先忽略它)。最好的办法是我们知道杀死猪产生分数的实际函数(取决于猪的大小等 IIRC)——但对于单个关卡,这可以完美地建模。

状态空间和转换动态要困难得多。为了正确建模,我们必须知道地图的整个布局游戏的物理特性。过渡动力学说“如果我处于状态x并且我执行动作y,我将降落在状态z ”。你可以看到这样做的困难,首先因为系统的复杂物理特性意味着这将非常难以准确建模,其次因为即使在第一轮(320)之后也有很多可能的结果状态,这就是如果我们假设物理引擎中没有随机性,从玩过它我怀疑有。我认为在这个阶段你会放弃并回家。

另一种方法是一开始就像人类一样对待它——即反复试验。至少在开始时,人类几乎是随机开火(虽然在将鸟送向猪之前有相当强的时间,但这很容易被编码),直到找到一系列好的动作。这更像是多臂强盗环境。这里土匪的“武器”是可能的行动。该算法试图平衡探索和利用——即探索行动空间并在发现好的行动时利用它们。为此,您不需要了解任何有关潜在动态的信息——您只需要了解行动和奖励。要完全做到这一点,您必须在所有回合中为每个可能的动作都有一个手臂(例如,您有 5 只鸟 * 320 动作 = 320^5 = 大约 10^12 动作),所以动作空间非常大!但是,如果您知道一点,您可以使用一些技巧来改善这一点关于状态空间。例如,您可能会排除将鸟从猪身上驱赶到地下,或没有足够的力量触及任何猪的行为。另外,前几轮没有杀猪只需要达到第5只,所以部分动作状态实际上是不可能的。这有点让人想起MoGo算法中使用的方法,这是一种基于应用于树的上置信边界下围棋的计算机程序,这是解决多臂老虎机问题的一种方法。

很酷的问题!

这个问题似乎是关于这类问题的自然技术。我认为这类问题的自然技术是 强化学习(RL)。RL 是关于代理应该如何在环境中采取行动以最大化累积奖励的一些概念。RL 最著名的算法可能是Q-learning我认为这是本网站关于强化学习的第一个问题。

如果您尝试将其作为分类/回归来处理,我认为您的要求是正确的,但是这些似乎不是解决此问题的正确工具。这自然是一个 RL 问题,需要考虑动作和结果的序列。

在这里查看其他人的做法或自己参与:愤怒的小鸟 AI 挑战http://ai2012.web.cse.unsw.edu.au/abc.html

刚刚在 meta 中提到了这一点。Koza 开创性地使用遗传算法来解决视频游戏吃豆人。他构建了可以感知和行动的算法原语。我记得这些被组合在类似 Lisp 的树中以创建更大的算法。与 Lisp 树的交叉涉及替换或交换表示算法表达式的子树。成功函数类似于“吃掉的点”或“吃掉的点加上鬼”或“活着的时间”。这方面还有一些工作要做。下面的这篇论文中有一个 koza 参考。对于这些类型的问题,训练时间可能很长,并且“收敛”非常缓慢。

学习玩吃豆人: Gallagher 和 Ryan 的基于规则的进化方法