[2] feat - оркестратор MazeSolver и статистика
This commit is contained in:
parent
acbd3a3892
commit
a966076c00
|
|
@ -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}")
|
||||||
Loading…
Reference in New Issue
Block a user