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

简介:
本文来自AI新媒体量子位(QbitAI)

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

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

游戏介绍

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

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

8dfd2df79281e43041cf85109ef2503349767e40

请注意,为了简化这个游戏,所有的陷阱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表格一种可能的形式,其中的数值可能跟实际有出入。

e5e0450b76910f669aa581e1be4c72ea83161d5e

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

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

我们采取的步骤如下:

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

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

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

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

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

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

10207b2380ad0f6e0e58e06dd1ffb48c93683a98

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

搭建一个Q-learning AI player class

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

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

446f348d3ea2e973e1bdc48f4fa8add00fdbd18b

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

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

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

64a1bd865bfffff61787bb48a770d16357f5a10c

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

7fecba9e8931a3c8a329e81ffb08eafd193b94e2

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

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

如果不是第一次运行,那么我们就对游戏进行评估,因为从上一次游戏的结果中就能得到Q-learning算法所需要的输入——奖励r。如果游戏的得分增加了,那么得到的奖励为1;如果得分减少了,得到的奖励为-1;得分不变奖励为0.(步骤2c)

接着我们把结果状态设置为游戏的当前状态(在我们的例子中即为移动玩家),然后使用下式更新我们的Q值表格。(步骤2d)

909df39242e4b966d173c77147bf3ce60ad1cb9d

bb959581fa6d4851b1c9b92f1bfad9d519fb9f70

在上述最后一步更新过Q值表格后,我们为下一次运行保留之前的分数和状态。

然后我们依据阈值e,从随机或者基于Q值表格选择出一个行为(步骤2a),函数返回这个行为(步骤2b)。

13ea6d751cf6403568a1498d00f1422dd8ba8d80

这就完成了我们Q-learning算法的实现,你可以从上文中的github地址里看到有关算法和游戏的所有源码。

算法的运行

我们让Q-learning玩家进行了10次游戏,结果如下:

7ebc99e22d236cbcb25431b1aad4085bfa896f49

你可以看出在第1次游戏中,玩家还在不断尝试,包括漫无目的地左右移动。这是由于Q值表格的随机初始化导致的。然而当玩家得到一些分数、落入一些陷阱后,它很快就学会了如何避免陷阱,径直走向芝士。

在第7次和第8次游戏运行中,玩家事实上采取了最优的获胜方案,在37步移动中得到了5次芝士。

然后在第9次和第10次游戏中,获胜经历的总步数又变成了39步。这是由阈值e影响的,它的存在会使得算法有时候会采取随机移动,而不是采用优化的移动。这种随机性的设置会非常有必要的,它能够保证算法能够正确地探索整个游戏,而不被局域最优值卡住。

接下来…

这篇推送展示了如何将使用Q-learning来教会AI去玩“抓住芝士”这个简单的游戏。你可以想象,随着游戏复杂的提升,Q制表格的大小将会呈现爆炸式增长。一种避免这种情况发生的方法就是把Q值表格替换为一个神经网络。

DeepMind的研究者们探索了这种方法,发表了相关的论文。这这篇文章中,他们成功使用了神经网络通过Q-learning来训练AI去玩Atari出品的2600种游戏。

论文:
Playing Atari with Deep Reinforcement Learning
地址:
https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf

本文作者:王瀚宸
原文发布时间:2017-08-20
相关文章
|
2月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
164 10
|
2月前
|
存储 监控 算法
局域网监控其他电脑的设备信息管理 Node.js 跳表算法
跳表通过分层索引实现O(logn)的高效查询、插入与删除,适配局域网监控中设备动态接入、IP映射及范围筛选等需求,相比传统结构更高效稳定,适用于Node.js环境下的实时设备管理。
111 9
|
2月前
|
存储 算法 安全
控制局域网电脑上网的 PHP 哈希表 IP 黑名单过滤算法
本文设计基于哈希表的IP黑名单过滤算法,利用O(1)快速查找特性,实现局域网电脑上网的高效管控。通过PHP关联数组构建黑名单,支持实时拦截、动态增删与自动过期清理,适用于50-500台终端场景,显著降低网络延迟,提升管控灵活性与响应速度。
87 8
|
2月前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
2月前
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
123 5
|
2月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
133 1
|
2月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
2月前
|
存储 算法 编译器
算法入门:剑指offer改编题目:查找总价格为目标值的两个商品
给定递增数组和目标值target,找出两数之和等于target的两个数字。利用双指针法,left从头、right从尾向中间逼近,根据和与target的大小关系调整指针,时间复杂度O(n),空间复杂度O(1)。找不到时返回{-1,-1}。
|
3月前
|
机器学习/深度学习 供应链 算法
基于Q-learning算法在能源市场中实现效益最大化研究(Matlab代码实现)
基于Q-learning算法在能源市场中实现效益最大化研究(Matlab代码实现)
102 1
|
3月前
|
机器学习/深度学习 存储 算法
基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning 算法研究(Matlab代码实现)
基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning 算法研究(Matlab代码实现)

热门文章

最新文章