You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

762 lines
32 KiB

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()