首页 > 其他分享 >gym创建环境、自定义gym环境

gym创建环境、自定义gym环境

时间:2024-08-15 21:18:46浏览次数:10  
标签:observation 自定义 gym 环境 action env np import self

环境:half_cheetah.py

from os import path

import numpy as np

from gymnasium import utils
from gymnasium.envs.mujoco import MujocoEnv
from gymnasium.spaces import Box

DEFAULT_CAMERA_CONFIG = {
    "distance": 4.0,
}


class MOHalfCheetahEnv(MujocoEnv, utils.EzPickle):
    metadata = {
        "render_modes": [
            "human",
            "rgb_array",
            "depth_array",
        ],
        "render_fps": 20,
    }

    def __init__(
            self,
            **kwargs,
    ):
        utils.EzPickle.__init__(
            self,
            **kwargs,
        )

        # 计算 observation_space
        observation_space = Box(
            low=-np.inf, high=np.inf, shape=(17,), dtype=np.float64
        )

        # init
        MujocoEnv.__init__(
            self,
            "half_cheetah.xml", # 直接使用库里面的
            5,
            observation_space=observation_space,
            default_camera_config=DEFAULT_CAMERA_CONFIG,
            **kwargs,
        )

        # mo相关属性
        self.reward_space = Box(low=-np.inf, high=np.inf, shape=(2,))
        self.reward_dim = 2

    def step(self, action):
        # pgmorl pdmorl 直接在这里对action进行裁剪动作
        action = np.clip(action, -1.0, 1.0)

        # 计算速度
        x_position_before = self.data.qpos[0]
        self.do_simulation(action, self.frame_skip)
        x_position_after = self.data.qpos[0]
        x_velocity = (x_position_after - x_position_before) / self.dt

        # observation
        observation = self._get_obs()

        # reward
        alive_bonus = 1
        reward_run = min(4.0, x_velocity) + alive_bonus
        reward_energy = 4.0 - 1.0 * np.square(action).sum() + alive_bonus
        vec_reward = np.array([reward_run, reward_energy], dtype=np.float32)

        # terminated truncated
        ang = self.data.qpos[2]
        # terminated = not (abs(ang) < np.deg2rad(50))  # 终止 pgmorl pdmorl有终止
        terminated = False  # 终止 pgmorl pdmorl有终止
        truncated = False  # 截断

        # info
        info = {}

        # render
        if self.render_mode == "human":
            self.render()

        return observation, vec_reward, terminated, truncated, info

    def _get_obs(self):
        position = self.data.qpos.flat.copy()
        velocity = self.data.qvel.flat.copy()

        position = position[1:]  # obs 维度17

        observation = np.concatenate((position, velocity)).ravel()
        return observation

    def reset_model(self):
        qpos = self.init_qpos + self.np_random.uniform(
            low=-0.1, high=0.1, size=self.model.nq
        )
        qvel = self.init_qvel + self.np_random.standard_normal(self.model.nv) * 0.1
        self.set_state(qpos, qvel)
        return self._get_obs()

注册、不检查环境

from gymnasium.envs.registration import register
import mo_gymnasium as mo_gym
from half_cheetah import MOHalfCheetahEnv

register(
    id="wx-half-v1",
    entry_point=MOHalfCheetahEnv,
    max_episode_steps=500,
)

if __name__ == '__main__':
    import gymnasium as gym

    # env = MOHalfCheetahEnv(render_mode="human")
    # env = MOHalfCheetahEnv()
    # env = mo_gym.make('mo-halfcheetah-v4')  # 无done 1000次
    # env = gym.make("HalfCheetah-v4") # 无done 1000次
    env = gym.make("wx-half-v1", disable_env_checker=True)

    done = False
    obv, info = env.reset(seed=5)
    env.action_space.seed(5)
    env.observation_space.seed(5)

    print(type(env))

    steps = 0
    while not done:
        action = env.action_space.sample()
        obv, r, d1, d2, _ = env.step(action)
        # print(r)
        done = d1 or d2
        steps += 1
        print(steps)

    print(steps)

