27

我的一个朋友正在开始构建一个 NetHack 机器人(一个玩 Roguelike 游戏的机器人:NetHack)。对于类似的游戏 Angband 有一个非常好的工作机器人,但它工作的部分原因是回到城镇很容易并且总是能够在低等级浮渣获得物品。

在 NetHack 中,问题要困难得多,因为游戏奖励大胆的实验并且基本上构建为 1,000 个边缘案例。

最近我建议使用某种朴素贝叶斯分析,这与创建垃圾邮件的方式非常相似。

基本上,机器人首先会构建一个语料库,通过对它找到的每个项目或生物尝试所有可能的动作并存储该信息,例如,它有多接近死亡、负面影响的伤害。随着时间的推移,您似乎可以生成一个相当可玩的模型。

任何人都可以为我们指出一个好的开始的正确方向吗?我是在找错树还是误解了贝叶斯分析的概念?

编辑:我的朋友提出了一个允许 python 绑定的 NetHack 补丁的 github 存储库。它仍然处于相当原始的状态,但如果有人感兴趣的话......

4

5 回答 5

6

尽管贝叶斯分析包含更多内容,但垃圾邮件过滤器中众所周知的朴素贝叶斯算法是基于一个非常基本的假设:所有变量本质上是相互独立的。例如,在垃圾邮件过滤中,每个单词通常被视为一个变量,因此这意味着假设如果电子邮件包含单词“viagra”,那么该知识确实会影响它也包含单词“medicine”(或“foo”)的概率'或'垃圾邮件'或其他任何东西)。有趣的是,当涉及到自然语言时,这个假设显然是错误的,但仍然设法产生合理的结果。

现在,人们有时绕过独立性假设的一种方法是定义从技术上讲是事物组合的变量(例如搜索令牌“购买伟哥”)。如果您知道要查找的特定情况,这可能会起作用,但总的来说,在游戏环境中,这意味着您通常无法记住任何内容。所以每次你必须移动、执行一个动作等时,它完全独立于你迄今为止所做的任何其他事情。我想说,即使是最简单的游戏,这也是学习游戏的一种非常低效的方式。

我建议考虑改用 q-learning。无论如何,您会发现的大多数示例通常只是简单的游戏(例如学习导航地图同时避开墙壁、陷阱、怪物等)。强化学习是一种在线无监督学习,在可以建模为与环境交互的代理(如游戏(或机器人))的情况下表现得非常好。它这样做是为了弄清楚环境中每个状态的最佳操作是什么(每个状态可以根据需要包含尽可能多的变量,而不仅仅是“我在哪里”)。然后,诀窍是保持足够的状态,以帮助机器人做出正确的决策,而不会在您的状态“空间”中为先前动作的每个可能组合提供一个明显的点。

更具体地说,如果您要构建一个国际象棋机器人,如果您尝试创建一个基于所有先前动作做出决策的决策策略,您可能会遇到麻烦,因为国际象棋动作的所有可能组合的集合增长非常快. 即使是每个棋子在棋盘上的位置的更简单模型仍然是一个非常大的状态空间,因此您必须找到一种方法来简化您跟踪的内容。但是请注意,您确实可以跟踪某些状态,这样您的机器人就不会一遍又一遍地尝试将左术语变成墙。

维基百科的文章非常专业,但本教程在将概念转化为现实世界的示例方面做得更好。

一个问题是,您确实需要能够将奖励定义为积极的“强化”。也就是说,您需要能够定义机器人试图达到的状态,否则它将永远持续下去。

于 2010-01-26T07:38:02.850 回答
4

有先例:滔天的rog-o-matic程序成功耍流氓,甚至带着Yendor的护身符回来了几次。不幸的是,rogue 只是发布了一个二进制文件,而不是源代码,所以它已经死了(除非你可以在 MicroVAX 上设置一个 4.3BSD 系统),让 rog-o-matic 无法播放任何克隆。它只是挂起,因为他们没有足够接近仿真。

然而,我认为 rog-o-matic 是我一直以来最喜欢的程序,不仅因为它所取得的成就,还因为代码的可读性和其算法的可理解智能。它使用了“基因遗传”:一个新玩家会继承前一对成功玩家的偏好组合,并带有一些随机偏移,然后与机器对抗。更成功的偏好会在基因库中向上迁移,而不太成功的偏好则会向下迁移。

这些天来可能很难找到源,但搜索“rogomatic”会让你走上这条路。

于 2010-01-22T13:37:10.663 回答
4

我怀疑贝叶斯分析会让你走得更远,因为大多数 NetHack 都是高度上下文相关的。很少有动作总是坏主意;大多数也是“正确”情况下的救生员(一个极端的例子是吃鸡蛇鱼:那很糟糕,除非你正在挨饿并且目前变形为一个抗石头的怪物,在这种情况下吃鸡蛇鱼是正确的做法)。一些“几乎糟糕”的行动是赢得比赛所必需的(例如,在 1 级上楼梯,或故意掉入陷阱以到达 Gehennom)。

您可以尝试的是尝试在“元”级别进行操作。将机器人设计为在各种“基本行为”中随机选择。然后尝试衡量这些机器人的表现。然后提取似乎促进生存的行为组合;贝叶斯分析可以在广泛的游戏语料库及其“成功水平”中做到这一点。例如,如果存在“捡起匕首”和“避免与怪物混战”的行为,我会假设分析表明这两种行为可以很好地结合在一起:不使用匕首的机器人和试图捡起匕首的机器人向怪物投掷导弹而不收集此类导弹,情况可能会更糟。

这以某种方式模仿了学习游戏玩家在 rec.games.roguelike.nethack 中经常要求的内容。大多数问题类似于:“我应该喝未知药水来识别它们吗?” 或“在深入地牢之前,我的角色应该是什么级别?”。这些问题的答案很大程度上取决于玩家正在做什么,并且没有好的绝对答案。

这里的一个难点是如何衡量生存的成功。如果您只是尝试最大化死亡前所花费的时间,那么您将偏爱永远不会离开第一关的机器人;那些人可能长寿,但永远不会赢得比赛。如果你通过角色在死前走多远来衡量成功,那么最好的机器人将是考古学家(他们从镐开始)在挖掘狂潮中。

于 2010-01-28T16:30:54.283 回答
3

显然那里有很多 Nethack 机器人。看看这个清单:

于 2010-02-25T22:06:24.443 回答
1

在 nethack 中,未知动作通常具有布尔效果——要么你获得,要么你失去。贝叶斯网络基于“模糊逻辑”值——一个动作可能会以给定的概率获得收益。因此,您不需要贝叶斯网络,只需列出“发现的效果”以及它们的好坏。

没必要再吃鸡蛇了,是吗?

总而言之,这取决于您想为机器人提供多少“知识”作为初学者。您是否希望他“以艰难的方式”学习所有内容,还是要给他剧透,直到他吃饱为止?

于 2010-01-22T01:29:30.187 回答