The goal of this assignment is to find your way out of a maze using breadth-first search.
Here is a basic algorithm for BFS in an unweighted graph:
bfs(start vertex, goal vertex)
make frontier an empty queue
enqueue start onto frontier
until frontier is empty
dequeue parent off frontier
for each undiscovered child of parent
enqueue child onto frontier
stop if child is the goal
To apply this algorithm to a maze, think of grid locations as vertices. The "children" of a grid location are the open cells adjacent to it in the four cardinal directions.
A Maze class and an Agent class have been started for you below. Once you complete the indicated methods, you will be able to watch the agent navigate the maze. Adjust the height of your console window to match the maze height, so that each display appears in the same place.
Algorithm notes:
Python notes:
__hash__ and __eq__ and __ne__ methods of the Maze class.
import time
class Maze(object):
"""A pathfinding problem."""
def __init__(self, grid, location):
"""Instances differ by their current agent locations."""
self.grid = grid
self.location = location
def display(self):
"""Print the maze, marking the current agent location."""
for r in range(len(self.grid)):
for c in range(len(self.grid[r])):
if (r, c) == self.location:
print '*',
else:
print self.grid[r][c],
print
print
def moves(self):
"""Return a list of possible moves given the current agent location."""
# YOU FILL THIS IN
def neighbor(self, move):
"""Return another Maze instance with a move made."""
# YOU FILL THIS IN
class Agent(object):
"""Knows how to find the exit to a maze with BFS."""
def bfs(self, maze, goal):
"""Return an ordered list of moves to get the maze to match the goal."""
# YOU FILL THIS IN
def main():
"""Create a maze, solve it with BFS, and console-animate."""
grid = ["XXXXXXXXXXXXXXXXXXXX",
"X X X X",
"X XXXXX XXXX XXX XXX",
"X X X X X",
"X X XXX XXXXXX X X X",
"X X X X X X",
"X XXX XXXXXX XXXXX X",
"X XXX X X X X",
"X XXX XXXXX",
"XXXXX XXXXXX X",
"X XXX X X X X X",
"XXX XXX X X XXXX X X",
"X X X XX X X X",
"XXXXX XXXX X XXX",
"X X XXX X X",
"X XXXXX X XXXX XXX X",
"X X X X X X",
"X X XXXXXX X XXXXX X",
"X X X",
"XXXXXXXXXXXXXXXXXX X"]
maze = Maze(grid, (1,1))
maze.display()
agent = Agent()
goal = Maze(grid, (19,18))
path = agent.bfs(maze, goal)
while path:
move = path.pop(0)
maze = maze.neighbor(move)
time.sleep(0.25)
maze.display()
if __name__ == '__main__':
main()