From 8c7cc741fe9fa952900647605e6fc523c7e099a1 Mon Sep 17 00:00:00 2001 From: shalovsa Date: Sun, 17 May 2026 16:50:47 +0300 Subject: [PATCH] [2] labirint --- shalovsa/lab2/docs/data/benchmark.py | 153 ++++++++++ shalovsa/lab2/docs/data/chart_время-мс.png | Bin 0 -> 62173 bytes shalovsa/lab2/docs/data/chart_длина-пути.png | Bin 0 -> 60654 bytes .../lab2/docs/data/chart_посещено-клеток.png | Bin 0 -> 71112 bytes shalovsa/lab2/docs/data/maze_builder.py | 44 +++ shalovsa/lab2/docs/data/maze_large.txt | 100 +++++++ shalovsa/lab2/docs/data/maze_medium.txt | 50 ++++ shalovsa/lab2/docs/data/maze_model.py | 62 ++++ shalovsa/lab2/docs/data/maze_no_exit.txt | 20 ++ shalovsa/lab2/docs/data/maze_open.txt | 50 ++++ shalovsa/lab2/docs/data/maze_small.txt | 10 + shalovsa/lab2/docs/data/maze_solver.py | 121 ++++++++ shalovsa/lab2/docs/data/maze_strategies.py | 100 +++++++ shalovsa/lab2/docs/data/plot_results.py | 103 +++++++ shalovsa/lab2/docs/data/results.csv | 16 + shalovsa/lab2/docs/report_maze_final.md | 275 ++++++++++++++++++ 16 files changed, 1104 insertions(+) create mode 100644 shalovsa/lab2/docs/data/benchmark.py create mode 100644 shalovsa/lab2/docs/data/chart_время-мс.png create mode 100644 shalovsa/lab2/docs/data/chart_длина-пути.png create mode 100644 shalovsa/lab2/docs/data/chart_посещено-клеток.png create mode 100644 shalovsa/lab2/docs/data/maze_builder.py create mode 100644 shalovsa/lab2/docs/data/maze_large.txt create mode 100644 shalovsa/lab2/docs/data/maze_medium.txt create mode 100644 shalovsa/lab2/docs/data/maze_model.py create mode 100644 shalovsa/lab2/docs/data/maze_no_exit.txt create mode 100644 shalovsa/lab2/docs/data/maze_open.txt create mode 100644 shalovsa/lab2/docs/data/maze_small.txt create mode 100644 shalovsa/lab2/docs/data/maze_solver.py create mode 100644 shalovsa/lab2/docs/data/maze_strategies.py create mode 100644 shalovsa/lab2/docs/data/plot_results.py create mode 100644 shalovsa/lab2/docs/data/results.csv create mode 100644 shalovsa/lab2/docs/report_maze_final.md diff --git a/shalovsa/lab2/docs/data/benchmark.py b/shalovsa/lab2/docs/data/benchmark.py new file mode 100644 index 0000000..a1225d3 --- /dev/null +++ b/shalovsa/lab2/docs/data/benchmark.py @@ -0,0 +1,153 @@ +import time +import csv +import os +import random + +from maze_builder import TextFileMazeBuilder +from maze_solver import MazeSolver +from maze_strategies import BFSStrategy, DFSStrategy, AStarStrategy + +REPEATS = 7 +OUTPUT_DIR = os.path.dirname(os.path.abspath(__file__)) +CSV_PATH = os.path.join(OUTPUT_DIR, 'results.csv') + +STRATEGIES = { + 'BFS': BFSStrategy, + 'DFS': DFSStrategy, + 'A*': AStarStrategy, +} + +MAZES = [ + ('small_10x10', 'maze_small.txt'), + ('medium_50x50', 'maze_medium.txt'), + ('large_100x100', 'maze_large.txt'), + ('open_50x50', 'maze_open.txt'), + ('no_exit_20x20', 'maze_no_exit.txt'), +] + +def _make_grid(width, height, density=0.0, has_exit=True, seed=42): + + rng = random.Random(seed) + grid = [] + for y in range(height): + row = [] + for x in range(width): + on_border = (x == 0 or x == width - 1 or y == 0 or y == height - 1) + row.append('#' if on_border else ' ') + grid.append(row) + + for y in range(1, height - 1): + for x in range(1, width - 1): + if rng.random() < density: + grid[y][x] = '#' + + grid[1][1] = 'S' + if has_exit: + grid[height - 2][width - 2] = 'E' + + return '\n'.join(''.join(row) for row in grid) + + +def generate_maze_files(): + mazes_data = { + 'maze_small.txt': _make_grid(10, 10, density=0.15), + 'maze_medium.txt': _make_grid(50, 50, density=0.28), + 'maze_large.txt': _make_grid(100, 100, density=0.30), + 'maze_open.txt': _make_grid(50, 50, density=0.0), + 'maze_no_exit.txt': _make_grid(20, 20, density=0.20, has_exit=False), + } + no_exit = list(mazes_data['maze_no_exit.txt'].splitlines()) + no_exit[18] = no_exit[18][:18] + 'E' + no_exit[18][19:] + no_exit[17] = no_exit[17][:18] + '#' + no_exit[17][19:] + no_exit[18] = no_exit[18][:17] + '#' + no_exit[18][18:] + mazes_data['maze_no_exit.txt'] = '\n'.join(no_exit) + + maze_dir = os.path.dirname(os.path.abspath(__file__)) + for fname, content in mazes_data.items(): + path = os.path.join(maze_dir, fname) + with open(path, 'w', encoding='utf-8') as f: + f.write(content) + + print("✅ Файлы лабиринтов созданы") +def avg(lst): + return sum(lst) / len(lst) if lst else 0 + + +def run_benchmark(): + builder = TextFileMazeBuilder() + maze_dir = os.path.dirname(os.path.abspath(__file__)) + + all_results = [ + ['лабиринт', 'стратегия', 'время_мс', 'посещено_клеток', 'длина_пути'] + + [f'замер_{i+1}' for i in range(REPEATS)] + ] + + print(f"\nЗапуск бенчмарков (повторений: {REPEATS})\n") + print(f" {'Лабиринт':<18} {'Алгоритм':<6} {'Время мс':>10} " + f"{'Посещено':>10} {'Путь':>6}") + print(' ' + '-' * 56) + + for maze_label, maze_file in MAZES: + maze_path = os.path.join(maze_dir, maze_file) + try: + maze = builder.build_from_file(maze_path) + except Exception as e: + print(f" ❌ {maze_file}: {e}") + continue + + solver = MazeSolver(maze) + + for strat_name, StratClass in STRATEGIES.items(): + times_ms, visited_list, path_len = [], [], 0 + + for _ in range(REPEATS): + strat = StratClass() + solver.set_strategy(strat) + stats = solver.solve() + times_ms.append(stats.time_ms) + visited_list.append(stats.visited_cells) + path_len = stats.path_length + + mean_t = avg(times_ms) + mean_v = avg(visited_list) + + print(f" {maze_label:<18} {strat_name:<6} " + f"{mean_t:>10.3f} {mean_v:>10.0f} {path_len:>6}") + + all_results.append([ + maze_label, strat_name, + f"{mean_t:.4f}", f"{mean_v:.0f}", str(path_len) + ] + [f"{t:.4f}" for t in times_ms]) + + with open(CSV_PATH, 'w', newline='', encoding='utf-8') as f: + csv.writer(f).writerows(all_results) + + print(f"\n✅ Результаты сохранены: {CSV_PATH}") + +def smoke_test(): + print("=== Smoke Test ===\n") + + maze_dir = os.path.dirname(os.path.abspath(__file__)) + test_path = os.path.join(maze_dir, '_test_maze.txt') + + with open(test_path, 'w', encoding='utf-8') as f: + f.write("#######\n#S #\n# #\n# E#\n#######") + + builder = TextFileMazeBuilder() + maze = builder.build_from_file(test_path) + + for name, StratClass in STRATEGIES.items(): + strat = StratClass() + path = strat.find_path(maze, maze.start, maze.exit) + assert len(path) > 0, f"{name}: путь не найден!" + assert path[0].is_start + assert path[-1].is_exit + print(f" ✅ {name}: путь длиной {len(path)} — OK") + + os.remove(test_path) + print("\nВсе тесты пройдены!\n") + +if __name__ == '__main__': + smoke_test() + generate_maze_files() + run_benchmark() diff --git a/shalovsa/lab2/docs/data/chart_время-мс.png b/shalovsa/lab2/docs/data/chart_время-мс.png new file mode 100644 index 0000000000000000000000000000000000000000..499b243a6f0c04e424e6a833928a6a78b54d2216 GIT binary patch literal 62173 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 literal 0 HcmV?d00001 diff --git a/shalovsa/lab2/docs/data/maze_builder.py b/shalovsa/lab2/docs/data/maze_builder.py new file mode 100644 index 0000000..78abf85 --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_builder.py @@ -0,0 +1,44 @@ +from abc import ABC, abstractmethod +from maze_model import Cell, Maze + + +class MazeBuilder(ABC): + @abstractmethod + def build_from_file(self, filename) -> Maze: + pass + + +class TextFileMazeBuilder(MazeBuilder): + def build_from_file(self, filename) -> Maze: + with open(filename, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + + width = max(len(line) for line in lines) if lines else 0 + height = len(lines) + + cells = [] + start = None + exit_cell = None + + for y, line in enumerate(lines): + row = [] + line = line.ljust(width) + for x, char in enumerate(line): + is_wall = (char == '#') + is_start = (char == 'S') + is_exit = (char == 'E') + cell = Cell(x, y, is_wall=is_wall, + is_start=is_start, is_exit=is_exit) + if is_start: + start = cell + if is_exit: + exit_cell = cell + row.append(cell) + cells.append(row) + + if start is None: + raise ValueError("В файле лабиринта не найден старт (S)") + if exit_cell is None: + raise ValueError("В файле лабиринта не найден выход (E)") + + return Maze(width, height, cells, start, exit_cell) diff --git a/shalovsa/lab2/docs/data/maze_large.txt b/shalovsa/lab2/docs/data/maze_large.txt new file mode 100644 index 0000000..df1bb6a --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_large.txt @@ -0,0 +1,100 @@ +#################################################################################################### +#S### # ## ## # # # ## ####### ## # # ## ## ## # # ### # # +# # # # # # # # # # # # # # # # # ## ### # ## ## ## # ## ## # +# # # # # # ## # # ## ## # # # # # ### # # # ### # # # # ## ## +# ## ## ### # # # # # ### # # # ## # # # ## # +# ## # ## #### # # # # # # ## ## #### ## # # # # +### # # # # # # # # ### #### # # # ## # # # # # # # # # +# # ## ## # ## ##### ## ###### # # ## # ## # # ## #### # +# ## ## ## ## ## ## # # # # # # ## # # # +## # # ## # # # # # # ## # # # # ## # # ### +## # # # # # # # # ## ## # # # # ### ## # # +## # # # # # ## # ## # ## # # #### ## # ## # # # ## ## # # +# # # # # # ## # # ## # ## # # # # ### # # # # # # ### # # +## # ## ## # # # # ### # ## ## # # ### ## # # +## ## # # ## ### # # # # # # # # ## # # # # # # +# ## # # ## # ### ## # # # ## # # # ## # # # #### # # # # +# # # # # # # ## ## ## # # # # ### # # # +# # # #### # # # # ## # ### # # #### # # # # # # +# # # # # # ## # # # # # # # ## # ### # ## +## # ### ## ## # # # # # # # # # # # # # # ### ## # # +## ## ### # ## # # ### ## # # # # ## # # # # # # # # +##### # # # #### # ## # # # # # # ### # ## # # # # # +## # # ### # # # # ## # # # # # # #### # # # ### # +# # ## ## # ### # # ## # ## ## ### # # # # # # # ### +## ## # # # # # # # # # # ## ## # # ## +# # # ### # # # # # ## # # # ### # # # # # ## ## ## # ## # +# # # # # ##### # ## # # # # # # # # # ## ## # # # ## +# # # # # # # ## # ## # # # # # # ## ### ## # # ##### # +# # # # # ## # # ## # # ## # ## # # # # ## # # # ## # +## ## # # # # # # ### # ## ### ## # ### # ## # # # ## # # ## # # +# # # # #### # ## #### # # # # # # # # # # ### # ## # # +# # ## # # # # # # # # # # ###### # ## # ## # # # #### #### # # +# # ##### # # # ### # # # # # # # # # ## ### # # +# # # # # # # ## # # ## # # ## # # # # # # # ## # # ### +## # ## # # # # #### # # ## # ## ## # ## # # ## # # +## # # # ## # # # # # # # # # # # # ###### # ## # # ## ### # #### # # +## # # # # # # # # # # # ## # # # # # # ## # # # ## # ## +## # # # ### # # # # # # # # # # # # # # ### +# # ### # # # # # ## ## ## # # ## # ### ### # # # +# # # # # ## # # ## ## # # # # # # ## ## ## # +# ### # # ### # # # # ### # # # # # # # ## # ## +# # ### ## ## ## ## # # ### # ## # # # # ## ## # # # # # # +# ## # # # ## # # # # ## # ### #### # ## ###### ### # +# # # # ### ### # # ## # # # ### ## # ## # # ## ## +# # # ### #### # # # # ### # # # ## ### ## # ## #### # # +# ### ## # # # # # # # # ### # # # # ## # ### ### ## # +# # # # # # # # # # ## ### ## ### # ## # # # ## # #### # ## # # +# # # # # # # # # # # ### # # # # # ## # # # # # # # +# ## # # # # ## # # # # ## ## ## # # ## # ## # # ## # ## # +# # # ## # # # # ### # # # # # # # ## # # # ## # ### ## # # # +## # ## # ## ### ## # # # # ## # # # # # # # +## ## # # ### # # # # # ## # # # # # ## # ## # # # # +# # # ## # ### # ## # # ## # # # # # # # # +# # # # # ## #### # # ### # ## # # ## # # ## # +# # # # ## # ### # ## ## # # # # ### # # # +# # # # # # # # # ## # ## ## ### ### # # ## # # # ## # +# # # # ## # # ### ##### # # # # ## # # # # # ## # # # +## # # # ## # # ## # ## ## # ## # ### # # # # # +# ## ## # ### # ## ### # # ## # # # # # # # # # # # ### +# ## # # # # # # # # # # # ## # # # # # # # # # # # ## # +# # # # ## # # # # # ## # # ## # # ## # # # ### ### # # # ## +# # # # ## # ## # # # # # # # ## # # ## # ### ## +### # # ## ### # ## # # #### # # # # ##### # ## #### # +# # # # # # # #### ## # ### ### # ## # ## # # ## # # # # # # ### +# #### # ## # # # # # # ## # # # # # # # # +# ## # # # # # # ## # ## ## # ### #### # # # # ## # +# # ## # ## # # # # ## ## # ## # ## # +# # # # # # # ## # # # # # # ### ## ### # ## # # ### +### # # # ##### # ## ## # # # ## # ## ## # # # # # # +# # # # # # ## ##### # ### # ## # # # ## # ### #### # # +# # ### # ## # # ### ## ## # ## # ### # ## ### # ### +# ## ## ## # # # # # # ### # ## # # ## # # # # +## ## ## # ## # ## # # # ## # ## # ## # ## # # # # +# # # # # # # # ## # # # ####### # ## ## ## ## +# # # # # # # # # ## # # # # # ## # # ### # ## +# # ## #### # # # # # ## ### # ### # ### # ### ## # # # +## # # ## # # # # # # # # ## # ##### # ## ##### #### ### +# # # # ## # ## # # ## # # ### ## ## # ###### +# # ## # # # # # # # # # ## ## # ## ## ## # ## # # +### #### # # ## # # # # # ## # # ## # # # #### # # ## # # +# ## ## # # ## # ## ## # # ## # # # # # #### # # +# ## # # # ## ### ## #### # # # # # # ## ### # # # ## +## # # # # # # # ## # ## ### # ## # ## # # # # +# # # # # # # # # ### # # # ## # # ## ## # #### # +# # ## # # # # # # # # # # ## ### # # # ## +## ## # ## # # # ## # # # # # #### # # ## ### # +## # ## ## # # # # ### # # ## # # # ## ## # # # # ## # +# ## # ## # # #### # # # # # # ## # # # # # # ### # +# ## # #### # # ## # # # # ### ## # ## ### # ## ## ## +# # # # # # ## # # # ## # #### # ##### # # # # # # # # +# # ## ## ### # ### ### # # #### # # # # ## # ## # # # # #### # # +# # # # ## # # ## # # ## # # ## # ## # # # ## ## # +# # ## # # # ## ## # ### ## # ## # # # # # # # ## # # # +# # ## # ## ## ## # # ## # # # # # ## # # # # ### # # +# # # ## # # # # # # # # # # # # ## # # # ## # # # +## # ## # # # # ## # # ## # # # # # # ## # # # # # # # # +# # ## # ## # ### # # ### # ## # # # ## # ### # ## # # +# # # ## # # ## # # # ## # # #### ## # # # ### # ## +# #### ## ### ### # # ### # # ## # # # ### # ####### # ## # #E# +#################################################################################################### \ No newline at end of file diff --git a/shalovsa/lab2/docs/data/maze_medium.txt b/shalovsa/lab2/docs/data/maze_medium.txt new file mode 100644 index 0000000..8bed293 --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_medium.txt @@ -0,0 +1,50 @@ +################################################## +#S### # ## ## # # # ## ## ##### +# ## # # ## ## ## # # ### # # +# # # # # # # # # # # # # # # +# # # ## ### # ## ## ## # ## ## +## # # # # # # # # ## ## # # +# # # # ### # # ### # # # ## +# ## # ## ## ### # # # # # +## ### # # # ## # # # # +# # # # ## #### # # # # # # +## ## ## ## # ## # # # +# # ## # # # # # # # # ### ## +#### # # # ## # # # # # # +# # # # # ## ## # ## ###### +# ## ##### # # ## # ## # # # +# ## #### # ## # ## ## +## ## # # # # # +## ## # # # # # # # ## +# # # # ## # # +## # ## # # ### # # # # # # # +# # ## # # # # # +# ### ## # # # # # # # ### +# # ## # ## # # #### ## # ## # # ## +# ## ## # # # # # # ## # # +# # ## # ## # # # # ### # +# # # # # # ### # # # ## ## ## +# # # # ### # ## ## # # # +# ### ## # ## # # +# ## ### # # # # # # # +# ## # # # # ## # # # # ## +### # # # # ## # # # ## # # +## # ### # # # # # # +# # # # # ## ## ## # # +# # # ### # # # # ### +### # # # # ## ## # # +# # ### # # # # # # ## +# # # # ## # # # +# # # # ## # ### # ## # # # +### # # # # # # # # # # +# # # # # ### ## # # ## ### # +# # ## # ### ## # # # # ## # # +# # # # # # # ### # +## # # #### # ## # # # # # +# # ### # ## # # # # # # +# # # ### # # # # ## # # +## # # # # #### # # # ### # +## ## ## # ### # # ## # +# # ## ## ### # # # # # # ### # +# ## # # # # # E# +################################################## \ No newline at end of file diff --git a/shalovsa/lab2/docs/data/maze_model.py b/shalovsa/lab2/docs/data/maze_model.py new file mode 100644 index 0000000..664ad01 --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_model.py @@ -0,0 +1,62 @@ +class Cell: + def __init__(self, x, y, is_wall=False, is_start=False, is_exit=False): + self.x = x + self.y = y + self.is_wall = is_wall + self.is_start = is_start + self.is_exit = is_exit + + def is_passable(self): + return not self.is_wall + + def __repr__(self): + if self.is_wall: + return '#' + if self.is_start: + return 'S' + if self.is_exit: + return 'E' + return ' ' + + +class Maze: + def __init__(self, width, height, cells, start, exit_cell): + self.width = width + self.height = height + self._cells = cells + self.start = start + self.exit = exit_cell + + def get_cell(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + return self._cells[y][x] + return None + + def get_neighbors(self, cell): + directions = [(0, -1), (0, 1), (-1, 0), (1, 0)] + neighbors = [] + for dx, dy in directions: + neighbor = self.get_cell(cell.x + dx, cell.y + dy) + if neighbor is not None and neighbor.is_passable(): + neighbors.append(neighbor) + return neighbors + + def render(self, path=None, player_pos=None): + path_set = set((c.x, c.y) for c in path) if path else set() + + for row in self._cells: + line = '' + for cell in row: + if player_pos and cell.x == player_pos.x and cell.y == player_pos.y: + line += 'P' + elif cell.is_wall: + line += '#' + elif cell.is_start: + line += 'S' + elif cell.is_exit: + line += 'E' + elif (cell.x, cell.y) in path_set: + line += '.' + else: + line += ' ' + print(line) diff --git a/shalovsa/lab2/docs/data/maze_no_exit.txt b/shalovsa/lab2/docs/data/maze_no_exit.txt new file mode 100644 index 0000000..c93724b --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_no_exit.txt @@ -0,0 +1,20 @@ +#################### +#S# # # ## # +# # # ## # +# # # # # +# # # # # +# ### +## # # # # +# # # # # +## # # # # # +# # # # +# # # ## # +# # # ## +# # # # +# # # # ## # +# # # +## # # ## +# ### ## +# # ## ### +# # # #E# +#################### \ No newline at end of file diff --git a/shalovsa/lab2/docs/data/maze_open.txt b/shalovsa/lab2/docs/data/maze_open.txt new file mode 100644 index 0000000..335d47e --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_open.txt @@ -0,0 +1,50 @@ +################################################## +#S # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# E# +################################################## \ No newline at end of file diff --git a/shalovsa/lab2/docs/data/maze_small.txt b/shalovsa/lab2/docs/data/maze_small.txt new file mode 100644 index 0000000..952175d --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_small.txt @@ -0,0 +1,10 @@ +########## +#S# ## +# # # # +# # # +# ## # +# # +# # # # # +# # +# E# +########## \ No newline at end of file diff --git a/shalovsa/lab2/docs/data/maze_solver.py b/shalovsa/lab2/docs/data/maze_solver.py new file mode 100644 index 0000000..5347cf9 --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_solver.py @@ -0,0 +1,121 @@ +import time +from abc import ABC, abstractmethod + +class SearchStats: + def __init__(self, time_ms, visited_cells, path_length, path): + self.time_ms = time_ms + self.visited_cells = visited_cells + self.path_length = path_length + self.path = path + + def __repr__(self): + return (f"SearchStats(time={self.time_ms:.3f}ms, " + f"visited={self.visited_cells}, " + f"path_len={self.path_length})") + +class Observer(ABC): + + @abstractmethod + def update(self, event, data=None): + pass + + +class ConsoleView(Observer): + + def update(self, event, data=None): + if event == 'maze_loaded': + print(f"\n[ConsoleView] Лабиринт загружен: " + f"{data['width']}×{data['height']}") + + elif event == 'path_found': + stats = data['stats'] + strategy_name = data['strategy'] + if stats.path_length > 0: + print(f"\n[ConsoleView] [{strategy_name}] Путь найден! " + f"Длина: {stats.path_length}, " + f"Посещено клеток: {stats.visited_cells}, " + f"Время: {stats.time_ms:.3f} мс") + else: + print(f"\n[ConsoleView] [{strategy_name}] Путь не найден. " + f"Посещено клеток: {stats.visited_cells}") + + elif event == 'move': + print(f"[ConsoleView] Игрок переместился в " + f"({data['x']}, {data['y']})") + +class MazeSolver: + def __init__(self, maze, strategy=None): + self.maze = maze + self.strategy = strategy + self._observers = [] + + def set_strategy(self, strategy): + self.strategy = strategy + + def add_observer(self, observer): + self._observers.append(observer) + + def _notify(self, event, data=None): + for obs in self._observers: + obs.update(event, data) + + def solve(self): + if self.strategy is None: + raise RuntimeError("Стратегия не задана. Используйте set_strategy().") + + start = time.perf_counter() + path = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit) + end = time.perf_counter() + + stats = SearchStats( + time_ms=(end - start) * 1000, + visited_cells=getattr(self.strategy, 'visited_count', 0), + path_length=len(path), + path=path + ) + + self._notify('path_found', { + 'stats': stats, + 'strategy': type(self.strategy).__name__ + }) + + return stats + +class Command(ABC): + @abstractmethod + def execute(self): + pass + + @abstractmethod + def undo(self): + pass + + +class Player: + def __init__(self, start_cell): + self.current_cell = start_cell + + def move_to(self, cell): + self.current_cell = cell + + +class MoveCommand(Command): + def __init__(self, player, target_cell, observers=None): + self.player = player + self.target_cell = target_cell + self.previous_cell = None + self._observers = observers or [] + + def execute(self): + self.previous_cell = self.player.current_cell + self.player.move_to(self.target_cell) + for obs in self._observers: + obs.update('move', {'x': self.target_cell.x, + 'y': self.target_cell.y}) + + def undo(self): + if self.previous_cell is not None: + self.player.move_to(self.previous_cell) + for obs in self._observers: + obs.update('move', {'x': self.previous_cell.x, + 'y': self.previous_cell.y}) diff --git a/shalovsa/lab2/docs/data/maze_strategies.py b/shalovsa/lab2/docs/data/maze_strategies.py new file mode 100644 index 0000000..a71c794 --- /dev/null +++ b/shalovsa/lab2/docs/data/maze_strategies.py @@ -0,0 +1,100 @@ +from abc import ABC, abstractmethod +from collections import deque +import heapq + + +class PathFindingStrategy(ABC): + @abstractmethod + def find_path(self, maze, start, exit_cell): + pass + + +def _reconstruct_path(came_from, start, exit_cell): + path = [] + current = exit_cell + while current is not None: + path.append(current) + current = came_from.get((current.x, current.y)) + path.reverse() + if path and path[0].x == start.x and path[0].y == start.y: + return path + return [] + +class BFSStrategy(PathFindingStrategy): + def find_path(self, maze, start, exit_cell): + queue = deque([start]) + came_from = {(start.x, start.y): None} + self.visited_count = 0 + + while queue: + current = queue.popleft() + self.visited_count += 1 + + if current.x == exit_cell.x and current.y == exit_cell.y: + return _reconstruct_path(came_from, start, exit_cell) + + for neighbor in maze.get_neighbors(current): + key = (neighbor.x, neighbor.y) + if key not in came_from: + came_from[key] = current + queue.append(neighbor) + + self.visited_count = len(came_from) + return [] # путь не найден + +class DFSStrategy(PathFindingStrategy): + + def find_path(self, maze, start, exit_cell): + stack = [start] + came_from = {(start.x, start.y): None} + self.visited_count = 0 + + while stack: + current = stack.pop() + self.visited_count += 1 + + if current.x == exit_cell.x and current.y == exit_cell.y: + return _reconstruct_path(came_from, start, exit_cell) + + for neighbor in maze.get_neighbors(current): + key = (neighbor.x, neighbor.y) + if key not in came_from: + came_from[key] = current + stack.append(neighbor) + + self.visited_count = len(came_from) + return [] + +class AStarStrategy(PathFindingStrategy): + + def _heuristic(self, cell, goal): + return abs(cell.x - goal.x) + abs(cell.y - goal.y) + + def find_path(self, maze, start, exit_cell): + # (f_score, счётчик для разрыва связей, клетка) + counter = 0 + open_set = [(0, counter, start)] + came_from = {(start.x, start.y): None} + g_score = {(start.x, start.y): 0} + self.visited_count = 0 + + while open_set: + _, _, current = heapq.heappop(open_set) + self.visited_count += 1 + + if current.x == exit_cell.x and current.y == exit_cell.y: + return _reconstruct_path(came_from, start, exit_cell) + + for neighbor in maze.get_neighbors(current): + key = (neighbor.x, neighbor.y) + tentative_g = g_score[(current.x, current.y)] + 1 + + if key not in g_score or tentative_g < g_score[key]: + g_score[key] = tentative_g + f = tentative_g + self._heuristic(neighbor, exit_cell) + counter += 1 + heapq.heappush(open_set, (f, counter, neighbor)) + came_from[key] = current + + self.visited_count = len(came_from) + return [] diff --git a/shalovsa/lab2/docs/data/plot_results.py b/shalovsa/lab2/docs/data/plot_results.py new file mode 100644 index 0000000..ac1d330 --- /dev/null +++ b/shalovsa/lab2/docs/data/plot_results.py @@ -0,0 +1,103 @@ +import csv +import os + +try: + import matplotlib.pyplot as plt + import matplotlib.patches as mpatches + HAS_MPL = True +except ImportError: + HAS_MPL = False + print("⚠️ matplotlib не установлен: pip install matplotlib\n") + +CSV_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'results.csv') +OUT_DIR = os.path.dirname(os.path.abspath(__file__)) + +COLORS = {'BFS': '#4E9AF1', 'DFS': '#F4845F', 'A*': '#6BCB77'} +STRATEGIES = ['BFS', 'DFS', 'A*'] +METRICS = [ + ('время_мс', 'Среднее время (мс)'), + ('посещено_клеток', 'Посещено клеток'), + ('длина_пути', 'Длина пути (шагов)'), +] + + +def load_csv(path): + data = {} + with open(path, newline='', encoding='utf-8') as f: + reader = csv.DictReader(f) + for row in reader: + key = (row['лабиринт'], row['стратегия']) + data[key] = { + 'время_мс': float(row['время_мс']), + 'посещено_клеток': float(row['посещено_клеток']), + 'длина_пути': float(row['длина_пути']), + } + return data + + +def get_mazes(data): + seen = [] + for (maze, _) in data: + if maze not in seen: + seen.append(maze) + return seen + + +def plot_by_metric(data): + mazes = get_mazes(data) + x = range(len(mazes)) + w = 0.25 + + for metric_key, metric_label in METRICS: + fig, ax = plt.subplots(figsize=(12, 5)) + fig.suptitle(f'{metric_label} по лабиринтам', fontweight='bold') + + for i, strat in enumerate(STRATEGIES): + vals = [data.get((m, strat), {}).get(metric_key, 0) for m in mazes] + offset = [xi + (i - 1) * w for xi in x] + bars = ax.bar(offset, vals, width=w, + label=strat, color=COLORS[strat], edgecolor='white') + for bar, val in zip(bars, vals): + if val > 0: + ax.text(bar.get_x() + bar.get_width() / 2, + bar.get_height() + max(vals) * 0.01, + f'{val:.1f}', ha='center', va='bottom', fontsize=7) + + ax.set_xticks(list(x)) + ax.set_xticklabels(mazes, rotation=15, ha='right', fontsize=9) + ax.set_ylabel(metric_label) + ax.legend() + ax.grid(axis='y', alpha=0.3) + + safe = metric_key.replace('_', '-') + out = os.path.join(OUT_DIR, f'chart_{safe}.png') + plt.tight_layout() + plt.savefig(out, dpi=150, bbox_inches='tight') + print(f"✅ График сохранён: {out}") + plt.show() + + +def print_table(data): + print(f"\n{'Лабиринт':<20} {'Алгоритм':<6} " + f"{'Время мс':>10} {'Посещено':>10} {'Путь':>6}") + print('-' * 56) + for (maze, strat), vals in sorted(data.items()): + print(f"{maze:<20} {strat:<6} " + f"{vals['время_мс']:>10.3f} " + f"{vals['посещено_клеток']:>10.0f} " + f"{vals['длина_пути']:>6.0f}") + + +if __name__ == '__main__': + if not os.path.exists(CSV_PATH): + print(f"❌ Файл не найден: {CSV_PATH}") + print(" Сначала запустите: python benchmark.py") + exit(1) + + data = load_csv(CSV_PATH) + print_table(data) + + if HAS_MPL: + plot_by_metric(data) + else: + print("\n💡 Установите matplotlib: pip install matplotlib") diff --git a/shalovsa/lab2/docs/data/results.csv b/shalovsa/lab2/docs/data/results.csv new file mode 100644 index 0000000..1c7aa72 --- /dev/null +++ b/shalovsa/lab2/docs/data/results.csv @@ -0,0 +1,16 @@ +лабиринт,стратегия,время_мс,посещено_клеток,длина_пути,замер_1,замер_2,замер_3,замер_4,замер_5,замер_6,замер_7 +small_10x10,BFS,0.0787,54,15,0.0931,0.0795,0.0790,0.0849,0.0721,0.0722,0.0704 +small_10x10,DFS,0.0509,33,33,0.0514,0.0463,0.0440,0.0446,0.0447,0.0567,0.0684 +small_10x10,A*,0.0709,36,15,0.0792,0.0729,0.0702,0.0731,0.0707,0.0659,0.0642 +medium_50x50,BFS,2.0810,1639,95,2.1951,2.0908,2.0562,2.0949,2.0368,2.0297,2.0632 +medium_50x50,DFS,1.3492,1063,185,1.3530,1.3543,1.3406,1.3454,1.3916,1.3317,1.3278 +medium_50x50,A*,1.1982,588,95,1.2252,1.1942,1.1866,1.1937,1.1808,1.2248,1.1821 +large_100x100,BFS,8.5772,6564,0,8.9067,8.5676,8.4910,8.5273,8.5058,8.5506,8.4913 +large_100x100,DFS,8.5785,6564,0,8.5521,8.4862,8.5502,8.4667,8.4953,8.4717,9.0270 +large_100x100,A*,16.7095,6564,0,14.4629,15.5478,19.9577,17.3113,17.0947,15.8721,16.7202 +open_50x50,BFS,3.4145,2304,95,3.5435,3.4067,3.3571,3.5743,3.5422,3.2572,3.2204 +open_50x50,DFS,1.8459,1223,1129,1.9151,1.8672,1.8296,1.8533,1.8246,1.8179,1.8139 +open_50x50,A*,4.9859,2304,95,5.0583,5.0246,4.9598,4.9387,4.9481,5.0107,4.9611 +no_exit_20x20,BFS,0.3292,260,0,0.3427,0.3298,0.3262,0.3330,0.3251,0.3231,0.3246 +no_exit_20x20,DFS,0.3275,260,0,0.3355,0.3280,0.3289,0.3289,0.3178,0.3279,0.3253 +no_exit_20x20,A*,0.5116,260,0,0.5235,0.5392,0.5083,0.4989,0.5043,0.4978,0.5095 diff --git a/shalovsa/lab2/docs/report_maze_final.md b/shalovsa/lab2/docs/report_maze_final.md new file mode 100644 index 0000000..7171cb3 --- /dev/null +++ b/shalovsa/lab2/docs/report_maze_final.md @@ -0,0 +1,275 @@ +# Отчёт: Поиск выхода из лабиринта (ООП + паттерны проектирования) + +## Цель работы + +Разработать гибкую расширяемую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма и экспериментального сравнения алгоритмов. Применить минимум 3 паттерна проектирования из списка GoF, обосновать их выбор и продемонстрировать преимущества такой архитектуры. + +--- + +## Описание задачи и выбранных паттернов + +Программа решает задачу поиска пути в лабиринте, загружаемом из текстового файла. Лабиринт представляет собой сетку клеток, где `#` — стена, пробел — проход, `S` — старт, `E` — выход. Алгоритм поиска выбирается динамически, результаты выводятся через систему событий. + +Применены **4 паттерна GoF**: Builder, Strategy, Observer, Command. + +### 1. Builder (Строитель) — `maze_builder.py` + +**Проблема:** построение объекта `Maze` из файла — многошаговый процесс: открыть файл, разобрать символы, создать объекты `Cell`, установить координаты, найти старт и выход, собрать двумерный массив. Смешивать это с основной логикой нельзя. + +**Решение:** интерфейс `MazeBuilder` с единственным методом `build_from_file(filename)` и реализация `TextFileMazeBuilder`, инкапсулирующая весь парсинг. + +**Преимущество без паттерна было бы сложно:** при добавлении поддержки JSON-лабиринтов пришлось бы встраивать ветвление прямо в клиентский код. С Builder — просто создаём `JsonFileMazeBuilder` и подставляем без изменений в остальном коде. + +### 2. Strategy (Стратегия) — `maze_strategies.py` + +**Проблема:** алгоритмы BFS, DFS и A* принципиально различаются по реализации, но выполняют одну задачу — найти путь. Жёсткое встраивание алгоритма в `MazeSolver` делало бы переключение невозможным без правки класса. + +**Решение:** интерфейс `PathFindingStrategy` с методом `find_path(maze, start, exit)`. Каждый алгоритм реализует интерфейс независимо. `MazeSolver.set_strategy()` меняет алгоритм в одну строку во время выполнения. + +**Преимущество без паттерна было бы сложно:** добавление Dijkstra или любого нового алгоритма потребовало бы правки `MazeSolver`. С Strategy — новый алгоритм добавляется одним классом, остальной код не меняется. + +### 3. Observer (Наблюдатель) — `maze_solver.py` + +**Проблема:** `MazeSolver` должен уведомлять интерфейс о событиях (путь найден, лабиринт загружен), но не должен знать, кто именно получает эти уведомления. + +**Решение:** интерфейс `Observer` с методом `update(event, data)`. `ConsoleView` реализует интерфейс и подписывается на `MazeSolver`. При наступлении события вызывается `_notify()`, который обходит список подписчиков. + +**Преимущество без паттерна было бы сложно:** прямой вызов `ConsoleView` из `MazeSolver` создаёт жёсткую зависимость. С Observer — `ConsoleView` можно отключить, заменить на GUI или добавить файловый логгер без единой правки в `MazeSolver`. + +### 4. Command (Команда) — `maze_solver.py` + +**Проблема:** для пошагового режима нужно перемещать игрока с возможностью отмены хода. + +**Решение:** интерфейс `Command` с методами `execute()` и `undo()`. `MoveCommand` хранит целевую клетку и предыдущую позицию игрока. История команд — обычный стек. + +**Преимущество без паттерна было бы сложно:** прямое изменение позиции игрока не сохраняет историю. С Command — `undo()` возвращает игрока на шаг назад, а добавление новых типов действий (атака, открыть дверь) не требует изменения `Player`. + +--- + +## Диаграмма классов (Mermaid) + +```mermaid +classDiagram + class MazeBuilder { + <> + +build_from_file(filename) Maze + } + class TextFileMazeBuilder { + +build_from_file(filename) Maze + } + class Maze { + -int width, height + -Cell[][] cells + -Cell start + -Cell exit + +get_cell(x, y) Cell + +get_neighbors(cell) list + +render(path, player_pos) + } + class Cell { + -int x, y + -bool is_wall + -bool is_start + -bool is_exit + +is_passable() bool + } + class PathFindingStrategy { + <> + +find_path(maze, start, exit) list + } + class BFSStrategy { +find_path() } + class DFSStrategy { +find_path() } + class AStarStrategy { +find_path() } + class MazeSolver { + -Maze maze + -PathFindingStrategy strategy + -list observers + +set_strategy(strategy) + +add_observer(observer) + +solve() SearchStats + } + class SearchStats { + +float time_ms + +int visited_cells + +int path_length + +list path + } + class Observer { + <> + +update(event, data) + } + class ConsoleView { +update(event, data) } + class Command { + <> + +execute() + +undo() + } + class MoveCommand { + -Player player + -Cell target_cell + -Cell previous_cell + +execute() + +undo() + } + class Player { + -Cell current_cell + +move_to(cell) + } + + MazeBuilder <|.. TextFileMazeBuilder + TextFileMazeBuilder ..> Maze : creates + Maze o-- Cell + PathFindingStrategy <|.. BFSStrategy + PathFindingStrategy <|.. DFSStrategy + PathFindingStrategy <|.. AStarStrategy + MazeSolver --> Maze + MazeSolver --> PathFindingStrategy + MazeSolver --> SearchStats + MazeSolver --> Observer + Observer <|.. ConsoleView + Command <|.. MoveCommand + MoveCommand --> Player + Player --> Cell +``` + +--- + +## Ключевые фрагменты реализации + +### Смена алгоритма через Strategy + +```python +solver = MazeSolver(maze) +solver.set_strategy(BFSStrategy()) +stats_bfs = solver.solve() + +solver.set_strategy(AStarStrategy()) # меняем алгоритм — одна строка +stats_astar = solver.solve() +``` + +### Подписка Observer + +```python +view = ConsoleView() +solver.add_observer(view) +solver.solve() # ConsoleView автоматически получит событие path_found +``` + +### Команда с отменой + +```python +player = Player(maze.start) +cmd = MoveCommand(player, next_cell) +cmd.execute() # игрок перешёл +cmd.undo() # игрок вернулся обратно +``` + +--- + +## Экспериментальная часть + +### Параметры эксперимента + +| Параметр | Значение | +|---|---| +| Повторений на замер | 7 | +| Алгоритмы | BFS, DFS, A* | +| Метрики | время (мс), посещено клеток, длина пути | + +### Тестовые лабиринты + +| Название | Размер | Особенность | +|---|---|---| +| small_10x10 | 10×10 | Маленький, простой путь | +| medium_50x50 | 50×50 | Средний, тупики (28% стен) | +| large_100x100 | 100×100 | Большой (30% стен) | +| open_50x50 | 50×50 | Без внутренних стен | +| no_exit_20x20 | 20×20 | Выход недостижим | + +--- + +## Результаты + +### Таблица средних значений + +| Лабиринт | Алгоритм | Время (мс) | Посещено клеток | Длина пути | +|---|---|---|---|---| +| small_10x10 | BFS | 0.094 | 54 | 15 | +| small_10x10 | DFS | 0.059 | 33 | 33 | +| small_10x10 | A* | 0.078 | 36 | 15 | +| medium_50x50 | BFS | 2.446 | 1639 | 95 | +| medium_50x50 | DFS | 1.480 | 1063 | 185 | +| medium_50x50 | A* | 1.528 | 588 | 95 | +| large_100x100 | BFS | 9.891 | 6564 | — | +| large_100x100 | DFS | 9.057 | 6564 | — | +| large_100x100 | A* | 17.578 | 6564 | — | +| open_50x50 | BFS | 3.296 | 2304 | 95 | +| open_50x50 | DFS | 1.830 | 1223 | 1129 | +| open_50x50 | A* | 5.566 | 2304 | 95 | +| no_exit_20x20 | BFS | 0.368 | 260 | — | +| no_exit_20x20 | DFS | 0.343 | 260 | — | +| no_exit_20x20 | A* | 0.607 | 260 | — | + +*«—» — путь не найден, все доступные клетки исчерпаны* + +### Визуализация + +![Время выполнения](data/chart_время-мс.png) + +![Посещено клеток](data/chart_посещено-клеток.png) + +![Длина пути](data/chart_длина-пути.png) + +--- + +## Анализ эффективности алгоритмов + +### BFS — гарантия кратчайшего пути + +BFS находит **оптимальный путь** во всех случаях: 15 шагов на small, 95 на medium. Достигается за счёт обхода волнами — клетки посещаются в порядке удалённости от старта. Платой является высокое число посещённых клеток: 1639 на medium против 1063 у DFS. Это теоретически ожидаемо: BFS — O(V+E), где V — все вершины. + +### DFS — скорость за счёт качества пути + +DFS работает быстрее по времени (1.480 мс против 2.446 мс у BFS на medium), но путь длиннее в 1.9 раза (185 против 95 шагов). На открытом лабиринте без стен разрыв катастрофический: **1129 шагов против 95 у BFS**. Это классическая демонстрация того, что DFS уходит в глубину по первому попавшемуся пути, не оглядываясь на альтернативы. + +### A* — лучший баланс при наличии препятствий + +A* с манхэттенской эвристикой посетил всего **588 клеток** на medium против 1639 у BFS — в 2.8 раза меньше — при одинаковой длине пути (95 шагов). Эвристика `|x1−x2| + |y1−y2|` направляет поиск к выходу и отсекает заведомо невыгодные направления. + +На открытом лабиринте без стен A* проигрывает по времени (5.566 мс против 3.296 мс у BFS): эвристика пересчитывается для каждой из 2304 клеток, а отсекать нечего — все пути одинаково перспективны. + +### Большой лабиринт (100×100) — путь не найден + +При плотности стен 30% выход оказался недостижим. Все три алгоритма исчерпали все 6564 доступные клетки. Корректность обработки этого случая — важный результат: каждый алгоритм возвращает пустой список, а не зависает. + +### Лабиринт без выхода (20×20) + +Все алгоритмы обошли все 260 доступных клеток и корректно вернули пустой путь. A* в этом сценарии чуть медленнее (0.607 мс против 0.368 мс у BFS) — приоритетная очередь имеет накладные расходы O(log n) на каждую операцию. + +--- + +## Выводы + +### Эффективность алгоритмов в разных сценариях + +| Задача | Рекомендация | Обоснование | +|---|---|---| +| Кратчайший путь | BFS или A* | Оба гарантируют оптимум | +| Большой лабиринт с препятствиями | A* | В 2–3 раза меньше посещённых клеток | +| Открытое пространство | BFS | A* теряет преимущество без отсечений | +| Нужен любой путь быстро | DFS | Меньше клеток, меньше накладных расходов | +| Недостижимый выход | Любой | Все алгоритмы корректно завершаются | + +### Применимость паттернов + +**Strategy** — самый ценный паттерн в данной задаче. Именно он позволяет запускать три алгоритма через единый интерфейс в цикле бенчмарка без дублирования кода. Добавление четвёртого алгоритма (Dijkstra) займёт ~30 строк без правок в `MazeSolver` или `benchmark.py`. + +**Builder** оправдал себя при добавлении пяти разных лабиринтов: клиентский код (`benchmark.py`) не менялся, только передавался другой файл. Без Builder парсинг был бы размазан по всему коду. + +**Observer** отделил вывод от логики: в бенчмарке `ConsoleView` не подключается вовсе, чтобы не засорять вывод. В интерактивном режиме подключается одной строкой. + +**Command** демонстрирует принцип undo/redo: без него отмена хода требовала бы хранения копии состояния снаружи объекта `Player`. С Command история инкапсулирована в стеке команд. + +### Общий вывод + +ООП и паттерны проектирования сделали код модульным и расширяемым. Каждый класс решает одну задачу. Изменение любого компонента (алгоритм, формат файла, интерфейс) не ломает остальные части программы — это и есть практическая ценность паттернов GoF.