fourrooms.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python
  2. from gym_minigrid.minigrid import Goal, Grid, MiniGridEnv
  3. from gym_minigrid.register import register
  4. class FourRoomsEnv(MiniGridEnv):
  5. """
  6. Classic 4 rooms gridworld environment.
  7. Can specify agent and goal position, if not it set at random.
  8. """
  9. def __init__(self, agent_pos=None, goal_pos=None, **kwargs):
  10. self._agent_default_pos = agent_pos
  11. self._goal_default_pos = goal_pos
  12. super().__init__(grid_size=19, max_steps=100, **kwargs)
  13. def _gen_grid(self, width, height):
  14. # Create the grid
  15. self.grid = Grid(width, height)
  16. # Generate the surrounding walls
  17. self.grid.horz_wall(0, 0)
  18. self.grid.horz_wall(0, height - 1)
  19. self.grid.vert_wall(0, 0)
  20. self.grid.vert_wall(width - 1, 0)
  21. room_w = width // 2
  22. room_h = height // 2
  23. # For each row of rooms
  24. for j in range(0, 2):
  25. # For each column
  26. for i in range(0, 2):
  27. xL = i * room_w
  28. yT = j * room_h
  29. xR = xL + room_w
  30. yB = yT + room_h
  31. # Bottom wall and door
  32. if i + 1 < 2:
  33. self.grid.vert_wall(xR, yT, room_h)
  34. pos = (xR, self._rand_int(yT + 1, yB))
  35. self.grid.set(*pos, None)
  36. # Bottom wall and door
  37. if j + 1 < 2:
  38. self.grid.horz_wall(xL, yB, room_w)
  39. pos = (self._rand_int(xL + 1, xR), yB)
  40. self.grid.set(*pos, None)
  41. # Randomize the player start position and orientation
  42. if self._agent_default_pos is not None:
  43. self.agent_pos = self._agent_default_pos
  44. self.grid.set(*self._agent_default_pos, None)
  45. self.agent_dir = self._rand_int(0, 4) # assuming random start direction
  46. else:
  47. self.place_agent()
  48. if self._goal_default_pos is not None:
  49. goal = Goal()
  50. self.put_obj(goal, *self._goal_default_pos)
  51. goal.init_pos, goal.cur_pos = self._goal_default_pos
  52. else:
  53. self.place_obj(Goal())
  54. self.mission = "reach the goal"
  55. def step(self, action):
  56. obs, reward, done, info = MiniGridEnv.step(self, action)
  57. return obs, reward, done, info
  58. register(
  59. id="MiniGrid-FourRooms-v0", entry_point="gym_minigrid.envs.fourrooms:FourRoomsEnv"
  60. )