快乐的强化学习3——环境模块gym的调用

终于要安装gym模块了,一想到我可以去测试其它的强化学习环境,突然有点小兴奋。
在这里插入图片描述
但是听说windows不能安装OpenAI gym,我的想法是这样的。
在这里插入图片描述
不过我还是怀着好奇宝宝的内心决定实验一下……好的还是成功了!

学习前言

在通常的情况下,手动编写强化学习环境是一件非常耗时间的事情,所以如果能够调用其它人已经编写好的环境,我们就可以节约很多时间,将更多的时间用于关注算法本身。这个时候我们就要用到OpenAI的gym模块。这个模块为我们提供了许多现成的环境用于测试我们的RL算法。

gym模块的安装

现在在Windows下也基本支持了gym模块的使用。我们只要打开cmd命令行窗口。
打开命令行cmd
在命令行中输入:

pip install gym

即可。
在安装的时候可能会遇到一些错误,我遇到的错误是:

cannot uninstall a distutils installed project

解决方法可以参照我转载的博文:https://blog.csdn.net/weixin_44791964/article/details/96761819

gym模块中环境的常用函数

gym的初始化

env = gym.make('CartPole-v0')   
# 定义使用gym库中的某一个环境,'CartPole-v0'可以改为其它环境
env = env.unwrapped             
# 据说不做这个动作会有很多限制,unwrapped是打开限制的意思

gym的各个参数的获取

env.action_space   		
# 查看这个环境中可用的action有多少个,返回Discrete()格式
env.observation_space   
# 查看这个环境中observation的特征,返回Box()格式
n_actions=env.action_space.n 
# 查看这个环境中可用的action有多少个,返回int
n_features=env.observation_space.shape[0] 
# 查看这个环境中observation的特征有多少个,返回int

刷新环境

env.reset()
# 用于一个世代(done)后环境的重启,获取回合的第一个observation
env.render()	
# 用于每一步后刷新环境状态

刷新环境

observation_, reward, done, info = env.step(action)
# 获取下一步的环境、得分、检测是否完成。

应用实例

这是一个板子支撑杆子的例子,支撑的越久得分越高,同时杆子不能移出屏幕外,不能倾斜过大。
实际上像这个样子:
在这里插入图片描述
测试代码为:

import gym
import math
from RL_brain import DeepQNetwork

env = gym.make('CartPole-v0')   # 定义使用gym库中的某一个环境,'CartPole-v0'可以改为其它环境
env = env.unwrapped             # 据说不做这个动作会有很多限制,unwrapped是打开限制的意思

print(env.action_space)             # 查看这个环境中可用的action有多少个,返回Discrete()格式
print(env.observation_space)        # 查看这个环境中observation的特征,返回Box()格式

# 定义使用 DQN 的算法,
# n_actions=env.action_space.n用于查看这个环境中可用的action有多少个,返回int
# n_features=env.observation_space.shape[0]用于查看这个环境中observation的特征有多少个,返回int
# replace_target_iter=100代表每学习一百次将Net_Pre的参数赋予Net_Next
RL = DeepQNetwork(n_actions=env.action_space.n,
                  n_features=env.observation_space.shape[0],
                  learning_rate=0.01, e_greedy=0.9,
                  replace_target_iter=100, memory_size=2000,
                  e_greedy_increment=0.0008,)

# 记录步数
total_steps = 0 

for i in range(100):
    # 获取回合 i 第一个 observation
    observation = env.reset()
    #每一轮得分的合集
    ep_r = 0
    while True:
        # 用于每一步后刷新环境状态
        env.render()    
        
        # 根据当前心目中预测的状态选行为
        action = RL.choose_action(observation)  

        # 获取下一步的环境、得分、检测是否完成。
        observation_, reward, done, info = env.step(action) 

        # 通过查找源代码发现observation_由以下四个特征构成。
        # x 是车的水平位移
        # theta 是棒子离垂直的角度
        x, x_dot, theta, theta_dot = observation_   

        # r1代表车的 x水平位移 与 x最大边距 的距离差的得分
        r1 = math.exp((env.x_threshold - abs(x))/env.x_threshold) - math.exp(1)/2
        # r2代表棒子的 theta离垂直的角度 与 theta最大角度 的差的得分
        r2 = math.exp((env.theta_threshold_radians - abs(theta))/env.theta_threshold_radians) - math.exp(1)/2
        # 总 reward 是 r1 和 r2 的结合, 既考虑位置, 也考虑角度。
        reward = r1 + r2   

        # 保存这一组记忆
        RL.store_transition(observation, action, reward, observation_)
        

        # 在数据具有一定规模后进行学习
        if total_steps > 1000:
            RL.learn() 

        #记录总分
        ep_r += reward
        if done:
            print('世代: ', i,'。总分: ', round(ep_r, 2))
            break
        
        #环境更新
        observation = observation_
        total_steps += 1
        
# 最后输出 cost 曲线
RL.plot_cost()

RL_brain的代码可以从我的另一篇博文中得到:
https://blog.csdn.net/weixin_44791964/article/details/96422796
细心的同学可能观察到我并没有直接使用

observation_, reward, done, info = env.step(action) 

返回的reward值,而是重新定义了。因为我试了直接用原来reward值效果并不好。我定义的reward值由两部分组成,分别是:

r1 = math.exp((env.x_threshold - abs(x))/env.x_threshold) - math.exp(1)/2
# r1代表车的 x水平位移 与 x最大边距 的距离差的得分
r2 = math.exp((env.theta_threshold_radians - abs(theta))/env.theta_threshold_radians) - math.exp(1)/2
# r2代表棒子的 theta离垂直的角度 与 theta最大角度 的差的得分

这些参数需要去查询CartPole的源文件才可以得到。
我是通过在C:\Anaconda3\envs\tensorflow-gpu\Lib里搜索得到的。
这个环境里有详细的描述,需要大家好好看看噢!
CartPole的源文件
希望得到朋友们的喜欢。
有不懂的朋友可以评论询问噢。

  • 17
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bubbliiiing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值