Pendulum_DDPG.py中引入:
# 初始化环境状态
state = env.reset()
# 获取当前时刻的状态
state_next, reward, terminal, _ = env.step(action)
# 其中env.step(action)是进入 time_limit.py的step函数 再进入 pendulum.py的step函数
其中time_limit.py主要是对倒立摆的时间进行限制,绝大多数系统中默认max_episode_steps=200,也就是说在一个episode中执行200个step就会将terminal设置为True,防止其无限进行下去,这里不做赘述,主要是介绍pendulum.py,首先将pendulum.py中的step函数贴出来。
state_next, reward, terminal, _ = env.step(action)
def step(self,u):
# th:角度,thdot:角速度
th, thdot = self.state # th := theta
g = 10.
m = 1.
l = 1.
dt = self.dt
u = np.clip(u, -self.max_torque, self.max_torque)[0]
self.last_u = u # for rendering
costs = angle_normalize(th)**2 + .1*thdot**2 + .001*(u**2)
newthdot = thdot + (-3*g/(2*l) * np.sin(th + np.pi) + 3./(m*l**2)*u) * dt
newth = th + newthdot*dt
newthdot = np.clip(newthdot, -self.max_speed, self.max_speed)
#pylint: disable=E1111
self.state = np.array([newth, newthdot])
return self._get_obs(), -costs, False, {}
由上式可看出state_next对应self._get_obs(self)返回值,reward对应的是-costs, terminal对应的是False,
其中u是输入动作(action:扭矩),结合当前状态(角度+角速度),计算得到新的(角度+角速度)。
def _get_obs(self):
theta, thetadot = self.state
return np.array([np.cos(theta), np.sin(theta), thetadot])
将获得到的角度+角速度,通过转换变为DDPG中的state(状态)--> [cos(theta), sin(theta), thetadot]
最终,我们需要输入状态: [cos(theta), sin(theta), thetadot],来获得倒立摆的扭矩信息。
代码地址:https://github.com/wangyy161/DDPG_CNN_Pendulum_practice/blob/master/pendulum.py
其实改代码是安装gym成功之后自带的,为了方便查看,直接粘过来的。