簡體   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