C++ q-学习计算中的大量状态

C++ q-学习计算中的大量状态,c++,machine-learning,reinforcement-learning,C++,Machine Learning,Reinforcement Learning,我通过q-learning实现了一个3x3 OX游戏,它在AI v.s AI和AI v.s Human中运行得非常好,但我不能更进一步到4x4 OX游戏,因为它会消耗我所有的PC内存并崩溃 这是我目前的问题: 据我所知,一个3x3的公牛游戏总共有3个空格,白色,黑色^9=19683个可能的状态。相同的图案不同的角度仍然计数 对于4x4公牛游戏,总状态为3^16=43046721 对于常规围棋游戏,15x15棋盘,总状态为3^225~2.5 x 10^107 问题1。我想知道我的计算是否正确。对

我通过q-learning实现了一个3x3 OX游戏,它在AI v.s AI和AI v.s Human中运行得非常好,但我不能更进一步到4x4 OX游戏,因为它会消耗我所有的PC内存并崩溃

这是我目前的问题:

据我所知,一个3x3的公牛游戏总共有3个空格,白色,黑色^9=19683个可能的状态。相同的图案不同的角度仍然计数

对于4x4公牛游戏,总状态为3^16=43046721

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

问题1。我想知道我的计算是否正确。对于4x4公牛游戏,我需要一个3^16阵列


问题2。因为我需要为每个状态、每个动作计算每个Q值,所以我需要这么多的数组,这是预期的吗?有什么办法可以避免吗?

考虑对称性。实际可能的配置数量远小于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
- - - 
如何获得所有需要的配置

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


定义一个运算符我有一个枚举方案,但它需要一个整数数组。如果您可以将整数数组压缩为单个Q值,那么这可能会起作用

首先是N,棋盘上的棋子数

然后是ceilN/2项目的数组,X个项目。每个数字都是从上一个X件或电路板开始的空有效空格数。重要提示:如果空格会导致游戏结束,则空格无效。这就是行结束规则中的5帮助我们减少域

然后是floorN/2项的数组,即O件。适用于X阵列的逻辑相同

因此,对于这个棋盘和3件规则:

XX.
X.O
..O
我们有以下阵列:

N:5 从棋盘开始0,从上一个X开始0,右上角0对X无效,因为它将结束游戏 O:2从板开始,减去所有之前的X,2从之前的O开始

这就是数组[5,0,0,0,2,2]。有了这个阵列,我们可以重新创建上面的电路板。小数字比大数字发生的可能性更大。在使用19x19板的常规游戏中,大部分棋子将组合在一起,因此将有大量的0、1、2,并在下一行用偶尔的大数字分隔

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

我对q-learning一无所知,但所有这些都要求q-value可以有可变的大小。如果必须为q值设置常量大小,那么该大小必须考虑到最差的电路板,并且该大小可能太大,以至于首先无法实现此枚举/压缩

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


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

如果您跳过重新发明轮子,下面是解决此问题的方法:

该模型是一个卷积神经网络,使用 Q-学习,其输入为原始像素,输出为值 函数估计未来的奖励。我们将我们的方法应用于七个Atari 从街机学习环境中学习2600个游戏,无需调整 架构或学习算法

我们可以用神经网络来表示我们的Q函数,这需要 状态四个游戏屏幕和动作作为输入和输出 相应的Q值。或者,我们可以只使用游戏屏幕 每个可能动作的Q值作为输入和输出 离子。这 这种方法的优点是,如果我们想要执行一个Q值 更新或选择具有最高Q值的操作,我们只需执行一个 向前通过网络,并具有所有操作的所有Q值 立即可用


@也许你应该从这些评论中做出正确的回答;4x4实际上是3^16,而不是4^16。给定足够大的电路板,您最终将达到任何预定义的限制。你的目标板是什么?希望不是19x19。首先,需要解决4x4阵列大小问题,目标是15x15或19x19。我有一个工作站资源XEON cpu+64GB,但似乎仍然很难解决这种问题。然后我们已经远远超过了整数大小。为了减少N=9的编号,它给出了6045,而不是6046,但对于电路板N=19,它给出了最大值894*10^168的数字,大约568位。