2017-10-18 66 views
0

我試圖做一個基於視覺的強化學習機器人爲井字遊戲,並堅持如何保存數據並快速檢索它。有效的方法來存儲數組,並檢查它們是否存在於Python

因此,將數據保存爲例如起始點列表爲[0, 0, 0, 0, 0, 0, 0, 0, 0],併爲該[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]啓動策略。

問題是: 在什麼格式,我應該保存當前的狀態和政策,所以我可以訪問它的快速檢查,如果狀態已經存在,並且更新的政策?我在考慮pandaspickle,但發現使用列表實現有點困難。

+0

你想保存什麼樣的數據?你想有效地拿出什麼?數據是否分類? – mrCarnivore

+0

您是否試圖專注於9個元素的列表的性能? – Adirio

+0

數據不會被排序,機器人截取遊戲截圖,將其轉換爲列表並將井字遊戲狀態存儲爲9長列表,但在機器人學習之後會有數千個狀態,並且隨着機器人更新它的策略,我必須檢索狀態是否存在,並且是否存在針對當前狀態的某種策略,否則:將數據附加新狀態和「零策略」。 –

回答

0

你需要什麼似乎哈希,哪些標準Python類setdictionary使用。但是,您需要存儲的對象list不可排列,因此不能直接在這些容器中使用。

散列表給出了O(1)訪問的複雜性,這是您需要定期檢查的。但是你需要散列的數據類型存在一些困難,在這裏你如何克服這一點。

1)您可以將列表轉換爲一個元組,然後在一組或字典存儲,如果你也想了一些值分配給該鍵。這需要將O(n)轉換爲元組。請注意,你不能修改一個元組,你應該完全替換它(這就是爲什麼它是可哈希的,而列表不是)。

all_states = set() 
state = tuple([0, 0, 0, 0, 0, 0, 0, 0, 0]) 
all_states.add(state) 

2-)如果你要堅持名單,我想製作一個包裝類,然後散列應該工作,無法保證這種方法是這樣做的建議Python的方式。

class State: 
    def __init__(self, contents): 
     self.contents = contents 

one_state = State([1, 2, 3]) 
hash(one_state) # Now it is hashable, just for checking. 
       # If you can add it to a set, it is hashable. 
all_states.add(state) 
+0

謝謝,這些州可以是元組,但是政策應該是可更新的,所以假設我使用您建議的第一種方式。不是很好的方式來做到這一點,但我可以採取元組策略,轉換爲列表更改並返回元組? –

+0

@MarkusMikkonen你不需要認爲改變一個元素直接改變它,取而代之的是可以更新,這是[這裏]描述(https://stackoverflow.com/questions/10465390/what-are-the集合的特定集合元素)。這意味着創建一個新的元組,這是一個工作負載,但是這是創建可更新哈希表的代價。 – Rockybilly

相關問題