Frozenlake Visualisation¶
[26]:
import gymnasium as gym
[27]:
from gymcts.gymcts_agent import GymctsAgent
from gymcts.gymcts_deepcopy_wrapper import DeepCopyMCTSGymEnvWrapper
[28]:
from gymcts.logger import log
[29]:
log.setLevel(20)
[30]:
if __name__ == '__main__':
log.debug("Starting example")
# 0. create the environment
env = gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=False, render_mode="rgb_array")
env.reset()
# 1. wrap the environment with the naive wrapper or a custom gymcts wrapper
env = DeepCopyMCTSGymEnvWrapper(env)
# 2. create the agent
agent = GymctsAgent(
env=env,
clear_mcts_tree_after_step=False,
render_tree_after_step=True,
number_of_simulations_per_step=200,
exclude_unvisited_nodes_from_render=True
)
# 3. solve the environment
actions = agent.solve()
# 4. render the environment solution
env = gym.wrappers.RecordVideo(
env,
video_folder="./videos",
episode_trigger=lambda episode_id: True,
name_prefix="frozenlake_4x4"
)
env.reset()
for a in actions:
obs, rew, term, trun, info = env.step(a)
env.close()
# 5. print the solution
# read the solution from the info provided by the RecordEpisodeStatistics wrapper (that NaiveSoloMCTSGymEnvWrapper wraps internally)
episode_length = info["episode"]["l"]
episode_return = info["episode"]["r"]
if episode_return == 1.0:
print(f"Environment solved in {episode_length} steps.")
else:
print(f"Environment not solved in {episode_length} steps.")
(N=200, Q_v=0.02, best=1.00)
├── (a=0, N=44, Q_v=0.00, best=0.00, ubc=0.25)
│ ├── (a=0, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ ├── (a=1, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ ├── (a=2, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=3, N=10, Q_v=0.00, best=0.00, ubc=0.43)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.62)
│ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.76)
├── (a=1, N=44, Q_v=0.00, best=0.00, ubc=0.25)
│ ├── (a=0, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ ├── (a=1, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ ├── (a=2, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ └── (a=3, N=10, Q_v=0.00, best=0.00, ubc=0.43)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.62)
│ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.76)
├── (a=2, N=67, Q_v=0.04, best=1.00, ubc=0.24)
│ ├── (a=0, N=18, Q_v=0.06, best=1.00, ubc=0.40)
│ │ ├── (a=0, N=5, Q_v=0.00, best=0.00, ubc=0.54)
│ │ ├── (a=1, N=4, Q_v=0.00, best=0.00, ubc=0.60)
│ │ ├── (a=2, N=4, Q_v=0.00, best=0.00, ubc=0.60)
│ │ └── (a=3, N=4, Q_v=0.00, best=0.00, ubc=0.60)
│ ├── (a=1, N=13, Q_v=0.00, best=0.00, ubc=0.40)
│ ├── (a=2, N=22, Q_v=0.09, best=1.00, ubc=0.40)
│ │ ├── (a=0, N=4, Q_v=0.00, best=0.00, ubc=0.62)
│ │ ├── (a=1, N=9, Q_v=0.22, best=1.00, ubc=0.64)
│ │ ├── (a=2, N=4, Q_v=0.00, best=0.00, ubc=0.62)
│ │ └── (a=3, N=4, Q_v=0.00, best=0.00, ubc=0.62)
│ └── (a=3, N=13, Q_v=0.00, best=0.00, ubc=0.40)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.65)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.65)
│ ├── (a=2, N=3, Q_v=0.00, best=0.00, ubc=0.65)
│ └── (a=3, N=3, Q_v=0.00, best=0.00, ubc=0.65)
└── (a=3, N=44, Q_v=0.00, best=0.00, ubc=0.25)
├── (a=0, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
├── (a=1, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
├── (a=2, N=11, Q_v=0.00, best=0.00, ubc=0.41)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
└── (a=3, N=10, Q_v=0.00, best=0.00, ubc=0.43)
├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.62)
├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.76)
├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.76)
└── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.76)
[16:50:26] INFO selected action 2 after 200 simulations.
INFO current action list: [2]
(a=2, N=267, Q_v=0.36, best=1.00, ubc=0.47)
├── (a=0, N=41, Q_v=0.02, best=1.00, ubc=0.29)
│ ├── (a=0, N=10, Q_v=0.00, best=0.00, ubc=0.43)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.62)
│ │ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ ├── (a=1, N=10, Q_v=0.00, best=0.00, ubc=0.43)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.62)
│ │ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ ├── (a=2, N=10, Q_v=0.00, best=0.00, ubc=0.43)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.62)
│ │ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ └── (a=3, N=10, Q_v=0.00, best=0.00, ubc=0.43)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.62)
│ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.76)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.76)
├── (a=1, N=34, Q_v=0.00, best=0.00, ubc=0.29)
├── (a=2, N=157, Q_v=0.61, best=1.00, ubc=0.74)
│ ├── (a=0, N=11, Q_v=0.00, best=0.00, ubc=0.48)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ ├── (a=1, N=123, Q_v=0.78, best=1.00, ubc=0.92)
│ │ ├── (a=0, N=4, Q_v=0.00, best=0.00, ubc=0.78)
│ │ ├── (a=1, N=110, Q_v=0.87, best=1.00, ubc=1.02)
│ │ ├── (a=2, N=4, Q_v=0.00, best=0.00, ubc=0.78)
│ │ └── (a=3, N=4, Q_v=0.00, best=0.00, ubc=0.78)
│ ├── (a=2, N=11, Q_v=0.00, best=0.00, ubc=0.48)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=3, N=11, Q_v=0.00, best=0.00, ubc=0.48)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
└── (a=3, N=34, Q_v=0.00, best=0.00, ubc=0.29)
├── (a=0, N=9, Q_v=0.00, best=0.00, ubc=0.44)
│ ├── (a=0, N=2, Q_v=0.00, best=0.00, ubc=0.74)
│ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.74)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.74)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.74)
├── (a=1, N=8, Q_v=0.00, best=0.00, ubc=0.47)
├── (a=2, N=8, Q_v=0.00, best=0.00, ubc=0.47)
│ ├── (a=0, N=2, Q_v=0.00, best=0.00, ubc=0.72)
│ ├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.72)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.72)
│ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=1.02)
└── (a=3, N=8, Q_v=0.00, best=0.00, ubc=0.47)
├── (a=0, N=2, Q_v=0.00, best=0.00, ubc=0.72)
├── (a=1, N=2, Q_v=0.00, best=0.00, ubc=0.72)
├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.72)
└── (a=3, N=1, Q_v=0.00, best=0.00, ubc=1.02)
INFO selected action 2 after 200 simulations.
INFO current action list: [2, 2]
(a=2, N=357, Q_v=0.80, best=1.00, ubc=0.90)
├── (a=0, N=11, Q_v=0.00, best=0.00, ubc=0.52)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ │ └── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.59)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.59)
├── (a=1, N=323, Q_v=0.89, best=1.00, ubc=0.98)
│ ├── (a=0, N=4, Q_v=0.00, best=0.00, ubc=0.85)
│ ├── (a=1, N=310, Q_v=0.93, best=1.00, ubc=1.02)
│ │ ├── (a=0, N=5, Q_v=0.20, best=1.00, ubc=0.96)
│ │ ├── (a=1, N=296, Q_v=0.96, best=1.00, ubc=1.06)
│ │ ├── (a=2, N=3, Q_v=0.00, best=0.00, ubc=0.98)
│ │ └── (a=3, N=5, Q_v=0.20, best=1.00, ubc=0.96)
│ ├── (a=2, N=4, Q_v=0.00, best=0.00, ubc=0.85)
│ └── (a=3, N=4, Q_v=0.00, best=0.00, ubc=0.85)
│ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.83)
│ ├── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.83)
│ └── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.83)
├── (a=2, N=11, Q_v=0.00, best=0.00, ubc=0.52)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ │ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ │ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ │ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.59)
│ └── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.59)
└── (a=3, N=11, Q_v=0.00, best=0.00, ubc=0.52)
├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ └── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.74)
├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.63)
│ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ └── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.74)
├── (a=2, N=2, Q_v=0.00, best=0.00, ubc=0.77)
│ └── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.59)
└── (a=3, N=2, Q_v=0.00, best=0.00, ubc=0.77)
└── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.59)
[16:50:27] INFO selected action 1 after 200 simulations.
INFO current action list: [2, 2, 1]
(a=1, N=523, Q_v=0.93, best=1.00, ubc=1.01)
├── (a=0, N=4, Q_v=0.00, best=0.00, ubc=0.88)
├── (a=1, N=510, Q_v=0.95, best=1.00, ubc=1.03)
│ ├── (a=0, N=5, Q_v=0.20, best=1.00, ubc=0.99)
│ │ ├── (a=0, N=1, Q_v=1.00, best=1.00, ubc=1.90)
│ │ ├── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.90)
│ │ ├── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.90)
│ │ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.90)
│ ├── (a=1, N=496, Q_v=0.97, best=1.00, ubc=1.05)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=1.02)
│ │ ├── (a=1, N=164, Q_v=0.96, best=1.00, ubc=1.09)
│ │ ├── (a=2, N=325, Q_v=1.00, best=1.00, ubc=1.10)
│ │ └── (a=3, N=3, Q_v=0.00, best=0.00, ubc=1.02)
│ ├── (a=2, N=3, Q_v=0.00, best=0.00, ubc=1.02)
│ └── (a=3, N=5, Q_v=0.20, best=1.00, ubc=0.99)
│ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.90)
│ ├── (a=1, N=1, Q_v=1.00, best=1.00, ubc=1.90)
│ ├── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.90)
│ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.90)
├── (a=2, N=4, Q_v=0.00, best=0.00, ubc=0.88)
└── (a=3, N=4, Q_v=0.00, best=0.00, ubc=0.88)
├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.83)
├── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.83)
└── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.83)
INFO selected action 1 after 200 simulations.
INFO current action list: [2, 2, 1, 1]
(a=1, N=710, Q_v=0.96, best=1.00, ubc=1.03)
├── (a=0, N=5, Q_v=0.20, best=1.00, ubc=1.01)
│ ├── (a=0, N=1, Q_v=1.00, best=1.00, ubc=1.90)
│ ├── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.90)
│ ├── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.90)
│ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.90)
├── (a=1, N=696, Q_v=0.98, best=1.00, ubc=1.05)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=1.04)
│ │ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ │ └── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ ├── (a=1, N=206, Q_v=0.96, best=1.00, ubc=1.08)
│ │ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.94)
│ │ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.94)
│ │ ├── (a=2, N=196, Q_v=1.00, best=1.00, ubc=1.12)
│ │ └── (a=3, N=3, Q_v=0.00, best=0.00, ubc=0.94)
│ ├── (a=2, N=483, Q_v=1.00, best=1.00, ubc=1.08)
│ └── (a=3, N=3, Q_v=0.00, best=0.00, ubc=1.04)
│ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.74)
├── (a=2, N=3, Q_v=0.00, best=0.00, ubc=1.05)
└── (a=3, N=5, Q_v=0.20, best=1.00, ubc=1.01)
├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.90)
├── (a=1, N=1, Q_v=1.00, best=1.00, ubc=1.90)
├── (a=2, N=1, Q_v=0.00, best=0.00, ubc=0.90)
└── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.90)
INFO selected action 1 after 200 simulations.
INFO current action list: [2, 2, 1, 1, 1]
(a=1, N=896, Q_v=0.98, best=1.00, ubc=1.04)
├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=1.06)
│ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ └── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.74)
├── (a=1, N=303, Q_v=0.97, best=1.00, ubc=1.08)
│ ├── (a=0, N=3, Q_v=0.00, best=0.00, ubc=0.98)
│ │ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ │ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ ├── (a=1, N=3, Q_v=0.00, best=0.00, ubc=0.98)
│ │ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ │ └── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ ├── (a=2, N=293, Q_v=1.00, best=1.00, ubc=1.10)
│ └── (a=3, N=3, Q_v=0.00, best=0.00, ubc=0.98)
│ ├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
│ └── (a=1, N=1, Q_v=0.00, best=0.00, ubc=0.74)
├── (a=2, N=586, Q_v=1.00, best=1.00, ubc=1.08)
└── (a=3, N=3, Q_v=0.00, best=0.00, ubc=1.06)
├── (a=0, N=1, Q_v=0.00, best=0.00, ubc=0.74)
└── (a=3, N=1, Q_v=0.00, best=0.00, ubc=0.74)
INFO selected action 2 after 200 simulations.
INFO current action list: [2, 2, 1, 1, 1, 2]
INFO Final action list: [2, 2, 1, 1, 1, 2]
Environment solved in 6 steps.