它是一个有限 MDP,其状态表示为 6 维整数向量。状态向量的每个索引中的离散值的数量从 24 到 90 不等。
动作空间因州而异,在某些州多达 300 个可能的动作,而在某些州则低于 15 个可能的动作。
结合起来,这可能是超过十亿个状态/动作组合。运行表格方法可能太多了。动态动作,根据状态改变不是问题,但这样的表的总大小可能会。
如果我可以做出一些假设(仅出于测试模型的目的),我可以将状态减少到大约 400 个,将动作减少到少于 200 个。
对于创建表来说,这是一个更容易处理的数字。您的记录总数最多为 80,000 条。
有几件事值得更详细地研究:
需要的训练样本数
使用表格方法以及构建表格时,您需要为每个可能的状态/动作组合收集数据。如果环境中存在一些随机性,那么您需要从每个可能的状态/动作组合中多次收集数据。对于大小为 80,000 的表,如果您对环境进行了快速模拟,这可能会非常快速且容易。但是,如果您只能从单个真实环境中收集信息并且时间步长代表一天,那么它可能仍然不是一个可行的大小。. .
您需要检查自己的号码以确定这是否是一个问题。
如果您有一台速度很快的计算机和大量内存来存储表格,那么您的完整描述可能甚至超过十亿个项目都不是问题。
处理表中的参差不齐的数据
你不必这样做。如果您有足够的内存备用并且想要采取简单的方法,您可以只使用张量描述(即允许每个维度中的所有值,并将它们从 0 枚举到任何大小)。请参阅下一节,了解如何限制操作选择。
但是,对参差不齐的数据做一些事情可能更有效。
最简单的方法是为每个允许的状态向量生成一个唯一的 ID,并使用它来引用嵌套散列结构中的值,例如s的 Python dict。dict
一个非常简单的 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 表时使用该列表:
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) }