在 for 循环中访问接下来的 k 个元素

Access the next k elements in a for loop

我有一个强化学习游戏,其中两个代理相互交互。我现在想解决 Python.

中的以下问题

我创建了一个 for-loop 做这样的事情:

self.rewards_hist = []
self.number_episodes = 1000

def Game(self):
 
   for episode in range(self.number_episodes):

       doSomething()

       rewards = self.save_rewards()

       self.rewards_hist.append(rewards)

因此,使用 self.rewards 我在时间 t 获得奖励,在 self.rewards_hist 我收到所有奖励的历史记录,因此我可以访问之前的奖励。

现在我想将此奖励与 t + k 中的奖励进行比较,即我必须在迭代中等待 k 集,直到我可以将当​​前奖励与即将到来的奖励进行比较。我知道在 for-loop 中这不起作用,因为无法在当前迭代中访问下一个奖励。因此,我需要一个函数,让我可以等待下一个 k 奖励,然后才进行比较。

解决这个问题最简单的方法是什么?

您可以为此使用一个实际的计数器:

counter = 0
for episode in range(self.number_episodes):
    doSomething()
    counter += 1
    if counter == k:
        counter = 0
        rewards = self.save_rewards()
        self.rewards_hist.append(rewards)

或嵌套循环:

for episode_batch in range(0, self.number_episodes-k+1, k):
    for episode in range(episode_batch, episode_batch+k):
        doSomething()
    rewards = self.save_rewards()
    self.rewards_hist.append(rewards)

您已经拥有一个等待下 k 个奖励的函数:这​​是您提供的函数。再迭代 k 步后,您可以将最新结果 (t+k) 与之前的结果 (t) 进行比较。之前没有。让我们重写你的最后一段:

“现在我想将这个奖励(在时间 t)与 之前在 t - k 的奖励进行比较,即我必须回顾迭代中的 k 集并进行比较当前奖励与之前的奖励。由于我在计算每个元素时一直在存储它,因此这只需要访问元素 self.rewards_hist[-k]。因此我已经拥有了我需要的所有信息。“

当然,迭代器看不到它尚未计算的元素,这是事实。怎么可能是其他方式呢?唯一的解决方案是计算这些元素,然后将它们与过去计算的结果进行比较。您可以以任何您想要的形式向最终用户展示这些信息;你可以写一个 print 语句,将 element[t] 打印在与 element[t+k] 相同的行上。在 print 语句触发的那一刻,您的迭代器已经在第 t+k 步。但最终用户并不知道这一点。