快乐的强化学习3——环境模块gym的调用
终于要安装gym模块了,一想到我可以去测试其它的强化学习环境,突然有点小兴奋。
但是听说windows不能安装OpenAI gym,我的想法是这样的。
不过我还是怀着好奇宝宝的内心决定实验一下……好的还是成功了!
学习前言
在通常的情况下,手动编写强化学习环境是一件非常耗时间的事情,所以如果能够调用其它人已经编写好的环境,我们就可以节约很多时间,将更多的时间用于关注算法本身。这个时候我们就要用到OpenAI的gym模块。这个模块为我们提供了许多现成的环境用于测试我们的RL算法。
gym模块的安装
现在在Windows下也基本支持了gym模块的使用。我们只要打开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里搜索得到的。
这个环境里有详细的描述,需要大家好好看看噢!
希望得到朋友们的喜欢。
有不懂的朋友可以评论询问噢。