q学习计算中的大量状态

时间:2019-05-21 08:46:55

标签: c++ machine-learning reinforcement-learning

我通过q-learning实现了一个3x3 OX游戏(它在AI vs AI和AI vs Human上都可以完美运行),但是我无法进一步发展4x4 OX游戏,因为它将耗尽我所有的PC内存并崩溃。

这是我当前的问题: Access violation in huge array?

据我了解,一个3x3 OX游戏共有3(空格,白色,黑色)^ 9 = 19683个可能的状态。 (相同的图案不同的角度仍算在内)

对于4x4 OX游戏,总状态为3 ^ 16 = 43,046,721

对于15x15的常规围棋游戏,总状态为3 ^ 225〜2.5 x 10 ^ 107

Q1。我想知道我的计算是否正确。 (对于4x4 OX游戏,我需要3 ^ 16数组吗?)

Q2。由于我需要计算每个Q值(针对每个状态,每个动作),因此我需要大量的数组,这是预期的吗?有什么办法避免呢?

3 个答案:

答案 0 :(得分:3)

考虑对称性。实际可能的配置数量比3x3板上的9 ^ 3小得多。例如,基本上只有3种不同的配置,并且板上只有一个x

轮换

有许多电路板配置都应该导致AI做出相同的决定,因为它们在对称性上是相同的。例如:

x - -    - - x    - - -    - - -  
- - -    - - -    - - -    - - - 
- - -    - - -    - - x    x - - 

这些都是相同的配置。如果单独对待它们,则会浪费训练时间。

镜像

不仅具有旋转对称性,而且还可以在不更改实际情况的情况下对板进行镜像。以下基本上是相同的:

0 - x    x - 0    - - -    - - -  
- - -    - - -    - - -    - - - 
- - -    - - -    0 - x    x - 0

排除“无法发生”配置

接下来,当一名玩家获胜时,游戏结束。例如,您有3 ^ 3个配置,看起来都像这样

x 0 ?
x 0 ?    // cannot happen
x 0 ?

它们永远不会出现在正常比赛中。您不必为它们保留空间,因为它们根本不可能发生。

排除更多“无法发生”

此外,由于玩家轮流交替使用9^3,因此您极大地高估了配置空间的大小。例如,您无法达到这样的配置:

x x -
x - -    // cannot happen
- - - 

如何获取所有必需的配置?

简而言之,这就是我要解决的问题的方式:

  • 为您的董事会定义一个operator<
  • 使用<关系,您可以为每组“相似”配置选择一个代表(例如,与该集合中的所有其他配置相比,<的代表)
  • 编写用于给定配置的函数,以返回代表性的配置
  • 蛮力会迭代所有可能的动作(只有可能的动作!,即仅在玩家获胜之前交替轮流玩家)。在这样做的时候
    • 为您遇到的每种配置计算代表值
    • 记住所有具有代表性的配置(请注意,由于对称,它们会出现几次)

现在,您将获得所有模对称配置的列表。在实际游戏中,您只需要将棋盘转换为其代表,然后进行移动即可。如果您记得如何旋转/镜像它,则可以在之后转换回实际配置。

这是蛮力的。我的数学有点生疏,否则我将尝试直接获取代表名单。但是,对于每种尺寸的木板,您只需要做一次。

答案 1 :(得分:1)

如果您不打算重新发明轮子,以下是解决此问题的方法:

  

模型是一个卷积神经网络,使用   Q学习,其输入为原始像素,其输出为一个值   估算未来回报的功能。我们将方法应用于七个雅达利   来自Arcade学习环境的2600场游戏,无需进行任何调整   体系结构或学习算法。

https://arxiv.org/pdf/1312.5602v1.pdf

  

我们可以用神经网络来表示我们的Q函数   状态(四个游戏画面)和动作作为输入并输出   相应的Q值。或者,我们只能拍摄游戏画面   作为输入并输出每个可能动作的Q值。这个   方法的优势在于,如果我们要执行Q值   更新或选择Q值最高的动作,我们只需要做一个   通过网络前进并具有所有动作的所有Q值   立即可用。

https://neuro.cs.ut.ee/demystifying-deep-reinforcement-learning/

答案 2 :(得分:0)

我有一个枚举方案,但是它需要一个整数数组。如果您可以将整数数组压缩为单个Q值(然后再压缩),则可能会起作用。

首先出现N,表示棋盘上的棋子数。

然后是ceil(N / 2)个项的数组,X个。每个数字都是从上一个X片段(或板开始)开始的空白有效空间的数量。重要说明:如果空格将导致游戏结束,则该空格无效。这是连续5个结束规则可以帮助我们缩小域的范围。

然后是落地(N / 2)个项目的数组,O个。逻辑与X数组相同。

因此,对于该板和3条规则:

XX.
X.O
..O

我们有以下数组:

N:5
X:0(从棋盘开始),0(从先前的X开始),0(对X无效,因为X会结束游戏)
O:2(从木板开始,减去前面的所有X),2(从先前的O开始)

就是数组[5,0,0,0,2,2]。给定这个数组,我们可以重新创建上面的板。小数字的发生比大数字的可能性更大。在具有19x19棋盘的常规游戏中,棋子大部分会组合在一起,因此,下一行将有很多零,一,二,并带有偶然的“大”数字定界。

您现在必须使用较小的数字比较大的数字出现更多的事实来压缩此数组。通用压缩算法可能会有所帮助,但有些specialized可能会有所帮助。

我对q学习一无所知,但是这里所有这些都要求q值可以具有可变大小。如果必须将q值的大小保持不变,则该大小必须考虑最坏的情况,并且该大小可能太大,以至于无法实现首先进行枚举/压缩的目的。

我们使用从左到右和从上到下的方法来枚举片段,但是我们也可以使用一些螺旋方法来产生更好的小到大数字比率。我们只需要为螺旋中心选择最佳起点。但这可能会使算法复杂化,并最终浪费更多的CPU时间。

此外,我们实际上并不需要数组中的第一个数字N。数组的长度提供了此信息。