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