diff --git a/semyanovra/scr/maze.py b/semyanovra/scr/maze.py index bd40478..c5779a4 100644 --- a/semyanovra/scr/maze.py +++ b/semyanovra/scr/maze.py @@ -246,18 +246,54 @@ class AStar(SearchAlgorithm): 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__": builder = TxtLabyrinthBuilder() maze = builder.build_from_file("maze/level1.txt") - bfs = BFS() - path = bfs.compute_path(maze, maze.start, maze.exit) - print(f"BFS path length: {len(path)}") + pf = Pathfinder(maze) + pf.set_algorithm(BFS()) + stats = pf.solve() + print(f"BFS: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}") - dfs = DFS() - path = dfs.compute_path(maze, maze.start, maze.exit) - print(f"DFS path length: {len(path)}") + pf.set_algorithm(DFS()) + stats = pf.solve() + print(f"DFS: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}") - astar = AStar() - path = astar.compute_path(maze, maze.start, maze.exit) - print(f"A* path length: {len(path)}") \ No newline at end of file + pf.set_algorithm(AStar()) + stats = pf.solve() + print(f"A*: {stats.time_ms:.3f}ms, visited={stats.visited_cells}, length={stats.path_length}") \ No newline at end of file