Q学习计算中的大量状态
The huge amount of states in q-learning calculation
我通过Q学习实现了3x3 ox游戏(它在AI V.S AI和AI V.S Human中都可以很好地工作(,但是我不能再进一步迈向4x4 ox游戏,因为它会吃掉我所有的PC内存和崩溃。
这是我目前的问题:巨大数组中的访问违规?
在我的理解中,一个3x3 ox游戏总共有3个(空间,白色,黑色( ^ 9 = 19683可能的状态。(相同的模式不同的角度仍然计数(
对于4x4 ox游戏,总状态将为3 ^ 16 = 43,046,721
对于常规GO游戏,15x15板,总州为3 ^ 225〜2.5 x 10 ^ 107
Q1。我想知道我的计算是否正确。(对于4x4 ox游戏,我需要一个3^16数组?(
Q2。由于我需要计算每个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
- - -
如何获得所有需要的配置?
简而言之,这就是我要解决问题的方式:
- 为您的董事会定义
operator<
- 使用
<
关系,您可以为每组"类似"配置选择一个代表(例如,与集合中的所有其他配置相比,<
的配置( - 写一个给定配置的函数,返回您的代表配置
- Brute Force迭代所有可能的动作(只有可能的动作!,即仅在赢得比赛之前进行交替转弯(。在这样做的同时
- 计算您遇到的每种配置的代表
- 记住所有代表性配置(请注意,由于对称性而出现几次(
您现在有所有配置模型对称性的列表。在实际游戏中,您只需要将董事会转换为代表,然后采取行动。之后您可以转换回实际配置,如果您记得如何旋转/镜像。
这是相当蛮力的。我的数学有点生锈,否则我会尝试直接获取代表列表。但是,这是板的每个大小都只需要一次。
如果跳过了轮子,这是解决方案的方法这个问题:
该模型是一个卷积神经网络,经过训练 q学习,其输入是原始像素,其输出为值 估计未来奖励的功能。我们将方法应用于七个atari 街机学习环境中的2600场游戏,没有调整 架构或学习算法。
https://arxiv.org/pdf/1312.5602v1.pdf
我们可以用神经网络代表我们的Q功能 状态(四个游戏屏幕(和动作作为输入,并输出 相应的Q值。或者,我们只能拿游戏屏幕 作为输入和输出每个可能动作的Q值。这 方法有一个优势,如果我们想执行Q值 更新或以最高的Q值选择操作,我们只需要做一个 向前通过网络,并为所有操作提供所有Q值 立即可用。
https://neuro.cs.ut.ee/demystifying-deep-reinforcection-learning/
我有一个枚举方案,但是它需要一个整数。如果您可以将整数数组压缩为单个Q值(和后方(,则可能会起作用。
首先是n,板上的零件数。
然后是x片(n/2(项目的阵列,x件。每个数字都是从上一个X件(或板启动(中空的有效空间的计数。重要:如果空间导致游戏结束,则无效。这是第5条规则有助于我们减少域的地方。
然后是地板(n/2(物品的阵列,o块。与x数组相同的逻辑也适用。
因此,对于此板和3件规则:
XX.
X.O
..O
我们有以下数组:
n:5
x:0(从董事会开始(,0(从上一个x(,0(右上角是x的无效,因为它将结束游戏(
o:2(从董事会开始,减去所有之前的x(,2(来自以前的o(
那就是数组[5,0,0,0,2,2]。鉴于此数组,我们可以重新创建上面的董事会。少数的发生比大数字更有可能。在与19x19董事会的常规游戏中,这些作品大部分时间都会在大部分时间组合在一起,因此将有很多零,两者,两个,偶尔被划界下一行的"大"数字。
现在,您必须使用小数字比大型数字更多的事实来压缩此数组。通用压缩算法可能会有所帮助,但是一些专业的可能会有所帮助。
我对Q学习一无所知,但是这里所有这些都要求Q值可以具有可变的大小。如果您必须具有Q值的恒定尺寸,那么该尺寸必须考虑到最糟糕的板,而且大小可能是如此之大,以至于它首先会击败其枚举/压缩的目的。
我们使用从左到右和自上而下的方法来枚举碎片,但我们也可以使用一些螺旋方法,这些方法可能会产生更好的小数与数字比率。我们只需要为螺旋中心选择最佳起点即可。但这可能会使算法变得复杂,最后浪费了更多的CPU时间。
另外,我们真的不需要数组中的第一个数字。
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- std::future_error:无关联状态
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 如何避免LED在循环状态变化中闪烁?
- 神经网络不学习.卡在50%
- boost 是否有按特殊类型值编码状态"compact optional"?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- Q学习计算中的大量状态