gym-Pendulum v1 + DDPG(PyTorch)

Pendulum 是一个强化学习的经典游戏,游戏目标是希望控制红色的杆竖直向上。
在这里插入图片描述
Pendulum环境定义了坐标系、动力学方程等,还有state,action,reward。需要自己写的部分是网络结构和更新算法。
gym 源码:https://github.com/openai/gym/blob/master/gym/envs/classic_control/pendulum.py

倒立摆摆动问题是基于控制理论中的经典问题。该系统由一端连接到固定点的钟摆组成,另一端是自由的。钟摆从一个随机位置开始,目标是在自由端施加扭矩使其摆动。其重心位于固定点的正上方。

x,y:钟摆末端的笛卡尔坐标,单位为米。
θ:以弧度表示的角度。
tau:以‘N m’为单位的扭矩。定义为顺时针

action space 定义为(1,),物理意义是作用于倒立摆自由端的扭矩,值域[-2,2]

observation space 定义为(3,)
在这里插入图片描述
reward:r = -(theta2 + 0.1 * theta_dt2 + 0.001 * torque2)
其中 θ \theta θ 倒立摆角度,以弧度表示, θ ∈ [ − p i , p i ] \theta \in [-pi, pi] θ[pi,pi] (0是竖直向上).
基于以上公式,最小的reward是:-(pi2 + 0.1 * 82 + 0.001 * 22) = -16.2736044,
最大的reward是0 (竖直向上,速度是0,没有扭矩).

初始状态:角度随机 in [-pi, pi] ,角速度随机 in [-1,1].


代码参考了全网最多的那份pytorch版,最后跑出来的结果:
在这里插入图片描述
(前50 episode 在攒数据,没有训练)
reward波动有点大,不过看动画效果,模型是学到了的。


# 源码
from os import path
from typing import Optional
import numpy as np
import gym
from gym import spaces
from gym.envs.classic_control import utils
from gym.error import DependencyNotInstalled
from gym.utils.renderer import Renderer

DEFAULT_X = np.pi
DEFAULT_Y = 1.0

class PendulumEnv(gym.Env):
	def __init__(self, render_mode: Optional[str] = None, g=10.0):
        self.max_speed = 8
        self.max_torque = 2.0
        self.dt = 0.05
        self.g = g
        self.m = 1.0
        self.l = 1.0

        self.render_mode = render_mode
        self.renderer = Renderer(self.render_mode, self._render) #gym自带渲染器

        self.screen_dim = 500
        self.screen = None
        self.clock = None
        self.isopen = True

        high = np.array([1.0, 1.0, self.max_speed], dtype=np.float32)
		
		#定义动作空间和观察空间
        self.action_space = spaces.Box(
            low=-self.max_torque, high=self.max_torque, shape=(1,), dtype=np.float32
        )
        self.observation_space = spaces.Box(low=-high, high=high, dtype=np.float32)


    def step(self, u):
    	#step 函数返回四个值observation、reward、done、info
    	
		#observation (object):一个与环境相关的对象描述你观察到的环境,如相机的像素信息,机器人的角速度和角加速度,棋盘游戏中的棋盘状态。
		#reward (float):先前行为获得的所有回报之和,不同环境的计算方式不一,但目标总是增加自己的总回报。
		#done (boolean): 判断是否到了重新设定(reset)环境,大多数任务分为明确定义的episodes,并且完成为True表示episode已终止。
		#info (dict):用于调试的诊断信息,有时也用于学习,但正式的评价不允许使用该信息进行学习。 这是一个典型的agent-environment loop 的实现。

        th, thdot = self.state  # th := theta

        g = self.g
        m = self.m
        l = self.l
        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 + 0.1 * thdot**2 + 0.001 * (u**
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pendulum-v1 是 OpenAI Gym 中的一个物理仿真环境,它模拟了一个单摆的运动。在该环境中,智能体需要控制单摆的角度和角速度,以使其保持在垂直方向上,并尽可能少地消耗能量。 具体来说,该环境中的单摆由一个质量为 $m$、长度为 $l$ 的杆和一个质量为 $m$、半径为 $r$ 的球组成。球的初始位置在杆的顶端,球的初始速度为 $0$。智能体可以施加一个关节力矩 $u$,该力矩作用在杆的底端,用来控制单摆的运动。单摆的状态由三个变量 $(\theta, \dot{\theta}, \omega)$ 描述,其中 $\theta$ 表示杆与垂直方向的夹角,$\dot{\theta}$ 表示杆的角速度,$\omega$ 表示关节速度。智能体需要在每个时刻 $t$ 选择一个力矩 $u_t$,使得单摆在下一个时刻 $t+1$ 的状态能够尽可能地接近目标状态 $(\theta_{target}, 0, 0)$,并且尽可能少地消耗能量。 在 Pendulum-v1 环境中,智能体的目标是最小化下列代价函数: $$ J = \sum_{t=0}^{T-1} (\theta_t - \theta_{target})^2 + 0.1\dot{\theta}_t^2 + 0.001u_t^2 $$ 其中 $T$ 表示仿真的总时长。该代价函数包含三个部分,第一部分是惩罚单摆与目标状态之间的角度差,第二部分是惩罚单摆的角速度,第三部分是惩罚智能体施加的力矩。 Pendulum-v1 环境的观测空间和动作空间分别为: - 观测空间:由三个连续的变量 $\theta, \dot{\theta}, \omega$ 组成,取值范围分别为 $[-\pi, \pi], [-\infty, \infty], [-8, 8]$。 - 动作空间:由一个连续的变量 $u$ 组成,取值范围为 $[-2, 2]$。 可以使用强化学习算法来训练智能体在 Pendulum-v1 环境中学习控制单摆的运动,例如深度强化学习算法 DDPG

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值