[2] feat - оркестратор MazeSolver и статистика

This commit is contained in:
semyanovra 2026-05-24 14:08:34 +00:00
parent acbd3a3892
commit a966076c00

View File

@ -246,18 +246,54 @@ class AStar(SearchAlgorithm):
return [] return []
# ----------------------------- Оркестратор -----------------------------
class Pathfinder:
def __init__(self, maze):
self._maze = maze
self._algorithm = None
self._listeners = []
def attach(self, listener):
self._listeners.append(listener)
def notify(self, event, data):
for lst in self._listeners:
lst.update(event, data)
def set_algorithm(self, algorithm):
self._algorithm = algorithm
def solve(self):
if self._algorithm is None:
return None
t0 = time.perf_counter()
path = self._algorithm.compute_path(self._maze, self._maze.start, self._maze.exit)
t1 = time.perf_counter()
elapsed_ms = (t1 - t0) * 1000
return PerformanceData(elapsed_ms, self._algorithm.visited_nodes(), len(path))
class PerformanceData:
def __init__(self, time_ms, visited, length):
self.time_ms = time_ms
self.visited_cells = visited
self.path_length = length
if __name__ == "__main__": if __name__ == "__main__":
builder = TxtLabyrinthBuilder() builder = TxtLabyrinthBuilder()
maze = builder.build_from_file("maze/level1.txt") maze = builder.build_from_file("maze/level1.txt")
bfs = BFS() pf = Pathfinder(maze)
path = bfs.compute_path(maze, maze.start, maze.exit) pf.set_algorithm(BFS())
print(f"BFS path length: {len(path)}") stats = pf.solve()
print(f"BFS: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}")
dfs = DFS() pf.set_algorithm(DFS())
path = dfs.compute_path(maze, maze.start, maze.exit) stats = pf.solve()
print(f"DFS path length: {len(path)}") print(f"DFS: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}")
astar = AStar() pf.set_algorithm(AStar())
path = astar.compute_path(maze, maze.start, maze.exit) stats = pf.solve()
print(f"A* path length: {len(path)}") print(f"A*: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}")