Pendulum_DDPG代码走读之pendulum.py

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成功之后自带的,为了方便查看,直接粘过来的。

你可能感兴趣的:(python)