文章目录
前言
gym是许多强化学习框架都支持了一种常见RL环境规范,实现简单,需要重写的api很少也比较通用。
本文旨在给出一个简单的基于gym的自定义单智能体强化学习环境demo
一、Gym环境类
1.1 gym.Env类框架
首先给出一个gym环境类的基本框架,继承gym.Env类,所列出来的方法均为必须实现的方法。我们一个一个方法简单介绍,
import logging
import gym
import numpy as np
from gym.utils import seeding
import math
logger = logging.getLogger(__name__)
class TestEnv(gym.Env):
def __init__(self):
self.state = 0
def reset(self,seed, options,infos=False):
self.state =0
def step(self, action):
return state, reward, Done, Truncate,info
def render(self):
visual_demo()
1.2 初始化方法"__init__"
“init”方法是实例化对象时会自动执行的代码,在这里面可以定义好RL的观察空间(如果和状态空间不同的话可以加上状态空间)、动作空间、以及折扣因子等等参数,必须重写。比如:
def __init__(self):
# 基本设置
self.observation_space = gym.spaces.Box(low=0, high=1, shape=(2, 2), dtype=np.float32) # 连续状态空间 2X2
self.action_space = gym.spaces.Discrete(2) # 离散一维动作空间 0,1
# self.action_space = gym.spaces.MultiDiscrete([ 5, 2, 2 ]) # 多维离散动作空间, 第一维有5个动作、第二维有2个动作..
self.state = None # state for rl
self.gamma = 1 # 折扣因子
# self.setting = Setting() # 实例化RL问题对象,可以将具体场景的RL问题相关设置打包放在Setting中,gym环境类只从里面取出状态、输入动作获得奖励。这样的话场景设置与rl设置可以比较清楚地分开。(仅个人编程习惯)
gym.spaces类给出了很多空间可供选择,这里动作状态空间实现上并无区别,要在初始化方法里明显指定这两个空间。
1.3 重置方法reset()
reset()方法也是必须重写的方法,它在每次