OpenAI环境(健身房)应该如何使用env.seed(0)?

时间:2017-11-16 13:42:21

标签: random random-seed openai-gym

我创建了一个非常简单的OpenAI健身房(banana-gym)并想知道我是否应该如何实施env.seed(0)

例如,请参阅https://github.com/openai/gym/issues/250#issuecomment-234126816

2 个答案:

答案 0 :(得分:1)

env.seed()函数的文档字符串(可在this file中找到)提供了有关应该实现的函数的以下文档:

Sets the seed for this env's random number generator(s).

    Note:
        Some environments use multiple pseudorandom number generators.
        We want to capture all such seeds used in order to ensure that
        there aren't accidental correlations between multiple generators.
    Returns:
        list<bigint>: Returns the list of seeds used in this env's random
          number generators. The first value in the list should be the
          "main" seed, or the value which a reproducer should pass to
          'seed'. Often, the main seed equals the provided 'seed', but
          this won't be true if seed=None, for example.

请注意,与您链接到的问题中的文档和评论不同,它似乎(对我来说)env.seed()似乎被自定义环境覆盖。 env.seed()有一个非常简单的实现,它只调用并返回env._seed()的返回值,在我看来, 是应该被自定义覆盖的函数的环境中。

例如,OpenAI健身房atari environments有一个自定义_seed()实现,用于设置由基于(C++的)街机学习环境内部使用的种子。

由于您在your custom environment中进行了random.random()来电,因此您应该实施_seed()来致电random.seed()。这样,您的环境用户可以通过确保使用相同的参数在您的环境中调用seed()来重现实验。

注意:使用这样的全局随机种子进行混乱可能会出乎意料,但是当您的环境初始化时,创建一个专用的随机对象可能会更好,播种该对象,并确保如果您在该对象的环境中需要它们,请始终获取随机数。

答案 1 :(得分:0)

在最近的merge中,OpenAI健身房的开发人员将env.seed()的行为更改为不再调用方法env._seed()。相反,该方法现在只发出警告并返回。我想如果您想使用此方法来设置环境的种子,您应该立即覆盖它。