标签:observation,自定义,gym,环境,action,env,np,import,self
From: https://www.cnblogs.com/Twobox/p/18361816

相关文章

  • @Scheduled 定时任务自定义
    简介@Scheduled定时任务自定义可以通过SchedulingConfigurer实现。SchedulingConfigurer是SpringFramework中的一个接口,用于配置定时任务。当你需要对定时任务进行更高级别的定制时,这个接口就显得非常有用。可以通过SchedulingConfigurer接口来自定义一些高级配置可以......
  • 在 Vue 自定义事件中,父组件如何接收子组件传递的多个参数?
    在Vue中,自定义事件是父组件和子组件之间通信的重要方式。父组件可以监听子组件的事件,子组件则通过触发自定义事件将数据传递给父组件。如果子组件需要向父组件传递多个参数。 $emit 方法使用一、场景介绍假设我们有一个父组件和一个子组件。子组件需要通过自定义事件向父组......
  • gym序列化、EzPickle类
    EzPickle是一个用于强化学习环境的类,它重写了__getstate__和__setstate__方法,以便通过构造函数参数(*args,**kwargs)进行序列化和反序列化。这个设计允许那些无法直接用pickle库处理的对象,如数据库连接和网络套接字,也能在保存和恢复时保持其状态。"""Classforpicklingandun......
  • MFC自定义按钮实现
    MFC中要实现自定义按钮,首先要创建一个类并继承自CButton。我这里创建的类名为CMainButtonclassCMainButton:publicCButton{ DECLARE_DYNAMIC(CMainButton)public: CMainButton(UINTnID,CRectrcWnd,CWnd*pParent=nullptr);//nID为按钮ID,rcWnd为按钮位置 virtual~CM......
  • ansible设置环境变量
    通过~/.profile文件设置env01.yaml----hosts:ubuntutasks:#设置环境变量-name:设置环境变量lineinfile:dest:~/.profileregexp:^exportENV_KEY=line:exportENV_KEY=env_value-name:获取环境变量值......
  • C语言学习笔记 Day13(复合类型/自定义类型)
    Day13 内容梳理:目录Chapter9 复合类型(自定义类型)9.1结构体(1)结构体变量定义、初始化(2)嵌套结构体(3)结构体赋值(4)结构体和指针(5)结构体做函数参数9.2共用体(联合体)9.3枚举9.4typedef关键字Chapter9 复合类型(自定义类型)9.1结构体有时需要将不同类型的数组......
  • allure报告自定义logo图片和文字
    有时根据项目需要把allure报告的logo换成公司的,步骤如下:1、将自定义的logo图片放到static文件夹中,尺寸大小100*100D:\allure-2.13.9\plugins\custom-logo-plugin\static      2、编辑styles.css文件。    修改和增加如下css:.side-nav__brand{......
  • 全面掌握 Spring Cloud LoadBalancer:从自定义到策略优化的实战教程
    引言在微服务架构中,负载均衡是保障系统高效运行的关键技术之一。无论是服务端负载均衡还是客户端负载均衡,合理的负载均衡策略都能显著提升系统的稳定性和响应速度。本文将从基础概念入手,详细讲解如何在SpringCloud中实现和优化负载均衡,并结合实际案例,帮助读者快速上手并......
  • Spring Boot应用的多环境配置管理
    SpringBoot应用的多环境配置管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在开发SpringBoot应用时,经常需要在不同的环境(如开发、测试和生产环境)之间切换。每个环境可能需要不同的配置,如数据库连接、服务端点等。SpringBoot提供了多种机制来......
  • 自定义JSON名
    lSer:=TMVCJsonDataObjectsSerializer.Create;trylSer.DataSetToJsonArray(MasterDBHelper.Query,lJObj.a['m'],TMVCNameCase.ncLowerCase,[],procedure(constaField:TField;constaJsonObject:TJSONObject......