OpenAI-gym如何在步骤()中为某个动作实现计时器

时间:2018-04-09 16:30:07

标签: python pygame openai-gym

我希望代理执行的操作之一需要在每个操作之间有延迟。对于上下文,在pygame中我有以下代码用于射击子弹:

if keys[pygame.K_SPACE]:
    current_time = pygame.time.get_ticks()
    # ready to fire when 600 ms have passed.
    if current_time - previous_time > 600:
        previous_time = current_time
        bullets.append([x + 25, y + 24])

我设置了一个计时器以防止子弹垃圾邮件,我如何构建它以使用step()方法?我的其他动作是向上,向下,向左,向右移动。

这是我第一次使用OpenAI-gym创建项目,所以我不确定该工具包的功能是什么,任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

您可以使用您喜欢的任何跟踪时间方法(我认为除pygame.time.get_ticks()之外),并使用与pygame代码类似的方法。您希望将previous_time存储为环境的成员而不仅仅是本地变量,因为您希望它在函数调用之间保持不变。

实际上阻止你的强化学习代理(假设你正在使用健身房为RL)完全选择火力行动并不容易,但你可以简单地实现step()功能如果他们过快地选择火力行动,则代理人根本不做任何事情。

至于测量时间,您可以测量挂钟时间,但是CPU的功率将影响您的代理被允许拍摄的频率(它可能能够在非常旧的硬件上每一步都射出新的子弹,但只允许在强大的硬件上每100步射击一颗子弹),这可能是一个坏主意。相反,我建议测量"时间"只需计算step()次来电即可。例如,仅使用上述问题中的代码,step()函数可能如下所示:

def step(action):
    self.step_counter += 1

    # other step() code here

    if action == FIRE:
        if self.step_counter - self.previous_time > 10:    # or any other number
            self.previous_time = self.step_counter
            bullets.append([x + 25, y + 24])

    # other step() code here

请勿忘记您还要在reset()中重置新添加的成员变量:

def reset():
    self.step_counter = 0
    self.previous_time = -100   # some negative number such that your agent can fire at start
    # other reset() code here