新手的第一个强化学习示例一般都从Open Gym开始。在这些示例中,我们不断地向环境施加动作,并得到观测和奖励,这也是Gym Env的基本用法:

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

其中state是agent的观测状态,reward是采取了action之后环境返回的奖励,done是判断后继状态是否是终止状态的flag,info是一些自定义的消息。

当后继状态是终止状态时,需要重置环境,使之回到初始状态:

env.reset()

接下来,我们就以以上两个基本用法为目标,自定义一个Gym下的简单环境:

S0 S1 S2
-1 -1 10

初始状态S0,终止状态S2,抵达状态S0 S1 S2的奖励分别为-1,-1和10,agent有向左和向右两个动作。

步骤1:创建文件夹和文件

本人为了做深度学习,使用conda的环境管理功能创建了名为 pytorch1.1的环境,于是来到目录:D:\Anaconda\envs\pytorch1.1\Lib\site-packages\gym\envs

创建文件夹 user ,用于专门存放自定义的环境,然后进入该目录:D:\Anaconda\envs\pytorch1.1\Lib\site-packages\gym\envs\user,创建文件 __init__.py 和 basic_env.py

步骤2:编写 basic_env.py 和 __init__.py

basic_env是我们要写的简单环境示例的文件名,内容如下:

import gym
class BasicEnv(gym.Env):
def __init__(self):
self.action_space = ['left', 'right'] # 动作空间
self.state_space = ['s0', 's1', 's2'] # 状态空间
self.state_transition = { # 状态转移表
's0': {'left':'s0', 'right':'s1'},
's1': {'left':'s0', 'right':'s2'}
}
self.reward = {'s0':-1, 's1':-1, 's2':10} # 奖励
self.state = 's0' def step(self, action):
next_state = self.state_transition[self.state][action] # 通过两个关键字查找状态转移表中的后继状态
self.state = next_state
reward = self.reward[next_state]
if next_state == 's2':
done = True
else:
done = False
info = {}
return next_state, reward, done, info def reset(self):
self.state = 's0'
return self.state def render(self, mode='human'):
draw = ['-' for i in range(len(self.state_space))]
draw[self.state_space.index(self.state)] = 'o'
draw = ''.join(draw)
print(draw)

__init__.py是引入环境类的入口函数,写入:

from gym.envs.user.basic_env import BasicEnv

步骤3:注册环境

来到目录:D:\Anaconda\envs\pytorch1.1\Lib\site-packages\gym,所有的环境都在__init__.py文件中注册,打开这个文件,发现很多类似这样的代码:

# Toy Text
# ---------------------------------------- register(
id="Blackjack-v1",
entry_point="gym.envs.toy_text:BlackjackEnv",
kwargs={"sab": True, "natural": False},
) register(
id="FrozenLake-v1",
entry_point="gym.envs.toy_text:FrozenLakeEnv",
kwargs={"map_name": "4x4"},
max_episode_steps=100,
reward_threshold=0.70, # optimum = 0.74
) register(
id="FrozenLake8x8-v1",
entry_point="gym.envs.toy_text:FrozenLakeEnv",
kwargs={"map_name": "8x8"},
max_episode_steps=200,
reward_threshold=0.85, # optimum = 0.91
)

模仿这个格式,我们添加自己的代码,注册自己的环境:

# User
# ----------------------------------------
register(
id="BasicEnv-v0", # 环境名
entry_point="gym.envs.user:BasicEnv", #接口
reward_threshold=10, # 奖励阈值
max_episode_steps = 10, # 最大步长
)

注册了的环境,可以通过向gym的通用接口写入环境名创建。除了环境名和接口两个基本信息外,奖励阈值和最大步长则是与训练相关的参数,还可以自行添加其他参数。

步骤4:测试环境

在测试代码中,我们设置了一个主循环,让agent随机选择向左或向右,直到抵达终止状态,或达到了在注册环境中设置的最大步长max_episode_steps(实现方式是使得done = True),代码如下:

import gym
import random
import time from gym import envs
print(envs.registry.all()) # 查看所有已注册的环境 env = gym.make('BasicEnv-v0')
env.reset() # 在第一次step前要先重置环境 不然会报错
action_space = env.action_space
while True:
action = random.choice(action_space) # 随机动作
state, reward, done, info = env.step(action)
print('reward: %d' % reward)
env.render()
time.sleep(0.5)
if done: break

