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 RandomFrozenLake(LavaSlipperyEnv): def __init__(self, seed, lava_percentage=15, *args, **kwargs): self.seed=seed self.lava_percentage = lava_percentage super().__init__(*args, **kwargs) def _gen_grid(self, width, height): # logger.error("_gen_grid CALLED") super()._gen_grid(width, height) num_fields = (self.width-2) * (self.height-2) #num_holes = 1 slippery = Slippery(probability_intended=self.probability_intended, probability_turn_intended=self.probability_turn_intended) for x in range(1, self.width - 1): for y in range(1, self.height - 1): self.grid.set(x,y, slippery) rng = default_rng(seed=self.seed) area_size = 5 num_grid_cells = math.floor((self.width-2) / area_size) if self.lava_percentage == 20: random_shape_index = rng.integers(low=10, high=18, size=num_grid_cells*num_grid_cells) elif self.lava_percentage == 4: random_shape_index = rng.integers(low=0, high=3, size=num_grid_cells*num_grid_cells) else: random_shape_index = rng.integers(low=0, high=18, size=num_grid_cells*num_grid_cells) random_rotation = rng.integers(low=0, high=4, size=num_grid_cells*num_grid_cells) for current_column in range(num_grid_cells): for current_row in range(num_grid_cells): current_shape = random_shape_index[current_column*num_grid_cells + current_row] current_rotation = random_rotation[current_column*num_grid_cells + current_row] middle_column = current_column * area_size + 2 + 1 middle_row = current_row * area_size + 2 + 1 self.put_obj(Lava(),middle_column,middle_row) if current_shape == 0: continue elif current_shape >= 1: self.put_obj(Lava(),middle_column,middle_row) if current_shape == 2: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) elif current_shape == 3: if current_rotation == 0 or current_rotation == 2: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column-1,middle_row) else: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row-1) elif current_shape == 4: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) elif current_shape == 5: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) self.put_obj(Lava(),middle_column-1,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) self.put_obj(Lava(),middle_column,middle_row-1) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) self.put_obj(Lava(),middle_column+1,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) self.put_obj(Lava(),middle_column,middle_row+1) elif current_shape == 6: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+1,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row+1) self.put_obj(Lava(),middle_column,middle_row-1) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-1,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row-1) self.put_obj(Lava(),middle_column,middle_row+1) elif current_shape == 7: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) elif current_shape == 8: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row+1) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-1,middle_row+1) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row-1) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+1,middle_row-1) elif current_shape == 9: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+1,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row+1) self.put_obj(Lava(),middle_column,middle_row-1) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-1,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row-1) self.put_obj(Lava(),middle_column,middle_row+1) elif current_shape == 10: if current_rotation == 0 or current_rotation == 2: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) elif current_rotation == 1 or current_rotation == 3: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) elif current_shape == 11: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) elif current_shape == 12: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column+1,middle_row) elif current_shape == 13: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+1,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row+1) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-1,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row-1) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) elif current_shape == 14: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+1,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row+1) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-1,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row-1) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) elif current_shape == 15: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) elif current_shape == 16: if current_rotation == 0: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) elif current_rotation == 2: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) else: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) elif current_shape == 17: if current_rotation == 0: self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column-2,middle_row) elif current_rotation == 1: self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row-2) elif current_rotation == 2: self.put_obj(Lava(),middle_column,middle_row-1) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column+2,middle_row) else: self.put_obj(Lava(),middle_column+1,middle_row) self.put_obj(Lava(),middle_column-1,middle_row) self.put_obj(Lava(),middle_column,middle_row+1) self.put_obj(Lava(),middle_column,middle_row+2) agent_dir = np.random.choice(1, 1)[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 reset( self, *, seed: int | None = None, options: dict[str, Any] | None = None, ) -> tuple[ObsType, dict[str, Any]]: return super().reset(seed=seed) class FrozenLakeSmall(LavaSlipperyEnv): """ "4x4":[ "SFFF", "FHFH", "FFFH", "HFFG" ] """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) slippery = Slippery(probability_intended=self.probability_intended, probability_turn_intended=self.probability_turn_intended) for x in range(1, self.width - 1): for y in range(1, self.height - 1): #self.grid.set(x,y, slippery_east) self.grid.set(x,y, slippery) self.disable_random_start() self.put_obj(Lava(),2,2) self.put_obj(Lava(),4,2) self.put_obj(Lava(),4,3) self.put_obj(Lava(),1,4) agent_dir = np.random.choice(1, 1)[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() class FrozenLake(LavaSlipperyEnv): """ "8x8": [ "SFFFFFFF", "FFFFFFFF", "FFFHFFFF", "FFFFFHFF", "FFFHFFFF", "FHHFFFHF", "FHFFHFHF", "FFFHFFFG", ] """ 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 self.probability_turn_intended = 0.95 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_east) self.grid.set(x,y, slippery) self.disable_random_start() self.put_obj(Lava(),4,3) #self.put_obj(Lava(),6,4) #self.put_obj(Lava(),4,5) #self.put_obj(Lava(),2,6) #self.put_obj(Lava(),3,6) #self.put_obj(Lava(),7,6) #self.put_obj(Lava(),2,7) #self.put_obj(Lava(),5,7) #self.put_obj(Lava(),7,7) #self.put_obj(Lava(),4,8) agent_dir = 1# np.random.choice(4, 1)[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 class FrozenLakeBig(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) slippery = Slippery(probability_intended=self.probability_intended, probability_turn_intended=self.probability_turn_intended) for x in range(1, self.width - 1): for y in range(1, self.height - 1): #self.grid.set(x,y, slippery_east) self.grid.set(x,y, slippery) self.disable_random_start() self.put_obj(Lava(),4,3) self.put_obj(Lava(),12,3) self.put_obj(Lava(),6,4) self.put_obj(Lava(),4,5) self.put_obj(Lava(),2,6) self.put_obj(Lava(),3,6) self.put_obj(Lava(),7,6) self.put_obj(Lava(),10,6) self.put_obj(Lava(),2,7) self.put_obj(Lava(),5,7) self.put_obj(Lava(),7,7) self.put_obj(Lava(),4,8) self.put_obj(Lava(),9,9) self.put_obj(Lava(),10,1) self.put_obj(Lava(),10,6) self.put_obj(Lava(),10,11) self.put_obj(Lava(),10,12) agent_dir = np.random.choice(4, 1)[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() class LavaSlipperyMazeAllSlip(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) slippery = Slippery(probability_intended=self.probability_intended, probability_turn_intended=self.probability_turn_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(), 5, 4) #self.put_obj(Lava(), 3, 6) #self.put_obj(Lava(), 4, 12) #self.put_obj(Lava(), 4, 11) #self.put_obj(Lava(), 5, 11) #self.put_obj(Lava(), 15, 3) #self.put_obj(Lava(), 18, 6) #self.put_obj(Lava(), 13, 8) #self.put_obj(Lava(), 12, 10) #self.put_obj(Lava(), 12, 11) #self.put_obj(Lava(), 18, 11) #self.put_obj(Lava(), 16, 13) #self.put_obj(Lava(), 18, 15) agent_dir = np.random.choice(4, 1)[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() class LavaSlipperyMazeAllSlipSmall(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) slippery = Slippery(probability_intended=self.probability_intended, probability_turn_intended=self.probability_turn_intended) for x in range(1, self.width - 1): for y in range(1, self.height - 1): #self.grid.set(x,y, slippery_east) self.grid.set(x,y, slippery) self.disable_random_start() self.put_obj(Lava(), 3, 3) #self.put_obj(Lava(), 7, 7) #self.put_obj(Lava(), 3, 6) #self.put_obj(Lava(), 3, 5) #self.put_obj(Lava(), 4, 4) #self.put_obj(Lava(), 5, 1) #self.put_obj(Lava(), 3, 4) #self.grid.vert_wall(width-2,1,height-2, obj_type=Lava()) agent_dir = np.random.choice(4, 1)[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() class LavaSlipperyMazeAllSlipDifferentPaths(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) start_pos = np.array(((self.width-2)//2, 1)) for x in range(1, self.width - 1): for y in range(1, self.height - 1): self.grid.set(x,y, slippery) #self.grid.set(*start_pos, None) self.disable_random_start() self.put_obj(Lava(), 1, 1) self.put_obj(Lava(), 3, 3) self.put_obj(Lava(), 4, 4) self.put_obj(Lava(), 3, 6) self.put_obj(Lava(), 17, 2) self.put_obj(Lava(), 17, 5) self.put_obj(Lava(), 9, 6) self.put_obj(Lava(), 8, 7) self.put_obj(Lava(), 9, 7) self.put_obj(Lava(), 4, 12) self.put_obj(Lava(), 4, 11) self.put_obj(Lava(), 5, 11) self.put_obj(Lava(), 15, 3) self.put_obj(Lava(), 13, 8) self.put_obj(Lava(), 12, 10) self.put_obj(Lava(), 12, 11) self.put_obj(Lava(), 17, 9) self.put_obj(Lava(), 18, 10) self.put_obj(Lava(), 18, 13) self.put_obj(Lava(), 18, 16) self.put_obj(Lava(), 2, 14) self.put_obj(Lava(), 3, 16) self.put_obj(Lava(), 4, 16) self.put_obj(Lava(), 5, 16) self.put_obj(Lava(), 7, 16) agent_dir = np.random.choice(4, 1)[0] self.place_agent(agent_pos=start_pos, agent_dir=agent_dir, spawn_on_slippery=True) self.place_goal(np.array((3*self.width // 4, height - 2))) if self.dense_rewards: self.run_bfs() class LavaSlipperyMazeAllSlipWallsSmall(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) start_pos = np.array(((self.width-2)//2, 1)) slippery = Slippery(probability_intended=self.probability_intended, probability_turn_intended=self.probability_turn_intended) for x in range(1, self.width - 1): for y in range(1, self.height - 1): self.grid.set(x,y, slippery) #self.grid.set(*start_pos, None) self.disable_random_start() y = 1 self.grid.horz_wall(2,y,3, obj_type=Lava()) self.grid.horz_wall(16,y,2, obj_type=Lava()) y = 4 self.grid.horz_wall(3,y,2, obj_type=Lava()) self.grid.horz_wall(9,y,3, obj_type=Lava()) self.grid.horz_wall(15,y,3, obj_type=Lava()) y = 8 self.grid.horz_wall(2,y,3, obj_type=Lava()) self.grid.horz_wall(13,y,2, obj_type=Lava()) self.grid.horz_wall(17,y,1, obj_type=Lava()) agent_dir = np.random.choice(4, 1)[0] self.place_agent(agent_pos=start_pos, agent_dir=agent_dir, spawn_on_slippery=True) self.place_goal(np.array((1*self.width // 2, height - 2))) if self.dense_rewards: self.run_bfs() class LavaSlipperyMazeAllSlipWalls(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) start_pos = np.array(((self.width-2)//2, 1)) slippery = Slippery(probability_intended=self.probability_intended, probability_turn_intended=self.probability_turn_intended) for x in range(1, self.width - 1): for y in range(1, self.height - 1): self.grid.set(x,y, slippery) #self.grid.set(*start_pos, None) self.disable_random_start() y = 1 self.grid.horz_wall(2,y,3, obj_type=Lava()) self.grid.horz_wall(16,y,2, obj_type=Lava()) y = 4 self.grid.horz_wall(3,y,2, obj_type=Lava()) self.grid.horz_wall(9,y,3, obj_type=Lava()) self.grid.horz_wall(15,y,3, obj_type=Lava()) y = 8 self.grid.horz_wall(2,y,3, obj_type=Lava()) self.grid.horz_wall(13,y,2, obj_type=Lava()) self.grid.horz_wall(17,y,1, obj_type=Lava()) y = 12 self.grid.horz_wall(3,y,6, obj_type=Lava()) self.grid.horz_wall(12,y,4, obj_type=Lava()) y = 16 self.grid.horz_wall(2,y,2, obj_type=Lava()) self.grid.horz_wall(6,y,2, obj_type=Lava()) self.grid.horz_wall(13,y,4, obj_type=Lava()) agent_dir = np.random.choice(4, 1)[0] self.place_agent(agent_pos=start_pos, agent_dir=agent_dir, spawn_on_slippery=True) self.place_goal(np.array((1*self.width // 2, height - 2))) if self.dense_rewards: self.run_bfs() class LavaSlipperyMazeAllSlipSymmetry(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) start_pos = np.array(((self.width-2)//2, 1)) for x in range(1, self.width - 1): for y in range(1, self.height - 1): self.grid.set(x,y, slippery) #self.grid.set(*start_pos, None) self.disable_random_start() agent_dir = np.random.choice(4, 1)[0] self.place_agent(agent_pos=start_pos, agent_dir=agent_dir, spawn_on_slippery=True) self.place_goal(np.array((1*self.width // 2, height - 2))) if self.dense_rewards: self.run_bfs() class LavaSlipperyMazeAllSlipBox(LavaSlipperyEnv): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _gen_grid(self, width, height): super()._gen_grid(width, height) for x in range(1, self.width - 1): for y in range(1, self.height - 1): self.grid.set(x,y, slippery_east) self.disable_random_start() self.put_obj(Box("green"), 4, 3) self.put_obj(Box("green"), 5, 4) self.put_obj(Box("green"), 3, 6) self.put_obj(Lava(), 4, 12) self.put_obj(Lava(), 4, 11) self.put_obj(Lava(), 5, 11) self.put_obj(Lava(), 15, 3) self.put_obj(Lava(), 18, 6) self.put_obj(Lava(), 13, 8) self.put_obj(Lava(), 12, 10) self.put_obj(Lava(), 12, 11) self.put_obj(Lava(), 18, 11) self.put_obj(Lava(), 16, 13) self.put_obj(Lava(), 18, 15) agent_dir = np.random.choice(4, 1)[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()