使用gym-minigrid创建自定义网格世界环境教程

使用gym-minigrid创建自定义网格世界环境教程

前言

gym-minigrid是一个用于构建简单网格世界环境的Python库,非常适合强化学习研究和教学使用。本教程将详细介绍如何利用该库创建自定义的网格世界环境,包括基础环境搭建、障碍物设置、目标点放置等核心功能。

环境基础搭建

1. 创建环境类

首先需要创建一个继承自MiniGridEnv的类,这是所有网格世界环境的基类:

class SimpleEnv(MiniGridEnv):
    def __init__(
        self,
        size=8,
        agent_start_pos=(1, 1),
        agent_start_dir=0,
        max_steps: int | None = None,
        **kwargs,
    ):
        self.agent_start_pos = agent_start_pos
        self.agent_start_dir = agent_start_dir

        mission_space = MissionSpace(mission_func=self._gen_mission)

        super().__init__(
            mission_space=mission_space,
            grid_size=size,
            max_steps=256,
            **kwargs,
        )

关键参数说明:

  • size: 网格环境的尺寸(正方形)
  • agent_start_pos: 智能体的初始位置坐标
  • agent_start_dir: 智能体的初始朝向
  • max_steps: 每个episode的最大步数

2. 定义任务空间

任务空间(MissionSpace)用于描述环境的目标,通过静态方法定义:

@staticmethod
def _gen_mission():
    return "到达目标位置"

构建网格世界

1. 初始化网格

重写_gen_grid方法来构建自定义网格:

def _gen_grid(self, width, height):
    # 创建空网格
    self.grid = Grid(width, height)
    
    # 生成边界墙
    self.grid.wall_rect(0, 0, width, height)

2. 放置智能体

if self.agent_start_pos is not None:
    self.agent_pos = self.agent_start_pos
    self.agent_dir = self.agent_start_dir
else:
    self.place_agent()  # 随机放置

3. 添加目标点

self.put_obj(Goal(), width - 2, height - 2)

高级环境设计

1. 创建分隔墙

# 在x=5处创建垂直墙
for i in range(0, height):
    self.grid.set(5, i, Wall())

2. 添加门和钥匙

首先导入所需对象:

from minigrid.core.constants import COLOR_NAMES
from minigrid.core.world_object import Door, Key

然后放置门和钥匙:

# 放置锁着的门
self.grid.set(5, 6, Door(COLOR_NAMES[0], is_locked=True))

# 放置对应颜色的钥匙
self.grid.set(3, 6, Key(COLOR_NAMES[0]))

完整示例代码

from minigrid.core.constants import COLOR_NAMES
from minigrid.core.grid import Grid
from minigrid.core.mission import MissionSpace
from minigrid.core.world_object import Door, Goal, Key, Wall
from minigrid.minigrid_env import MiniGridEnv

class SimpleEnv(MiniGridEnv):
    def __init__(self, size=10, agent_start_pos=(1,1), agent_start_dir=0, **kwargs):
        self.agent_start_pos = agent_start_pos
        self.agent_start_dir = agent_start_dir

        mission_space = MissionSpace(mission_func=lambda: "找到钥匙并到达目标")
        
        super().__init__(
            mission_space=mission_space,
            grid_size=size,
            max_steps=4*size**2,
            **kwargs
        )

    def _gen_grid(self, width, height):
        # 创建空网格
        self.grid = Grid(width, height)
        
        # 边界墙
        self.grid.wall_rect(0, 0, width, height)
        
        # 中间分隔墙
        for i in range(height):
            self.grid.set(5, i, Wall())
        
        # 放置门和钥匙
        self.grid.set(5, 6, Door(COLOR_NAMES[0], is_locked=True))
        self.grid.set(3, 6, Key(COLOR_NAMES[0]))
        
        # 目标点
        self.put_obj(Goal(), width-2, height-2)
        
        # 放置智能体
        if self.agent_start_pos is not None:
            self.agent_pos = self.agent_start_pos
            self.agent_dir = self.agent_start_dir
        else:
            self.place_agent()

环境测试与可视化

创建好环境后,可以通过以下方式测试:

env = SimpleEnv(render_mode="human")
env.reset()

总结

通过本教程,我们学习了如何使用gym-minigrid创建自定义网格世界环境。关键步骤包括:

  1. 继承MiniGridEnv基类
  2. 定义任务空间
  3. 实现_gen_grid方法构建网格
  4. 添加各种环境对象(墙、门、钥匙、目标等)
  5. 放置智能体

掌握了这些基础知识后,你可以创建各种复杂的网格世界环境,用于强化学习算法的训练和测试。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任轶眉Tracy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值