gym自定义环境

1.必须定义的函数?

当在OpenAI Gym中定义新的环境时,需要按照以下格式规范编写代码:

必需从gym.Env类继承您的环境类。

必须定义以下四个方法:init(), step(), reset() 和 render()。

以下是这四个函数的主要功能:

init():初始化环境的一些参数和状态。这里通常会设置动作空间和观察空间,以及其他任何特定于环境的变量。

step():对于给定的动作,它应该返回四个值。这四个值分别为:新的状态、奖励值、完成标志和信息字典(observation, reward, done, info)

reset():重置环境的状态,并且返回初始观察。

render():可视化环境的当前状态。这对于人类理解环境很有帮助,但在大多数训练场景中并不需要。

调用step()函数:observation2, reward, done, info = env.step(action)

2.如何描述动作和状态空间?

Gym库的spaces模块提供了多种描述动作和观察空间的类。以下是其中的一些类:

gym.spaces.Box(low, high, shape=None, dtype=None):包含 n 维间隔 [low, high] 的盒形空间。参数 low 和 high 可以是数字或数字的向量。shape表示盒形空间的形状,通常为一个元组。

例如:如果您希望描述一个由RGB三个颜色通道组成的64x64的图像,那么可以创建一个Box,如Box(low=0, high=255, shape=(64, 64, 3), dtype=np.uint8)。

gym.spaces.Discrete(n):包含 {0, 1, ..., n-1} 的离散空间。

例如:如果一个环境有四个离散的动作,您可以创建一个空间如Discrete(4)。

gym.spaces.MultiBinary(n):包含 {0,1}^n 的多二进制空间。

gym.spaces.MultiDiscrete(nvec):一个有多个离散空间的向量空间。

例如:当您希望描述一个有两个离散空间的环境,其中一个离散空间有 5 个动作,另一个离散空间有 2 个动作时,可以创建一个 MultiDiscrete([5, 2])。

gym.spaces.Tuple(spaces):一个包含许多其它空间的元组空间。

以上只是一些最常见的类,spaces模块还包含其它的空间类。所有这些类都有一个共有的接口,包括sample()方法用于从空间中随机抽样,contains(x)方法用于检查一个元素是否在空间内,和一个shape属性用于描述空间的形状。

实例代码:

import gym
from gym import spaces
from gym.utils import seeding
import numpy as np
from os import path

class my_env(gym.Env):
    metadata = {
        'render.modes' : ['human', 'rgb_array'],
        'video.frames_per_second' : 30
    }

    def __init__(self):
        self.max_rho=1.
        self.min_rho = 0.
        self.viewer = None

        self.max_obs = np.ones((30,))
        self.min_obs = np.zeros((30,))

        self.action_space = spaces.Box(low=-self.min_rho, high=self.max_rho, shape=(10,))
        self.observation_space = spaces.Box(low=self.min_obs, high=self.max_obs)

        self.seed()

    def seed(self, seed=None):
        self.np_random, seed = seeding.np_random(seed)
        return [seed]

    def step(self,u):
        u1 = np.clip(u, self.min_rho, self.max_rho)

        costs = (np.sum(self.state)-5*np.sum(u1))**2

        return self._get_obs(), -costs, False, {}

    def reset(self):
        self.state = self.np_random.uniform(low=self.min_obs, high=self.max_obs)
        return self._get_obs()

    def _get_obs(self):
        return self.state

    def render(self, mode='human'):
        return 1

    def close(self):
        if self.viewer: self.viewer.close()


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值