如何在keras-rl / OpenAI GYM中实现自定义环境?

12

我是一个完全的强化学习新手,一直在寻找一个框架/模块来轻松地探索这个危险的领域。在我的搜索中,我发现了两个模块keras-rl和OpenAI GYM。

我可以让它们在它们在WIKI上分享的示例上工作,但它们都带有预定义的环境,并且几乎没有关于如何设置自己的自定义环境的信息。

如果有人能指点我如何设置非游戏环境的教程或者解释一下,我将不胜感激。

1个回答

22

我已经花了一些时间在这些库上,并且可以分享一些我的实验。

让我们先以文本环境作为自定义环境的例子,https://github.com/openai/gym/blob/master/gym/envs/toy_text/hotter_colder.py

对于自定义环境,需要定义以下几个方面:

  1. 构造函数__init__方法
  2. 动作空间
  3. 观察空间(有关所有可用gym空间的信息,请参见https://github.com/openai/gym/tree/master/gym/spaces (它是一种数据结构))
  4. _seed方法(我不确定这是否是必需的)
  5. _step方法,接受行动作为参数并返回观测状态、奖励(转换到新的观测状态的奖励)、完成标志(布尔标志)和一些可选的附加信息。
  6. _reset方法,实现新一轮的逻辑。

可选地,您可以创建一个 _render 方法,如下所示:

 def _render(self, mode='human', **kwargs):
        outfile = StringIO() if mode == 'ansi' else sys.stdout
        outfile.write('State: ' + repr(self.state) + ' Action: ' + repr(self.action_taken) + '\n')
        return outfile

另外,为了更好的代码灵活性,您可以在_get_reward方法中定义奖励逻辑,并在_take_action方法中更改执行操作后的观察空间。


2
_seed方法不是必须的。如果没有实现,自定义环境将从gym.Env继承_seed。同样,似乎也可以选择性地实现_render,尽管一个(或至少我)仍然需要包括一个类变量“metadata”,它是一个字典,其单个键 - “render.modes”具有值,该值是可允许的渲染模式列表。如果您不实现_render,则正确的值似乎是['human']。 - user1245262
@Andriy Lazorenko 您能详细说明一下吗?我需要训练一个强化学习代理来学习如何在办公室内引导人类。在这里,作为状态表示,我想采样视觉信息(真实视觉)。但是我该如何创建一个环境呢? - Shamane Siriwardhana
在OpenAI Gym中,是否可以为现有环境添加自定义奖励? - Anakin
@Anakin 或许这个链接会有所帮助:https://dev59.com/dlcO5IYBdhLWcg3w7lgm - Andriy Lazorenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接