0 摘要
近年来,游戏 2048 获得了巨大的人气 [6]。游戏允许玩家移动屏幕上的数字(2 的幂,例如 2、4、8、16 等),总和至少为 2048。因为它只有 4 个动作,所以很容易上手: 上、下、左、右。但是,很难获得大于或等于 2048 的数字,因为您在当前状态下所做的每个操作都会导致数百个不可预知的结果。在本文中,我们提出了一种用于 AlphaGo Zero 和 2048 游戏的类似算法,具有独特的奖励和惩罚系统,以提高人工智能 (AI) 的自学速度并为 AI的自动播放模式获得更高的分数。此外,基于具有 Alpha-Beta 修剪的 Minimax 算法、Expectiminimax 算法和蒙特卡洛树搜索 (MCTS) 的结果,我们得出结论,蒙特卡洛树搜索在应用于 2048 游戏时优于其他算法。最后,我们表明具有强化学习的人工智能 [9] 可以击败人类在 2048 年游戏中取得的最高分。
1 引言
AlphaGo [10] 是一个玩棋盘游戏 Go [12] 的计算机程序。而且,它是第一个击败职业人类围棋选手的计算机程序,也是第一个击败世界围棋冠军的程序。 AlphaGo 是由 Alphabet Inc. 在伦敦的 Google DeepMind 开发的。它有三个更强大的继任者,称为 AlphaGo Master、AlphaGo Zero 和 AlphaZero [12]。最早的版本 AlphaGo 需要成千上万的人类业余和专业游戏来学习和掌握围棋游戏,而 AlphaGo Zero 是第一个从完全随机的游戏开始,通过与自己玩围棋游戏来学习的版本。已经证明 AlphaGo Zero 比之前的版本 [11] 更好。自从 AlphaGo Zero 广受好评后,人们就开始尝试研究 AlphaGo Zero 的算法/方法,以便将其应用到其他游戏中。在本文中,我们将展示一个可以自动玩游戏 2048 并在合理的运行时间内最大化游戏分数的 AI。
Game 2048 是一款单人益智游戏。 Gabriele Cirulli 是一位意大利用户界面设计师和 Web 开发人员,他创建了这款游戏并于 2014 年 3 月发布了它 [13]。游戏 2048 很简单:给玩家一个 4 × 4 的棋盘,其中每个牌可能包含一个 2 的幂的数字。开始时,只有两个编号的牌,编号为 2 或 4。玩家控制并通过按箭头键更改棋盘,棋盘中的图块会根据玩家移动。例如,如果你按向上键,所有的图块都会向上。如果相邻单元格上的数字匹配,它们将合并;否则,它们将保持在原来的位置(见图 1)。此外,每次移动后,一个新的数字,2 或 4,将均匀地出现在一个空单元格上,配给可以设置。在本文中,我们将 2 和 4 之间的出现比率设置为 9:1。玩家的目标是在 4 × 4 网格上滑动编号的图块,以合并并创建一个编号为 2048 或更大的图块(参见图 1)。当没有空单元格且没有更多有效动作时,游戏结束。如果在游戏结束前棋盘上出现了编号为 2048 的棋子,则玩家获胜。
图 1:游戏 2048 中的移动示例。左图显示当前状态,右图显示“向上”移动后的下一个状态。 左边有两个 8。 向上移动瓷砖后,底部的 8 将向上移动并与上面相同的数字 8 合并,组合成一个 16。
我们认为以下三种方法是最流行和最有效的策略:带有 alpha-beta 剪枝的 Minimax 算法、Expectimax 算法和 Monte Carlo Tree Search (MCTS)。 然后我们根据我们在训练 AI 时为游戏设置的规则设置奖励和惩罚。 这样一来,2048就可以从单人益智游戏衍生到自动AI游戏,这意味着在整个自学过程中不再需要人机交互。 在没有来自人类专家的数据集的情况下训练人工智能对于开发具有超人技能的人工智能具有重要意义,因为专家数据通常很昂贵、不可靠或根本不可用。
论文主要分为三个部分:
- 两种奖惩制度
- 三种树搜索算法:
a) 带有 alpha-beta-pruning 的 Minimax 算法
b) Expectimax 算法
c) 蒙特卡洛树搜索 (MCTS) - 上述三种算法的结果比较。
2 两种奖惩制度
我们设置了两种奖惩系统:一种使用权重矩阵α,另一种使用权重矩阵β。 权重矩阵 α 是一个在右上角具有最高值且其值沿对角线递减的矩阵(见图 2)。 权重矩阵 β 看起来像一个贪食蛇形状,玩家沿着路径滑动图块并将它们合并到同一个右上角(参见图 3)。
Figure 2: Weight Matrix α
图 3:左:横向贪食蛇形状的权重矩阵 β; 右图:水平-垂直贪食蛇形状的权重矩阵 β
根据我们的实验,将具有接近值的图块放在一起通常会导致更多可能的合并。 显然,单次滑动可以合并两个相同编号的图块,同时按升序或降序管理不同的图块,这可以帮助图块以后连续合并。 从直觉上可以看出,将具有接近值的图块放置在彼此附近通常会导致更多可能的合并。 对于相同编号的图块,单次滑动即可合并; 对于不同编号的图块,按升序或降序排列是合理的,这样它们就可以连续合并。 因此,它似乎试图使用在一个角上具有最高权重并沿对角线递减的矩阵 α。
由于矩阵 α 并没有在很大程度上区分图块:两个图块的不同权重可能会因它们承载的数量差异而减弱,因此创建权重矩阵 β 以扩大权重范围。 权重矩阵 β 是贪食蛇形的(见图 3)。 启发式是我们期望沿着贪食蛇的滑动和合并将更大的数字放在角落里。 在尝试了具有各种权重值的对称和贪食蛇形权重矩阵后,我们发现贪食蛇形权重矩阵的性能最好。
3 三种树搜索算法
游戏2048可以被视为两人游戏,人类玩家与计算机对战。 轮到人类通过选择四个基本方向之一来移动棋盘:上、下、左或右; 然后,计算机扮演在其中一个空单元格中随机放置一个数字 2 或 4 的角色。 因此,Minimax 算法首先引起了我们的注意,因为它是一种在包含两个玩家的游戏中广泛使用的决策规则。
将 Minimax 算法应用于 2048 游戏时,计算机扮演对手角色,只需以 9:1 的概率比放置 2 或 4 的新图块。 首先,我们解释算法中的符号:
(1) players:agent,opponent 代理人,对手
(2) s: the grid board that reflects the current state 反映当前状态的网格板
(3) a: the action taken 采取的行动
(4) actions(s): possible actions at state s 状态 s 的可能动作
(5) result(s, a): resulting state if action a is chosen at state s 如果在状态 s 选择动作 a,则结果状态
(6) isEnd(s): whether s is an end state (the game is over) s是否为结束状态(游戏结束)
(7) eval(s): evaluation at state s 状态 s 的评估
(8) player(s) ∈ players: the player that controls state s 控制状态 s 的玩家
(9) totalScore(s): the score at the end of the game 比赛结束时的比分
(10) d: the current depth of the search tree 搜索树的当前深度
Minimax算法的数学公式如下:
玩家可以从每一轮中的四个动作中选择一个,即,动作a∈{上,下,左,右}。 动作a随机将2或4放入当前棋盘的空格子中。 当达到最大深度或导致游戏结束时,每轮评估函数将重新调整每个turn作为当前分数。
接下来,我们从上面的Mini-Max算法派生了Expectimax算法。 不同之处在于我们在代理节点和对手节点之间添加了机会节点。 因此,当我们将启发式和域知识添加到我们的评估功能时,当AI到达最后一个深度级别时,或者游戏结束时,算法的伪代码如下:
Expectimax算法具有一些缺点,例如要分析的移动次数快速增加深度,并且计算功率限制了算法可以走的深度。 因此,我们尝试了第三种方法:蒙特卡罗树搜索。 蒙特卡罗树搜索的基本思想是基于强盗(Bandit-based)的方法。 一名球员需要选择K个动作中的某个动作,并通过不断选择最佳移动来最大化累积奖励。 一旦玩家选择,此动作的真正奖励将取决于随后可能的移动。
蒙特卡罗树搜索算法列举了将游戏2048的状态S作为输入的神经网络作为输入,并输出移动概率和值(P,V)。 标量值V表示状态s的“善良”。 在AZG,v代表了从这个状态获胜的概率,但由于我们只有一个玩家,它也是使用当前网络的预期当前游戏结果和平均结果之间的比率。 这样,大于1的值为良好,低于1的值不是那么好(见图4 [1])。
Figure 4: MCTS
在每个状态下,执行 MCTS,并构建一棵树,根节点为初始状态 s0s_0s0。 对于树中的每个状态 sss,有四个边(s,a)(s, a)(s,a) 对应于可能的移动,每个边包含统计信息:
- (1) N(s,a)N(s, a)N(s,a) - number of times action has been taken from state s 从状态
s 采取行动的次数 - (2) W(s,a)W (s, a)W(s,a) - total value of move a from state s 从状态 s 移动
a 的总值 - (3) Q(s,a)Q(s, a)Q(s,a) - mean value of move a from state s 从状态 s 移动 a 的平均值
- (4) P(s,a)P(s, a)P(s,a) - prior probability of selection move a 选择移动a的先验概率
该算法迭代三个阶段(最初 1600 次):
- (1) 选择:每次迭代从 s0s_0s0 开始,并在模拟到达叶节点 sLs_LsL 时结束。 在每个时间 ttt,根据搜索树中的统计信息选择一个移动。
U(s,a)=P(s,a)∑bN(s,b)1+N(s,a)(1)U(s, a)=P(s, a) \frac{\sqrt{\sum_{b} N(s, b)}}{1+N(s, a)} \tag1U(s,a)=P(s,a)1+N(s,a)∑bN(s,b)(1)
此搜索控制策略最初更喜欢高概率和低访问计数的操作,但渐近地更喜欢具有高动作值的动作。
- (2) 扩展和评估:使用当前神经网络进行评估叶节点sLs_LsL 。 叶节点被扩展,每个边缘(sLs_LsL,aaa)初始化为N=0,W=0,Q=0,P=paN = 0,W = 0,Q = 0,P = paN=0,W=0,Q=0,P=pa。 然后备份值vvv。
-(3) 反向传播:边缘统计信息在反向传播中更新。
N(s,a)=N(s,a)+1,W(s,a)=W(s,a)+v,Q(s,a)=W(s,a)/N(s,a).N(s, a) = N(s, a) + 1, \\W (s, a) = W (s, a) +v, \\Q(s, a) = W (s, a)/N(s, a).N(s,a)=N(s,a)+1,W(s,a)=W(s,a)+v,Q(s,a)=W(s,a)/N(s,a).
一旦迭代完成,计算概率。 下一步移动只是最大选择。 在其训练阶段,AGZ按分布进行抽样。 我们使用了一个确定性的选择,因为2048游戏存在如此多的随机性。
我们注意到,更深入的深度导致搜索树的维度爆炸。 此外,整个树搜索算法探讨了树的一些不必要的部分。 因此,我们在所有三种树搜索算法中实现了Alpha-Beta修剪,以防止这些问题。Alpha-Beta修剪估计两个值:Alpha(增益的较低限制)和Beta(增益的上限)。 在任何情况下,在Beta小于Alpha的情况下,将修剪其余的子树。
在利用蛇形权重矩阵βββ的人启发式时,我们只考虑一些最重要的空图块,它们对它们具有更高的权重。 经过具有最小值(深度,空图块的数目,4)或(深度,空图块的数目,6)的几个图块后,这些界限通常更靠近在一起。 只要α和β的范围内存在一些重叠,这种会聚不是问题。 在评估节点时,我们可能会发现它已经移动了其中一个界限,使得α和β之间不再存在任何重叠。此时,我们知道此节点永远不会导致我们将考虑的解决方案路径,因此我们可能会停止处理此节点。 换句话说,我们停止生成其子节点,然后返回其父节点并完成这个子树修剪。
4 具有Alpha-Beta修剪的Minimax算法
2048游戏具有离散状态空间,其包含完美的信息。它也是棋盘和跳棋等转向的游戏。因此,我们可以使用alpha-beta修剪应用于Minimax Search,这已被证明在这种类型的游戏上工作。单调性启发式试图确保图块的值沿左/右和上/下方向呈增加或减小。这个启发式唯一表明了许多其他人提到的直觉,那么高价值的图块应该被聚集在一个角落里。它通常会阻止孤立的较小值图块,并将游戏板组织得非常好,较小的图块级联并填充较大的图块。独自启发式倾向于创建一个结构,其中相邻的图块的值下降。然而,为了合并,相邻的图块需要显然是相同的价值。因此,平滑性启发式只是测量相邻图块之间的值差异,以便最小化这一计数。最后,免费图块太少有惩罚,因为当游戏板变得过于狭窄时,选择可以快速耗尽。
表1说明了具有alpha-beta修剪的Minimax算法的结果。
4.1 Expectimax Optimization预期优化
AI需要10ms到200ms以执行移动,具体取决于游戏板位置的复杂性。 此期望算法有四种启发式方法:
- (1)为开放方块授予“奖金”
- (2)在边缘上有大值的授予“奖金”
- (3)在级别增加时对增加的非单调行和列进行惩罚,因为大量的非单调行大幅影响了得分。
- (4)除了打开空间之外,第二启发式计算潜在合并的数量(相邻的等值)。
通过远程控制运行100次后,预期算法的结果如表2所示。
基于表2中的结果,观察到深度2, 3和4的平均分数分别为11279,16766和59436,并且每个深度的实现最大得分为31924,33940和59436。 AI永远不会获得至少一次2048图块。 这场比赛花费了27830次移动,超过96分钟,平均每秒4.8次移动。 最初,存在两个启发式方法:为开放方块授予“奖金”,并且在边缘上具有大值。
4.2 Monte Carlo Tree Search蒙特卡洛树搜索
如果我们从随机初始化的神经网络开始,所实现的模拟器的分数在500到4000的范围内。这些分数类似于随机播放的结果。 训练进行了10个小时。 当我们在蒙特卡罗树中使用100种模拟时,总共进行66个训练周期。 所有16个模拟器组合的都能每秒执行大约7个移动。 在所有66个周期中,新的训练模型能够用旧的权重击败神经网络四次。 最好的得分为2638。
在Monte Carlo树中使用50模拟时,32个游戏模拟器能够每秒执行大约40个移动。 在10小时的游戏和训练期间,完成了334个训练周期,并且新版本的初始模型实现了一个更好的中位数得分两倍。
在开发和测试过程中,中性网络的参数大多保持不变,同时仅尝试不同的学习率和残留层的量。 其他参数,如网络所在的样本数量在每个训练周期上训练,也试图播放评估模型的游戏量以实现更好的结果。 遗憾的是,尝试的组合都无法在游戏玩法的10小时内从自行播放中改进模型,并且在训练过程中的结果与随机初始化网络所实现的结果类似。 蒙特卡罗树搜索的结果已显示在表3。