3.2.5 自定义Gym强化学习环境
在某些情况下可能需要自定义强化学习环境,这时可以遵循Gym的类和函数接口规范来自定义强化学习环境,方便后续的算法调用。下面以一个具体的例子来介绍如何自定义Gym强化学习环境。
这里把3.1.3节中介绍的井字棋作为自定义Gym强化学习环境的具体例子,这个例子放在本书的代码Ex_3_7文件夹中。首先明确一下自定义Gym强化学习环境的工程文件。代码3.4中列举了自定义Gym强化学习环境中需要的一些文件和目录,下面简单介绍这些文件的具体意义。首先是README.md,这是一个Markdown格式的说明文件,主要用来描述强化学习环境的一些特性,包括强化学习环境具体的任务、观测值、智能体的状态、奖励相关的信息等。另外,可能还包含强化学习环境如何安装的信息(比如如何安装强化学习环境有的外部依赖库等)。总之,所有关于自定义的强化学习环境的说明信息都应该放在这个文件里。
接下来是setup.py,这是一个Python安装文件,包含当前强化学习环境的所有安装信息,具体如代码3.5所示。实际上只需要用到Python自带的setuptools库里面的setup函数。在这个函数里,需要传入强化学习环境的名字、版本,以及安装包的相关信息,并且定义当前包的依赖,即Gym强化学习环境。
代码3.5 自定义Gym强化学习环境的文件目录。
然后是gym_tictactoe目录下的__init__.py文件,在这个文件中,我们会把当前自定义的强化学习环境注册到Gym强化学习环境集合中,这样就能使用Gym相关的函数接口来调用这个强化学习环境。具体示例如代码3.6所示,从这个代码中可以看到,需要定义当前强化学习的id,这里设置为'tictactore-v0',而且需要指定代码的具体入口,也就是强化学习环境中相关类的实现。根据Python的PEP-328里面的规则,以gym_tictactoe目录为根目录,从这个目录出发,可以得到具体实现的文件应该在gym_tictactoe.envs路径下,而且当前强化学习环境代码的类名应该为TicTacToe。有了对应的强化学习id和具体的实现,就能通过前面类似的代码来调用这个自定义的强化学习环境,具体可以参考本书附赠的文件ex_3_8.py。
代码3.6 自定义Gym强化学习环境中setup.py代码示例。
有了前面文件的铺垫,接下来就是具体的强化学习类的实现。我们把主要的实现放在代码3.7中,细心的读者观察可以发现,这段代码其实和代码3.3大同小异,只是这里为了适配Gym的相应接口做了一定的修改,更加具体的细节可以查看Ex_3_7中的相关代码。
代码3.7 自定义Gym强化学习环境的注册代码示例。
从代码3.7中可以看到,实际的强化学习环境实现需要几个方法,__init__方法用于初始化环境的一些内置属性,比如action_space和observation_space,这两个变量在前面已介绍过,这里不再赘述;reset方法用于重置强化学习环境,把环境的状态和一些变量置于初始的状态;step方法通过输入一个动作来执行一个决策,并且改变对应的环境状态,同时获取对应的奖励;render方法则负责渲染这个环境,让这个环境的描述能被人们理解。如果读者需要自定义一个强化学习环境,只需要考虑这四个方法如何实现(当然实现过程中可能需要一系列复杂的中间函数),即可完成强化学习的定义。
在定义了这个强化学习环境之后,可以在setup.py所在的目录下运行这个命令:python setup.py install,这样就能在gym环境中安装强化学习环境,具体的使用方法和前面其他的Gym环境类似,有兴趣的读者可以参考ex_3_8.py了解如何使用这个自定义的强化学习环境。
代码3.8 自定义Gym强化学习环境类的实现。