使用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创建自定义网格世界环境。关键步骤包括:
- 继承MiniGridEnv基类
- 定义任务空间
- 实现_gen_grid方法构建网格
- 添加各种环境对象(墙、门、钥匙、目标等)
- 放置智能体
掌握了这些基础知识后,你可以创建各种复杂的网格世界环境,用于强化学习算法的训练和测试。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考