动态动作空间的 Q 表创建和更新

数据挖掘 q学习
2022-02-17 09:46:52

我正在尝试实现用于能量优化的 Q 学习算法。它是一个有限 MDP,其状态表示为 6 维整数向量。状态向量的每个索引中的离散值的数量从 24 到 90 不等。

动作空间因州而异,在某些州多达 300 个可能的动作,而在某些州则低于 15 个可能的动作。

如果我可以做出一些假设(仅出于测试模型的目的),我可以将状态减少到大约 400 个,将动作减少到少于 200 个。

如何为这样的环境构建 Q 表?我不知道如何在 Python 中解决这个问题,如何防止表格包含许多不可能的状态/动作组合,或者防止代理尝试采取那些不需要的动作。

1个回答

它是一个有限 MDP,其状态表示为 6 维整数向量。状态向量的每个索引中的离散值的数量从 24 到 90 不等。

动作空间因州而异,在某些州多达 300 个可能的动作,而在某些州则低于 15 个可能的动作。

结合起来,这可能是超过十亿个状态/动作组合。运行表格方法可能太多了。动态动作,根据状态改变不是问题,但这样的表的总大小可能会。

如果我可以做出一些假设(仅出于测试模型的目的),我可以将状态减少到大约 400 个,将动作减少到少于 200 个。

对于创建表来说,这是一个更容易处理的数字。您的记录总数最多为 80,000 条。

有几件事值得更详细地研究:

需要的训练样本数

使用表格方法以及构建表格时,您需要为每个可能的状态/动作组合收集数据。如果环境中存在一些随机性,那么您需要从每个可能的状态/动作组合中多次收集数据。对于大小为 80,000 的表,如果您对环境进行了快速模拟,这可能会非常快速且容易。但是,如果您只能从单个真实环境中收集信息并且时间步长代表一天,那么它可能仍然不是一个可行的大小。. .

您需要检查自己的号码以确定这是否是一个问题。

如果您有一台速度很快的计算机和大量内存来存储表格,那么您的完整描述可能甚至超过十亿个项目都不是问题。

处理表中的参差不齐的数据

你不必这样做。如果您有足够的内存备用并且想要采取简单的方法,您可以只使用张量描述(即允许每个维度中的所有值,并将它们从 0 枚举到任何大小)。请参阅下一节,了解如何限制操作选择。

但是,对参差不齐的数据做一些事情可能更有效。

最简单的方法是为每个允许的状态向量生成一个唯一的 ID,并使用它来引用嵌套散列结构中的值,例如s的 Python dictdict

一个非常简单的 ID 生成器是将您的状态向量和动作标签连接到一个列表中,然后使用某种连接函数将其转换为字符串。Python 中的示例:

# Empty Q table
q = dict()

# Define an example state, action and value
state = [20,12,56,9,76,30]
action = 176
value = -2.4

# Store an example state, action and value

# This state to state_id conversion should be a re-usable function
state_id = '/'.join([str(x) for x in state])
# Example state_id is '20/12/56/9/76/30'

if state_id in q:
  q[state_id][action] = value
else
  q[state_id] = {action: value}

使用这种方法管理 Q 表的最简单方法是在需要时添加条目。不要预先填充零,仅在您的代理需要时写入操作值。这意味着您只为存在的状态、操作对创建表条目。

过滤操作值

您将需要您认为是环境一部分的代码,该代码根据当前状态知道哪些操作是有效的。此代码可以返回所有可能操作的列表。例如,您可以定义一个函数allowed_actions(state)然后在使用 Q 表时使用该列表:

  • 在寻找最大化行动来推动政策时,查找整个行动字典以价值(在q[state_id]选择最大的一个

  • 当您达到以前从未见过的新状态时,使用零填充该状态中所有可能的操作可能会很方便。用于执行此操作的原型 Python 代码可能如下所示:

state_id = '/'.join([str(x) for x in state])
if not state_id in q:
  q[state_id] = { action: 0 for action in allowed_actions(state) }