112 lines
2.5 KiB
Python
112 lines
2.5 KiB
Python
|
|
import csv
|
||
|
|
|
||
|
|
from builder import TextFileMazeBuilder
|
||
|
|
from strategies import BFSStrategy, DFSStrategy, AStarStrategy
|
||
|
|
from solver import MazeSolver
|
||
|
|
from observer import ConsoleView
|
||
|
|
|
||
|
|
|
||
|
|
def print_path(maze, path):
|
||
|
|
path_coords = {(cell.x, cell.y) for cell in path}
|
||
|
|
|
||
|
|
for row in maze.cells:
|
||
|
|
line = ""
|
||
|
|
|
||
|
|
for cell in row:
|
||
|
|
if cell.is_wall:
|
||
|
|
line += "#"
|
||
|
|
elif cell.is_start:
|
||
|
|
line += "S"
|
||
|
|
elif cell.is_exit:
|
||
|
|
line += "E"
|
||
|
|
elif (cell.x, cell.y) in path_coords:
|
||
|
|
line += "*"
|
||
|
|
else:
|
||
|
|
line += " "
|
||
|
|
|
||
|
|
print(line)
|
||
|
|
|
||
|
|
|
||
|
|
builder = TextFileMazeBuilder()
|
||
|
|
|
||
|
|
maze_files = [
|
||
|
|
"docs/task2/mazes/small.txt",
|
||
|
|
"docs/task2/mazes/medium.txt",
|
||
|
|
"docs/task2/mazes/blocked.txt",
|
||
|
|
"docs/task2/mazes/large.txt",
|
||
|
|
"docs/task2/mazes/empty.txt",
|
||
|
|
"docs/task2/mazes/no_exit.txt"
|
||
|
|
]
|
||
|
|
|
||
|
|
strategies = [
|
||
|
|
BFSStrategy(),
|
||
|
|
DFSStrategy(),
|
||
|
|
AStarStrategy()
|
||
|
|
]
|
||
|
|
|
||
|
|
results = []
|
||
|
|
|
||
|
|
for maze_file in maze_files:
|
||
|
|
print("\n======================")
|
||
|
|
print("Maze:", maze_file)
|
||
|
|
|
||
|
|
try:
|
||
|
|
maze = builder.build_from_file(maze_file)
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
print("Error:", e)
|
||
|
|
continue
|
||
|
|
|
||
|
|
for strategy in strategies:
|
||
|
|
print("\nStrategy:", strategy.__class__.__name__)
|
||
|
|
|
||
|
|
solver = MazeSolver(maze, strategy)
|
||
|
|
|
||
|
|
observer = ConsoleView()
|
||
|
|
solver.add_observer(observer)
|
||
|
|
|
||
|
|
runs = 5
|
||
|
|
total_time = 0
|
||
|
|
last_stats = None
|
||
|
|
last_path = []
|
||
|
|
|
||
|
|
for _ in range(runs):
|
||
|
|
stats, path = solver.solve()
|
||
|
|
|
||
|
|
total_time += stats.time_ms
|
||
|
|
last_stats = stats
|
||
|
|
last_path = path
|
||
|
|
|
||
|
|
average_time = total_time / runs
|
||
|
|
|
||
|
|
print("Average time ms:", round(average_time, 4))
|
||
|
|
print("Visited:", last_stats.visited_cells)
|
||
|
|
print("Path length:", last_stats.path_length)
|
||
|
|
|
||
|
|
if last_path:
|
||
|
|
print_path(maze, last_path)
|
||
|
|
else:
|
||
|
|
print("Path not found")
|
||
|
|
|
||
|
|
results.append([
|
||
|
|
maze_file,
|
||
|
|
strategy.__class__.__name__,
|
||
|
|
round(average_time, 4),
|
||
|
|
last_stats.visited_cells,
|
||
|
|
last_stats.path_length
|
||
|
|
])
|
||
|
|
|
||
|
|
with open("maze_results.csv", "w", newline="", encoding="utf-8") as file:
|
||
|
|
writer = csv.writer(file)
|
||
|
|
|
||
|
|
writer.writerow([
|
||
|
|
"maze",
|
||
|
|
"strategy",
|
||
|
|
"time_ms",
|
||
|
|
"visited_cells",
|
||
|
|
"path_length"
|
||
|
|
])
|
||
|
|
|
||
|
|
writer.writerows(results)
|
||
|
|
|
||
|
|
print("\nResults saved to maze_results.csv")
|