in data/envs/babyai/bot_agent.py [0:0]
def _shortest_path(self, accept_fn, try_with_blockers=False):
"""
Finds the path to any of the locations that satisfy `accept_fn`.
Prefers the paths that avoid blockers for as long as possible.
"""
# Initial states to visit (BFS)
initial_states = [(*self.mission.unwrapped.agent_pos, *self.mission.unwrapped.dir_vec)]
path = finish = None
with_blockers = False
path, finish, previous_pos = self._breadth_first_search(initial_states, accept_fn, ignore_blockers=False)
if not path and try_with_blockers:
with_blockers = True
path, finish, _ = self._breadth_first_search(
[(i, j, 1, 0) for i, j in previous_pos], accept_fn, ignore_blockers=True
)
if path:
# `path` now contains the path to a cell that is reachable without
# blockers. Now let's add the path to this cell
pos = path[-1]
extra_path = []
while pos:
extra_path.append(pos)
pos = previous_pos[pos]
path = path + extra_path[1:]
if path:
# And the starting position is not required
path = path[::-1]
path = path[1:]
# Note, that with_blockers only makes sense if path is not None
return path, finish, with_blockers