本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

learning入门:教电脑玩“抓住芝士”小游戏

时间:2017-08-20 23:05来源:报码现场 作者:118开奖 点击:
强化学习算法Q-learning入门:教电脑玩“抓住芝士”小游戏 2017-08-20 13:10 来源:量子位 游戏 原标题:强化学习算法Q-learning入门:教电脑玩“抓住芝士”小游戏 王瀚宸 编译自 practicalai

强化学习算法Q-learning入门:教电脑玩“抓住芝士”小游戏

2017-08-20 13:10 来源:量子位 游戏

原标题:强化学习算法Q-learning入门:教电脑玩“抓住芝士”小游戏

王瀚宸 编译自 practicalai.io

量子位 报道 | 公众号 QbitAI

这篇文章打算教你使用强化学习中的Q-learning算法,让电脑精通一个简单的游戏。文中代所用语言是Ruby。

为了展示算法内部的工作机制,我们将会教它去玩一个非常简单的一维游戏。当然这个算法也可以被应用于更复杂的游戏中。

游戏介绍

我们的游戏叫做“抓住芝士”,玩家P需要移动到芝士C那里(抓住它!),atv,同时不能落入陷阱O中。

每抓到一块芝士,玩家就会得一分,而每次落入陷阱,玩家就会减一分。当玩家得分达到5分或者-5分时游戏结束。下面的动画展示的是一个人类玩家玩游戏的过程。

请注意,为了简化这个游戏,所有的陷阱O和芝士C的位置都是不变的。你可以从这里找到关于游戏的Ruby源代以及相应Q-learning算法的实现过程:

https://github.com/daugaard/q-learning-simple-game

Q-learning算法

Q-learning是一种强化学习算法。强化学习是指受到行为心理学启发的一系列机器学习方法,它的前提是你可以通过励或惩罚行为来教会算法在之前经验的基础上采取特定的行动。这跟用食物励教会狗狗坐好是一个道理。

Q-learning算法通过在表格中记录游戏中所有可能的状态,和这些状态下玩家可能的行为来运作。对于每个游戏状态S和玩家行为A,表格中记录的数值Q代表着在S状态下采取行为A可能获得的奖励。这意味着为了能够得到最大奖励,在特定状态下,只需要依据表格采取拥有最大潜在奖励的行为。

现在我们来看一下上面描述的那个游戏。

根据玩家所处的位置,这个游戏一共有12种可能的状态(重申一下:陷阱和芝士的位置是不变的),在每个状态下玩家可以采取的行动就是向左或者向右。

Q值表格看起来像是下面这样,注意这只是我们这个问题下Q表格一种可能的形式,其中的数值可能跟实际有出入。

learning入门:教电脑玩“抓住芝士”小游戏

你可以从Q值表格中看出,当里在采取向左的行为、靠近陷阱时,玩家会得到负面的奖励;而向右走、靠近芝士时,玩家可能会得到正面的奖励。

Q值表格的初始化就是指将表格中所有的Q值随机赋值,这象征着在初始阶段AI对游戏没有任何了解。为了让它学会如何玩这个游戏,我们必须设计出一个能够根据经验不断更新Q值表格的算法。

我们采取的步骤如下:

第1步:初始化Q值表格,随机赋值

第2步:在游戏进行中反复执行以下操作:

2a)从0到1中生成一个随机数 — 如果数字大于阈值e,选择随机行为,否则就依据Q值表格选择当前状态下奖励最大的行动。

2b)采取2a中选择的行动

2c)在行动完成后得到奖励r

2d)结合下式和奖励r更新Q值表格

learning入门:教电脑玩“抓住芝士”小游戏

可以看出,更新Q值表格的过程中将会使用新得到的当前状态和行为的奖励信息,以及未来可能采取的行为的相关信息,但这不需要遍历未来所有的可能得到,只需Q表格就能完成。这使得Q-learning成为一个相当快速的学习算法,但同时也意味着算法一开始会采取一些随机的行为,所以在玩过几局游戏之前,不要对你的AI有任何指望。

搭建一个Q-learning AI player class

我们游戏通常使用human player class(人类玩家)作为玩家。human player class的搭建过程如下所示,class通过两个函数运行:构造器函数(constructor)和get_input函数。

get_input函数在游戏进行中的每一次迭代中都会被调用,然后依据键盘上的输入返回玩家行动的方向。

learning入门:教电脑玩“抓住芝士”小游戏

为了构造Q-learning AI player class,我们将会使用一个新的class,包括Q值表格和基于上述算法的get_input函数。

如下所示,我们定义了这个新class和它的构造器。注意这里我们新定义了一个attribute/特性: game。这被用来在Q-learning算法中记录游戏得分,从而更新Q值表格。

此外,在构造器中我们为每个在上述算法中列出的学习参量定义了attribute,然后初始化我们的随机数生成器。

learning入门:教电脑玩“抓住芝士”小游戏

下一步,我们将定义一个函数负责用随机数初始化Q值表格。状态的数量用游戏的map_size表示,每个状态即对应着一个玩家的位置。

learning入门:教电脑玩“抓住芝士”小游戏

最终,我们采用了如下所示的get_input函数。首先,停顿0.05秒,保证我们能够看清AI玩家移动的步骤。

随后我们将会检查这是否是程序第一次运行,直播,如果是的话就对Q值表格进行初始化。(步骤1)

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容