西安网站建设q.479185700強,高端网站设计定制公司,wordpress 不同文章不同模板,深圳vi设计公司全力设计我们为什么要创建一个gym的环境呢#xff1f;因为需要#xff0c;哈哈哈#xff0c;这是一句废话#xff0c;但是也是一句真话。因为我不想自己写强化学习的算法了#xff0c;我想用一些现成的框架#xff0c;这些框架训练的都是gym的游戏#xff0c;那我把我自己想要训…我们为什么要创建一个gym的环境呢因为需要哈哈哈这是一句废话但是也是一句真话。因为我不想自己写强化学习的算法了我想用一些现成的框架这些框架训练的都是gym的游戏那我把我自己想要训练的东西改成一个gym的框架不就可以直接用强化学习的框架来训练了嘛。就是这么一个简单的需求我们开始吧。
顺便说一下我这里的gym是比较老的版本新版本的gym有一些不同新版本的gym在step函数中返回的是一个五元组reset返回的是一个二元组这都与旧版本不同但是这些强化学习的框架还没有改过来所以我们也就使用了旧版本函数不过这也不是什么大问题。
需要实现的函数
__init__()
构造函数中我们需要定义两个变量self.action_space和self.observation_space 为了覆盖父类的变量这两个变量的名字是固定的。它们定义了强化学习中的动作空间和状态空间的类型和大小如果是离散的则使用Discrete创建参数为离散量的个数比如CartPole中CartPole中的 self.action_space实际就是用Discrete(2)创建的如果是连续的则使用Box创建比如CartPole这个例子中状态有四维而且状态空间的每个维度都有定义域那么就可以如下创建
self.action_space Discrete(2)high np.array([ self.x_threshold * 2,np.finfo(np.float32).max, # finfo可以显示响应类型的机器限制这里为浮点数最大值 self.theta_threshold_radians * 2,np.finfo(np.float32).max,])
self.observation_space spaces.Box(-high, high, dtypenp.float32)reset()
调用这个方法可以重置模拟器环境并返回重启后的模拟器中agent的初始state
step()
调用该方法以实现agent与simulator进行一次交互。我们的奖励机制也需要写在这个函数中所以该函数非常重要。该函数的返回值必须是四元组包含
state 状态也就是状态空间
reward 奖励交互后agent得到的奖励
done 结束true表示已经结束False表示没有结束
info 信息是一个字典用来debug一般用不到
render()
用来显示画面一般pass如果有能力写动画的话也可以
seed()
用来设置随机种子一般pass如果程序中有一些随机性的行为可以在这里设置随机种子。
定义一个简单的环境
我们定义我们的动作空间为两个值范围均为 [-1,1]状态空间或者说观测空间为离散的5个变量奖励为两个动作的和状态转移均为从0到1234状态到4就结束。看一下代码
import gym
from gym import spaces
from stable_baselines3 import A2C
import numpy as npclass MySim(gym.Env):def __init__(self):low np.array([-1,-1],dtypenp.float32)high np.array([1,1],dtypenp.float32)self.action_space spaces.Box(low,high,dtypenp.float32)self.observation_space spaces.Discrete(5)self.state 0def step(self,action):self.state 1reward action[0] action[1] # 这里的reward的类型是np,float32不是python内建的floatdone Falseif self.state 4:done Trueinfo {}return self.state, float(reward), done, infodef reset(self):self.state 0return 0def render(self,modehuman):passdef seed():pass可以用一些工具来检测这个环境是否正确比如 stable_baselines3 下的 check_env就可以帮助我们进行环境的检测
from stable_baselines3.common.env_checker import check_env
if __name__ __main__: env MySim()check_env(env)如果没有任何报错就说明环境正常可以用这个环境来训练一些代码了我们用了A2C算法
if __name__ __main__:env MySim()check_env(env)model A2C(policyMlpPolicy, envenv)model.learn(total_timesteps10000)obs env.reset()# 验证一次for _ in range(10):action, state model.predict(observationobs)print(action[0] action[1])obs, reward, done, info env.step(action)if done:break输出为
2.0
2.0
2.0
2.0可以预见的输出正确。