在 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 步。但最终用户并不知道这一点。
我有一个强化学习游戏,其中两个代理相互交互。我现在想解决 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 步。但最终用户并不知道这一点。