首页 > 解决方案 > 从列表中获取具有约束的多个非重复随机连续元素组

问题描述

我目前正在使用帧堆栈进行重播缓冲区以进行强化学习。

所以我有一个名为缓冲区的列表,它存储 100,000个元组的唯一元素。每个元组具有完全相同的结构,如下所示:

(s, a, r, s_, done)

这使得缓冲区如下所示

buffer = [(s1, a1, r1, s_1, done1), (s2, a2, r2, s_2, done2), (s3, a3, r3, s_3, done3)...]

请注意,元组中每个元素的类型不同,s并且s_是数组;a是 int 并且r是 float;done是布尔值。但是,我们可以假设不同元组中的每一个都具有相同的形状/长度/大小。

目标:-
检索(不从中删除buffer)n 个随机组(该组应在有序的可迭代对象中实现,如列表、元组、队列等)。
-每个组由来自 的 m 个连续元组组成buffer
-最重要的是,只有每组中的最后一个元组被允许(不是必须)已经完成==True。换句话说,每个组的前 m-1 个元组必须完成==假。- 每个元组在所有组的同一位置
上 应该是唯一的(不重复)(可以出现在其他组的其他位置,例如,元组 A 被检索为组 11 的第二个元组,它仍然可以作为第 29 组的第四个元组)

例如:
如果 n=3,m=2,让每个组都在一个列表中,我们可能有:

result = [[(s4462, a4462, r4462, s_4462, False), (s4463, a4463, r4463, s_4463, True)], [(s4461, a4461, r4461, s_4461, False), (s4462, a4462, r4462, s_4462, False)], [(s199, a199, r199, s_199, False), (s200, a200, r200, s_200, False)]]

注意 1如果 random 实现起来太困难/效率低下,它也可以是一种解决方法,以近似相似的概率检索每个连续的元组。
note2效率(速度)是第一要务,如果不得不牺牲一些其他的东西,比如代码可读性/代码长度,甚至是内存等资源,以达到更好的速度是可以的。

标签: pythonlistreinforcement-learning

解决方案


推荐阅读