首先是定义函数init()
def init(self):
#初始速度和位置
self.speed=0.05
self.position=[0,0]
#所处的位置范围
self.lowposition=-2
self.highposition=2
#速度范围
self.lowspeed=0.05
self.highspeed=0.1
#动作空间
self.actions=gym.spaces.Discrete(5)#前进,后退,向左,向右,不动
self.max_speed=0.7
#小车所受水平方向合力,重力
self.force=0.001
self.gravity=0.0025
self.low=np.array([self.lowposition,self.lowspeed],dtype=np.float32)
self.high=np.array([self.lowposition,self.lowspeed],dtype=np.float32)
#设置一个运行的区域
self.movingspace=gym.spaces.Box(self.low,self.high,dtype=np.float32)
在其中需要定义属性有:
速度speed,并且需要格局实际情况设置maxspeed和minspeed
所有可能动作的状态,这一点可以使用
import gym
action_spaces=gym.spaces.Discrete(n)
action_spaces.sample()
n即代表状态的数量,状态值从0开始。sample()函数则从动作空间中随机选取一个状态值
位置position,设置在二维平面内position的范围是(-2,-2)——(2,2)
设置运动过程中受到水平方向的合力以及重力,这些力会造成速度的改变
step函数:
def step(self,action):
if(action not in self.actions):
return "Wrong action"
#这里直接使用了原文的公式,但是不太确定为什么是这个公式,cos?
self.speed+=(action - 1) * self.force + math.cos(3 * self.position) * (-self.gravity)
self.speed=np.clip(self.speed,-self.max_speed,self.max_speed)
#小车不断运动
if action==0:
#前进
self.position[1]+=self.speed
elif action==1:
#后退
self.position[1]-=self.speed
elif action==2:
self.position[0]-=self.speed
elif action==3:
self.position[0]+=self.speed
else:
pass
#限制position位置
self.position[0]=np.clip(self.position[0],self.lowposition,self.highposition)
self.position[1]=np.clip(self.position[1],self.lowposition,self.highposition)
if (self.position[0]==self.highposition or self.position[1]==self.highposition) and self.speed>0:
self.speed=0
elif (self.position[0]==self.lowposition or self.position[1]==self.lowposition) and self.speed<0:
self.speed=0
这一函数定义每一步小车运行的情况,首先判断输入的动作是否存在(即0-4),之后更新速度值,更新之后根据动作值更新位置,position=position+speed。
将speed和position限制在规定好的范围内(lowspeed,highspeed),(lowposition,highposition)
self.position[0]=np.clip(self.position[0],self.lowposition,self.highposition)
判断位置是否到达边界,到达边界后小车停止运动
reset函数:
每当小车抵达边界,将其重置,重置方式为在要求范围内获取随机数
遇到困难:
关于注册方面还是存在一些疑惑
#注册
#打开.\Lib\site-packages\gym\envs\__init__.py在其中加入如下代码段,对自定义的环境进行注册
这里的id以及point 的最后要改为自己的环境名称
# user
# ---------
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