繁体   English   中英

嵌套列表作为状态和元组作为动作的 Q 表表示

[英]Q-table representation for nested lists as states and tuples as actions

当我的状态是列表而动作是元组时,如何创建 Q 表?

N = 3 的状态示例

[[1], [2], [3]]
[[1], [2, 3]]
[[1], [3, 2]]
[[2], [3, 1]]
[[1, 2, 3]]

这些状态的动作示例

[[1], [2], [3]] -> (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)
[[1], [2, 3]] -> (1, 2), (2, 0), (2, 1)
[[1], [3, 2]] -> (1, 3), (3, 0), (3, 1)
[[2], [3, 1]] -> (2, 3), (3, 0), (3, 2)
[[1, 2, 3]] -> (1, 0)

我想知道

# q_table = {state: {action: q_value}}

但我不认为,那是一个好的设计。

1. 你的状态真的应该是列表类型吗?

list是可变类型。 tuple是等效的不可变类型。 你在学习过程中改变你的状态吗? 我对此表示怀疑。

无论如何,如果您使用list ,则不能将其用作字典键(因为它是可变的)

2.否则这是一个很好的表现

在强化学习环境中,你会想要

  1. 获得 Q 的特定值
  2. 查看特定 state 中所有可能动作的 Q 值(找到最大 Q)

您的表示允许您以最小的复杂性完成这两项操作,而且非常清楚。 所以这是一个很好的代表。

使用嵌套字典实际上是自定义表格强化学习的合理设计选择——它被称为表格是有原因的:)

您可以使用 defaultdict 将 q-table 初始化为某个值,例如 0。

from collections import defaultdict

q = defaultdict(lambda: defaultdict(lambda: default_q_value))

或者没有 defaultdict:

q = {s: {a: default_q_value for a in actions} for s in states}

然后通过类似这样的方式获取最大值来执行更新很方便

best_next_state_val = max(q[s].values())
q[state][action] += alpha * (reward + gamma * best_next_state_val)

我要注意的一件事是,如果您使用这样的 q 表训练代理,如果所有操作的值都相等(例如初始化 qf 时),它每次都会选择相同的操作.

最后,如果您不想使用字典,您可以只使用 map state 和操作元组到索引,将映射存储在字典中,并在将状态/操作传递给环境实现时使用查找。 然后,您可以将它们用作 2d numpy 数组的索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM