Initial commit

This commit is contained in:
mia 2025-10-16 09:37:38 +02:00
commit 52ebbfb335
7 changed files with 309 additions and 0 deletions

146
Path_Finding_L2.py Normal file
View file

@ -0,0 +1,146 @@
import sys
class Node():
def __init__(self, state, parent, action):
self.state = state
self.parent = parent
self.action = action
class StackFrontier():
def __init__(self):
self.frontier = []
def add(self, node):
self.frontier.append(node)
def contains_state(self, state):
return any(node.state == state for node in self.frontier)
def empty(self):
return len(self.frontier) == 0
def remove(self):
if self.empty():
raise Exception("empty frontier")
else:
node = self.frontier[-1]
self.frontier = self.frontier[:-1]
return node
class QueueFrontier(StackFrontier):
def remove(self):
if self.empty():
raise Exception("empty frontier")
else:
node = self.frontier[0]
self.frontier = self.frontier[1:]
return node
class Maze():
def __init__(self, filename):
# Read file and set height and width of maze
with open(filename) as f:
contents = f.read()
# Validate start and goal
if contents.count("A") != 1:
raise Exception("maze must have exactly one start point")
if contents.count("B") != 1:
raise Exception("maze must have exactly one goal")
# Determine height and width of maze
contents = contents.splitlines()
self.height = len(contents)
self.width = max(len(line) for line in contents)
# Keep track of walls
self.walls = []
for i in range(self.height):
row = []
for j in range(self.width):
try:
if contents[i][j] == "A":
self.start = (i, j)
row.append(False)
elif contents[i][j] == "B":
self.goal = (i, j)
row.append(False)
elif contents[i][j] == " ":
row.append(False)
else:
row.append(True)
except IndexError:
row.append(False)
self.walls.append(row)
self.solution = None
def print(self):
"""
Prints the maze to the console, displaying walls, the start and goal positions,
and the solution path if it exists.
The method uses different characters to represent various elements in the maze:
- '' for walls
- 'A' for the start position
- 'B' for the goal position
- '*' for the solution path, if available
- ' ' for open spaces
If a solution has been found, the path from the start to the goal will be shown
with asterisks ('*').
Returns:
None
"""
raise NotImplementedError("neighbors method is not implemented yet")
def neighbors(self, state):
"""
Returns a list of neighboring states in the maze that can be reached
from the current state.
Args:
state (tuple): The current position in the maze as (row, col).
Returns:
list: A list of tuples representing neighboring positions
that can be moved to.
"""
raise NotImplementedError("neighbors method is not implemented yet")
def solve(self):
"""
Finds a solution to the maze using breadth-first search (BFS) if one exists.
Returns:
None: Modifies the class attributes to store the solution path
and number of states explored.
"""
raise NotImplementedError("solve method is not implemented yet")
def output_image(self, filename, show_solution=True, show_explored=False):
raise NotImplementedError("output_image method is not implemented yet")
if len(sys.argv) != 2:
sys.exit("Usage: python Path_Finding_L2.py maze.txt")
m = Maze(sys.argv[1])
print("Maze:")
m.print()
print("Solving...")
m.solve()
print("States Explored:", m.num_explored)
print("Solution:")
m.print()
#m.output_image("maze.png", show_explored=True)