深度强化学习算法与实践:基于PyTorch的实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2.1 Gym环境的安装和基本接口

OpenAI Gym环境本身基于的是一个通用的类,这个类包含了描述强化学习环境的一系列基本的要素,并且以类方法的形式(函数接口)供用户调用。Gym环境本身可以很容易通过运行pip install gym命令,或者通过执行以下三步命令行来安装:

● 首先运行git clone https://github.com/openai/gym。

● 然后运行cd gym命令。

● 最后运行pip install-e。

为了了解这个强化学习环境,首先要知道这个强化学习环境的一系列函数接口以及它们对应的功能。代码3.3是Gym强化学习环境的类的一个简单实例(为方便起见,我们并没有在里面填充具有实际意义的代码,后续会看到一个填充了代码的具体实例)。在该代码中可以看到一系列关键的方法。首先是__init__方法,该方法定义了环境的初始化参数,尤其是动作空间self.action_space和状态(观测)空间self.observation_space。前者定义的是智能体所有可能的动作集合,后者定义的是智能体所有可能的状态集合。

代码3.3 Gym强化学习环境示例。

一般来说,为了统一强化学习环境的相关函数接口,动作空间和状态空间变量都是空间类的实例。在OpenAI Gym中,有几类预先定义好的空间类,比如Box类包含一系列以区间范围形式来描述的空间类,这种类适合用于描述连续的动作空间或者状态空间,比如智能体的位置和速度;再如,Discrete类包含了一系列以离散变量来描述的空间类,这种类适合描述离散的动作或者状态空间,比如智能体在多个可能的动作中选择一个可能的动作。假如需要一个自定义的空间类,我们可以模仿代码3.3中ExampleSpace类的继承定义方法,继承OpenAI Gym中的Space类,并且实现这个类中的两个方法,其中第一个方法是sample方法,代表从该空间中进行一次采样,获得一个具体的动作或者状态,第二个方法是contains方法,输入一个动作或者状态,并且验证这个动作或者状态是否有效。

通过实现具体的空间类的代码,或者复用OpenAI Gym提供给我们的空间代码,我们可以很容易地给一个强化学习环境定义对应的动作空间和状态空间。一般来说,在__init__方法中还会定义当前强化学习环境中智能体所处的状态,并且重置智能体所处的状态。代码3.3中的reset方法是重置强化学习环境的方法,其中包含了重置智能体所处的状态和重置其他决定强化学习环境状态的一系列动态参数的代码。一般来说,重置的代码除了执行重置行为,还会返回强化学习环境的初始状态,我们用obs变量来代表这个返回的初始状态。

接下来就是强化学习算法的执行过程,在实际的强化学习算法的执行过程中,智能体可以根据强化学习环境的状态,通过决策过程来获取执行的具体动作,有了这个动作之后,需要使用step方法来执行这个动作。往这个算法中传入智能体的动作,这个方法会返回一个Python元组(Tuple),从代码3.3中可以看到这个元组具体有四个变量,obs代表强化学习环境的状态。reward对应智能体在执行动作后获取的奖励。done是一个布尔型变量,如果这个变量的值为True,则代表强化学习环境处于终止状态,继续往step方法里传入动作不再具有实际意义;如果这个变量的值为False,则代表智能体可以继续进行决策,根据当前环境的状态往step方法传入动作并获取对应的奖励。在算法运行的过程中需要时刻检验done变量,如果这个变量为True,就需要调用reset方法来重置强化学习环境。元组的第4个变量info代表强化学习环境的一些附加信息,一般情况下可以设置为空字典,如果有需要,则可以用这个变量记录一些强化学习环境相关的参数,方便算法和环境的相关调试。

最后,为了显示整个强化学习环境的状态,我们需要定义一个render方法,其目的是渲染出一幅图像(或者其他的表示,如终端上的字符表示)来显示当前的强化学习环境的状态。渲染这个函数的意义在于把强化学习环境显示为人类能够理解的形式。读者可以根据具体的强化学习环境自定义特定的显示方式,如用图形界面来表示或者直接返回一个RGB的图像数组等。