Đăng ký Gym: Hướng dẫn Tạo Môi trường Gym Tùy chỉnh

Việc tạo môi trường Gym tùy chỉnh cho phép bạn thiết kế và triển khai các bài toán học tăng cường (Reinforcement Learning) độc đáo. Bài viết này sẽ hướng dẫn bạn quy trình tạo môi trường Gym mới, từ việc thiết lập cơ bản đến đăng ký và sử dụng trong Gym.

Subclassing gym.Env là bước đầu tiên. Bạn cần kế thừa từ lớp abstract này để tạo môi trường riêng. Một ví dụ đơn giản là GridWorldEnv, một trò chơi trên lưới hai chiều, nơi agent tìm đường đến mục tiêu. Quan sát bao gồm vị trí của agent và mục tiêu, hành động là di chuyển lên, xuống, trái, phải, tín hiệu kết thúc khi agent đến mục tiêu, và phần thưởng là 1 khi thành công, 0 khi chưa.

Khai báo và khởi tạo môi trường bao gồm việc định nghĩa metadata (chế độ render, tốc độ khung hình), observation_space (không gian quan sát) và action_space (không gian hành động). GridWorldEnv sử dụng dictionary cho quan sát, Box cho vị trí, và Discrete(4) cho bốn hành động.

import gym
from gym import spaces
import pygame
import numpy as np

class GridWorldEnv(gym.Env):
    metadata = {"render_modes": ["human", "rgb_array"], "render_fps": 4}
     # ... (Nội dung code khác)

Xây dựng quan sát từ trạng thái môi trường được thực hiện thông qua hàm _get_obs(). Hàm này trả về dictionary chứa vị trí agent và mục tiêu. Tương tự, hàm _get_info() cung cấp thông tin bổ sung, ví dụ khoảng cách Manhattan giữa agent và mục tiêu.

Hàm reset() khởi tạo một episode mới, đặt ngẫu nhiên vị trí agent và mục tiêu, đảm bảo chúng không trùng nhau. Hàm trả về quan sát ban đầu và thông tin bổ sung. Quan trọng là phải gọi super().reset(seed=seed) để đảm bảo Gym khởi tạo đúng trình tạo số ngẫu nhiên.

Hàm step() thực hiện hành động, cập nhật trạng thái môi trường, và trả về quan sát, phần thưởng, tín hiệu kết thúc (terminated), tín hiệu cắt ngắn(truncated) và thông tin bổ sung. GridWorldEnv sử dụng np.clip() để giữ agent trong lưới.

Rendering (hiển thị) được thực hiện bằng PyGame. Hàm render() vẽ agent, mục tiêu và đường lưới trên cửa sổ. Hàm close() đóng cửa sổ PyGame khi môi trường không còn sử dụng.

Đăng ký môi trường (Gym Register) là cần thiết để Gym có thể nhận diện môi trường tùy chỉnh. Bạn cần sử dụng hàm register() trong file __init__.py của package, cung cấp ID, entry point, và các thông tin khác như max_episode_steps.

from gym.envs.registration import register

register(
    id='gym_examples/GridWorld-v0',
    entry_point='gym_examples.envs:GridWorldEnv',
    max_episode_steps=300,
)

Sau khi đăng ký, bạn có thể tạo môi trường bằng gym.make('gym_examples/GridWorld-v0'). Bạn cũng có thể truyền các tham số khởi tạo cho môi trường thông qua gym.make().

Wrappers cho phép bạn sửa đổi môi trường mà không cần thay đổi code gốc. Ví dụ, FlattenObservation chuyển đổi quan sát dictionary thành mảng, hoặc RelativePosition chỉ quan sát vị trí tương đối giữa agent và mục tiêu.

import gym_examples
from gym.wrappers import FlattenObservation

env = gym.make('gym_examples/GridWorld-v0')
wrapped_env = FlattenObservation(env)
print(wrapped_env.reset())  # Ví dụ: [3 0 3 3], {}

Việc tạo package Python cho môi trường tùy chỉnh giúp quản lý code và chia sẻ dễ dàng hơn. Bạn cần cấu hình file setup.py với thông tin về package, phiên bản, và các dependency.

Comments

No comments yet. Why don’t you start the discussion?

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *