diff --git a/HW11/Minigrid/minigrid/__init__.py b/HW11/Minigrid/minigrid/__init__.py index 6288130..535c119 100644 --- a/HW11/Minigrid/minigrid/__init__.py +++ b/HW11/Minigrid/minigrid/__init__.py @@ -21,6 +21,10 @@ except Exception: # nosec def register_minigrid_envs(): + register( + id="MiniGrid-MCHW11Env-v0", + entry_point="minigrid.envs:MCHW11Env", + ) # BlockedUnlockPickup # ---------------------------------------- diff --git a/HW11/Minigrid/minigrid/envs/__init__.py b/HW11/Minigrid/minigrid/envs/__init__.py index 12b1992..4e316ea 100644 --- a/HW11/Minigrid/minigrid/envs/__init__.py +++ b/HW11/Minigrid/minigrid/envs/__init__.py @@ -35,3 +35,4 @@ from minigrid.envs.putnear import PutNearEnv from minigrid.envs.redbluedoors import RedBlueDoorEnv from minigrid.envs.unlock import UnlockEnv from minigrid.envs.unlockpickup import UnlockPickupEnv +from minigrid.envs.mchw11 import MCHW11Env diff --git a/HW11/Minigrid/minigrid/envs/mchw11.py b/HW11/Minigrid/minigrid/envs/mchw11.py new file mode 100644 index 0000000..98330ec --- /dev/null +++ b/HW11/Minigrid/minigrid/envs/mchw11.py @@ -0,0 +1,77 @@ +from __future__ import annotations +import math + +from numpy.random import default_rng + +from minigrid.core.constants import COLOR_NAMES +from minigrid.core.grid import Grid +from minigrid.core.mission import MissionSpace +from minigrid.envs.lavaslippery import LavaSlipperyEnv +from minigrid.core.world_object import ( + Ball, + Box, + Key, + Slippery, + Lava, + Goal, + Point + ) + +from minigrid.minigrid_env import MiniGridEnv, is_slippery + +import numpy as np + +from loguru import logger + +class MCHW11Env(LavaSlipperyEnv): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def _gen_grid(self, width, height): + super()._gen_grid(width, height) + + self.probability_intended = 0.91 + + slippery = Slippery(probability_intended=self.probability_intended) + for x in range(1, self.width - 1): + for y in range(1, self.height - 1): + self.grid.set(x,y, slippery) + + self.disable_random_start() + + self.put_obj(Lava(),4,3) + self.put_obj(Lava(),7,3) + self.put_obj(Lava(),1,9) + + + + agent_dir = 1 # We do not consider envs where the robot can turn + self.probability_turn_intended = 0.0 + self.place_agent(agent_pos=np.array((1,1)), agent_dir=agent_dir, spawn_on_slippery=True) + self.place_goal(np.array((width - 2, height - 2))) + if self.dense_rewards: self.run_bfs() + + def place_agent(self, spawn_on_slippery=False, agent_pos=None, agent_dir=0): + max_tries = 10_000 + num_tries = 0 + + if self.randomize_start == True: + while True: + num_tries += 1 + if num_tries > max_tries: + raise RecursionError("rejection sampling failed in place_agent") + x = np.random.randint(0, self.width) + y = np.random.randint(0, 3) + + cell = self.grid.get(*(x,y)) + if cell is None or (cell.can_overlap() and not isinstance(cell, Lava) and not isinstance(cell, Goal) and (spawn_on_slippery or not is_slippery(cell))): + self.agent_pos = np.array((x, y)) + self.agent_dir = np.random.randint(0, 4) + break + elif agent_dir is None: + #self.agent_pos = np.array((1, 1)) + self.agent_dir = 0 + else: + self.agent_pos = agent_pos + self.agent_dir = agent_dir +