强化学习实战 | 自定义Gym环境的更多相关文章

  1. 强化学习实战 | 自定义Gym环境之井字棋

    在文章 强化学习实战 | 自定义Gym环境 中 ,我们了解了一个简单的环境应该如何定义,并使用 print 简单地呈现了环境.在本文中,我们将学习自定义一个稍微复杂一点的环境--井字棋.回想一下井字棋 ...

  2. 强化学习实战 | 自定义Gym环境之扫雷

    开始之前 先考虑几个问题: Q1:如何展开无雷区? Q2:如何计算格子的提示数? Q3:如何表示扫雷游戏的状态? A1:可以使用递归函数,或是堆栈. A2:一般的做法是,需要打开某格子时,再去统计周围 ...

  3. 强化学习实战 | 自定义gym环境之显示字符串

    如果想用强化学习去实现扫雷.2048这种带有数字提示信息的游戏,自然是希望自定义 gym 环境时能把字符显示出来.上网查了很久,没有找到gym自带的图形工具Viewer可以显示字符串的信息,反而是通过 ...

  4. 强化学习实战 | 表格型Q-Learning玩井字棋(一)

    在 强化学习实战 | 自定义Gym环境之井子棋 中,我们构建了一个井字棋环境,并进行了测试.接下来我们可以使用各种强化学习方法训练agent出棋,其中比较简单的是Q学习,Q即Q(S, a),是状态动作 ...

  5. 强化学习实战 | 表格型Q-Learning玩井字棋(二)

    在 强化学习实战 | 表格型Q-Learning玩井字棋(一)中,我们构建了以Game() 和 Agent() 类为基础的框架,本篇我们要让agent不断对弈,维护Q表格,提升棋力.那么我们先来盘算一 ...

  6. 强化学习实战 | 表格型Q-Learning玩井子棋(三)优化,优化

    在 强化学习实战 | 表格型Q-Learning玩井字棋(二)开始训练!中,我们让agent"简陋地"训练了起来,经过了耗费时间的10万局游戏过后,却效果平平,尤其是初始状态的数值 ...

  7. 强化学习实战 | 表格型Q-Learning玩井字棋(四)游戏时间

    在 强化学习实战 | 表格型Q-Learning玩井字棋(三)优化,优化 中,我们经过优化和训练,得到了一个还不错的Q表格,这一节我们将用pygame实现一个有人机对战,机机对战和作弊功能的井字棋游戏 ...

  8. 强化学习-linux安装gym、atari和box2d环境

    安装gym和atari环境 pip3 install gym pip3 install gym[atari] pip3 install gym[accept-rom-license] 安装box2d环 ...

  9. 强化学习-Windows安装gym、atari和box2d环境

    安装gym pip3 install gym pip3 install gym[accept-rom-license] 安装atari环境[可选] 下载安装VS build tools 如果出现 OS ...

随机推荐

  1. VS2017+QT5.12.10+QGIS3.16环境搭建及开发全流程

    题记:大力发展生产力,助力高效采集.(转载请注明出处https://www.cnblogs.com/1024bytes/p/15477374.html) 本篇随笔分为五个部分: 一.获取QGIS3.1 ...

  2. Python中根据时间自动创建文件夹

    导语 ​ 电脑桌面文件太多查找起来比较花费时间,并且凌乱的电脑桌面也会影响工作心情,于是利用python根据时间自动建立当日文件夹,这样就可以把桌面上文件按时间进行存放. 代码实现 # _*_codi ...

  3. 手写vue-router & 什么是Vue插件

    博文分享 这篇文章你可以学习到: 实现一个自己的vue-router 了解什么是Vue的插件 学习b站大佬后做的笔记整理和源码实现 1.1.3一步一步带你弄懂vue-router核心原理及实现哔哩哔哩 ...

  4. 贪心-Saruman‘s Army POJ - 3069

    万恶之源 目录 题意 思路 贪心的原则是什么呢? 错解 正解 代码实现 书上的代码 我的代码 比较一下 问题 题意 给定若干个点的坐标,与范围R.每个点可以选择是否标记,标记后这个点的左右范围R内的所 ...

  5. Shadertoy 教程 Part 3 - 矩形和旋转

    Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...

  6. Ubuntu 16.04 下 旋转显示器屏幕 竖屏显示

    xrandr -o left $ xrandr -o left 向左旋转90度 $ xrandr -o right 向右旋转90度 $ xrandr -o inverted 上下翻转 $ xrandr ...

  7. 菜鸡的Java笔记 第三十 - java 异常的捕获及处理

    异常的捕获及处理        1.异常的产生分析以及所带来的影响        2.异常的处理的基本格式        3.异常的处理流程        4.异常的处理模式        5.自定义 ...

  8. CentOS 8.4安装Docker

    前言: Docker 是一个用于开发.传送和运行应用程序的开放平台.Docker 使您能够将应用程序与基础设施分开,以便您可以快速交付软件.使用 Docker,您可以像管理应用程序一样管理基础设施.通 ...

  9. 【Microsoft Azure 的1024种玩法】四. 利用Azure Virtual machines 打造个人专属云盘,速度吊打某云盘

    [简介] 1.Azure Virtual machines是Azure 提供的多种可缩放按需分配计算资源之一,Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或 ...

  10. 【JavaSE】字符编码和存储编码

    字符编码和存储编码 2019-07-15  22:34:51  by冲冲 1. 英文字母和中文汉字在不同字符集编码下的字节数不同. 英文字母 字节数 : 1; 编码:GB2312 字节数 : 1; 编 ...