c++ - q-learning 计算中的大量状态
问题描述
我通过 q-learning 实现了一个 3x3 OX 游戏(它在 AI vs AI 和 AI vs Human 中完美运行),但我无法更进一步地玩 4x4 OX 游戏,因为它会占用我所有的 PC 内存并崩溃。
这是我当前的问题: 巨大数组中的访问冲突?
据我了解,一个 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值(对于每个状态,每个动作),我需要这么多的数组,是预期的吗?有什么办法可以避免吗?
解决方案
考虑对称性。实际可能的配置数量远小于 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<
为您的董事会定义一个- 使用该
<
关系,您可以为每组“相似”配置选择一个代表(例如,<
比集合中所有其他配置的代表) - 编写一个函数,为给定的配置返回代表配置
- 蛮力迭代所有可能的动作(只有可能的动作!,即只让玩家交替轮流直到游戏获胜)。这样做的时候你
- 计算您遇到的每种配置的代表
- 记住所有有代表性的配置(注意它们出现了好几次,因为对称)
您现在拥有所有配置模对称的列表。在实际游戏中,您只需将棋盘转换为其代表,然后移动即可。如果您记得如何将其旋转/镜像回来,您可以在之后转换回实际配置。
这是相当蛮力的。我的数学有点生疏,否则我会尝试直接获取代表名单。但是,对于每种尺寸的电路板,您只需要做一次。
推荐阅读
- python - Python + Gtk + WebKit:页面更改后滚动条高度未重置
- node.js - 如何识别没有用于使用 Puppeteer 进行测试的类的输入?
- ios - 设置默认缓存策略 apollo swift
- dart - 如何根据两个值对列表进行排序
- python - 用十进制小时数插入 pandas 数据框列
- java - Android Studio 错误:“仅从 Android O 开始支持调用自定义”
- amazon-web-services - 当使用 Async / Await 从 DynamoDB 检索数据时,Lambda 函数未调用 Https.request 函数
- angular - 过滤订阅多个输出(推送到几个数组)
- highcharts - Highcharts 7.1.1版如何使用amd模块离线导出PDF
- c# - SecureString 的替代品?