强化学习框架

上图是强化学习的基本框架,由:Action, State, Reward, Environment, Agent组成。

本文主要关注的是Environment的搭建。常见的环境搭建方式是按照gym的搭建流程进行,

gym将环境抽象成一个类env, 自定义环境只需要继承该类,并实现对应的接口即可, 关注的主要方法:
-------------------------------------------------------------------------------
        __init__:初始化一些参数
-------------------------------------------------------------------------------
        step():
            Input:action
            Output:Observation, reward, done, info
            仿真器的物理引擎,设置智能体的运动学模型和动力学模型计算下一步的状态和立即回报
并判断是否达到终止状态
            环境的主要驱动函数,写程序的主逻辑;
            函数可按照时间轴,固定时间间隔调用;
-------------------------------------------------------------------------------
        reset():
        -> 针对于强化学习算法的尝试,每一次尝试称之为一条轨迹或episode,每次尝试都会达到终止状态,一次尝试结束,智能体都要从头开始
               将环境重置为初始状态,并返回一个初始状态;
               在环境中有随机性的时候,需要设置每次重置后保证与之前的环境相互独立
-------------------------------------------------------------------------------
        render():
        -> 图像引擎,这个可以没有,为了更直观,方便调试,一般都需要设置一下
                环境渲染,可视化,用于将环境用图形、数字的形式表现出来
                用于渲染的方式是根据爱好选择,如:opencv\opengl\matplotlib\pyglet
-------------------------------------------------------------------------------
        close():释放环境数据,关闭图形界面
-------------------------------------------------------------------------------
        seed():设置环境的随机生成器
-------------------------------------------------------------------------------

 以及一些属性:
        action_space: 
        observation_space:   
        reward_range:agent执行一个action后,env基于agent一定的奖励值
        spec:包含用于从‘gym.make’初始化环境的信息的环境规范
        metadata:环境的元数据--> 渲染模式
        np_random:环境随机数生成器
    Note: gym默认设置了reward range:(-\infty, +\infty),必要时需要更改

环境创建格式示例:

class Env(object):
    def __init__(self, x):
        self.x =x
    def step(self, action: ActType): --> Tuple[ObsType, float, bool, dict]:
        """
            Input:action --> 由agent提供
            return:
                observation(object):agent对env进行观察
                reward(float):agent 采取action后环境的奖励
                done(bool):一般用做判断是否结束的signal
                info(dict):函数返回的用于调试的额外信息
        """
        raise NotImplementedError
    
    def reset(self):
        
        raise NotImplementedError
        
    def render(self, mode='human'):
        pass
    
    def close(self):
        pass
    
    def seed(self, seed=None):
        return

在gym环境中可以使用官方提供的,也可以是自己编写的;使用的两种方法
1.使用gym.make("环境名称"),如:

        import gym 
        
        env = gym.make('GridWorld-v1')#这个“GridWorld-v1”的来由见最后
        
        while Ture:
            env.step(150)
            env.render()

   2.直接创建类实例,创建完成后,在进行注册

class BallEnv(gym.Env):
    metadata ={"render.modes":['human']}

    def __init__(self):
        pass

    def reset(self):
        pass

    def step(self, action):
        pass

    def render(self, mode='human'):
        pass

    def close(self):
        pass

if __name__ == '__main__':
    env =BallEnv()
    
    while True:
        env.step(150)
        env.render()
#********************************************************************************************
#--------------------注册----------------
#打开.\Lib\site-package\gym\envs\__init__.py在其中加入register()代码,对自定义的环境进行注册,见下:
register(
    id = 'GridWorld-v1',
    entry_point ='gym.envs.user:GridEnv1',
    max_episode_steps=200,
    reward_threshold=100.0
)

#--------------放入库中--------------------
#打开\Lib\site-packages\gym\envs在这里新建user文件夹,并在user文件夹中新建__init__.py文件
#在init.py文件中加入如下代码
from gym.envs.user.grid_mdp_v1 import GridEnv1
#将写好的env文件放入user文件夹中,命名为grid_mdp_v1,这里的grid都是自己来命名,注意更改。

#-------------测试-------------------------
env = gym.make('GridWorld-v1')
env.reset()   # 初始化本场游戏的环境
env.render()  # 更新并渲染游戏画面

更详细的过程参考:https://www.gymlibrary.dev/index.html