2017-10-18 85 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

相关问题