[英]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}}
但我不認為,那是一個好的設計。
list
是可變類型。 tuple
是等效的不可變類型。 你在學習過程中改變你的狀態嗎? 我對此表示懷疑。
無論如何,如果您使用list
,則不能將其用作字典鍵(因為它是可變的)
在強化學習環境中,你會想要
您的表示允許您以最小的復雜性完成這兩項操作,而且非常清楚。 所以這是一個很好的代表。
使用嵌套字典實際上是自定義表格強化學習的合理設計選擇——它被稱為表格是有原因的:)
您可以使用 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.