From 94167bedca295126fd8f805a59fddc97466fc6be Mon Sep 17 00:00:00 2001 From: MashinDD Date: Sun, 17 May 2026 16:50:48 +0300 Subject: [PATCH] [2] labirint --- MashinDD/lab2/docs/data/benchmark.py | 153 ++++++++++++ MashinDD/lab2/docs/data/chart_время-мс.png | Bin 0 -> 51096 bytes MashinDD/lab2/docs/data/chart_длина-пути.png | Bin 0 -> 51349 bytes .../lab2/docs/data/chart_посещено-клеток.png | Bin 0 -> 61218 bytes MashinDD/lab2/docs/data/maze_builder.py | 44 ++++ MashinDD/lab2/docs/data/maze_large.txt | 100 ++++++++ MashinDD/lab2/docs/data/maze_medium.txt | 50 ++++ MashinDD/lab2/docs/data/maze_model.py | 62 +++++ MashinDD/lab2/docs/data/maze_no_exit.txt | 20 ++ MashinDD/lab2/docs/data/maze_open.txt | 50 ++++ MashinDD/lab2/docs/data/maze_small.txt | 10 + MashinDD/lab2/docs/data/maze_solver.py | 121 +++++++++ MashinDD/lab2/docs/data/maze_strategies.py | 100 ++++++++ MashinDD/lab2/docs/data/plot_results.py | 103 ++++++++ MashinDD/lab2/docs/data/results.csv | 16 ++ MashinDD/lab2/docs/report.md | 235 ++++++++++++++++++ 16 files changed, 1064 insertions(+) create mode 100644 MashinDD/lab2/docs/data/benchmark.py create mode 100644 MashinDD/lab2/docs/data/chart_время-мс.png create mode 100644 MashinDD/lab2/docs/data/chart_длина-пути.png create mode 100644 MashinDD/lab2/docs/data/chart_посещено-клеток.png create mode 100644 MashinDD/lab2/docs/data/maze_builder.py create mode 100644 MashinDD/lab2/docs/data/maze_large.txt create mode 100644 MashinDD/lab2/docs/data/maze_medium.txt create mode 100644 MashinDD/lab2/docs/data/maze_model.py create mode 100644 MashinDD/lab2/docs/data/maze_no_exit.txt create mode 100644 MashinDD/lab2/docs/data/maze_open.txt create mode 100644 MashinDD/lab2/docs/data/maze_small.txt create mode 100644 MashinDD/lab2/docs/data/maze_solver.py create mode 100644 MashinDD/lab2/docs/data/maze_strategies.py create mode 100644 MashinDD/lab2/docs/data/plot_results.py create mode 100644 MashinDD/lab2/docs/data/results.csv create mode 100644 MashinDD/lab2/docs/report.md diff --git a/MashinDD/lab2/docs/data/benchmark.py b/MashinDD/lab2/docs/data/benchmark.py new file mode 100644 index 0000000..a1225d3 --- /dev/null +++ b/MashinDD/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/MashinDD/lab2/docs/data/chart_время-мс.png b/MashinDD/lab2/docs/data/chart_время-мс.png new file mode 100644 index 0000000000000000000000000000000000000000..d20c76db7658356711262eddcc5e8b58b9ff1cdd GIT binary patch literal 51096 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%0DN7Qq+~eR)G}|CU^tl+Xhp6wl)~z+>l!Y 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 EI~nG|`v3p{ literal 0 HcmV?d00001 diff --git a/MashinDD/lab2/docs/data/chart_посещено-клеток.png b/MashinDD/lab2/docs/data/chart_посещено-клеток.png new file mode 100644 index 0000000000000000000000000000000000000000..d2186e35abbc2d0bd69cb8acdb3e1d82dfa07737 GIT binary patch literal 61218 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 OV61O(wnXnj^#1~fVISQ9 literal 0 HcmV?d00001 diff --git a/MashinDD/lab2/docs/data/maze_builder.py b/MashinDD/lab2/docs/data/maze_builder.py new file mode 100644 index 0000000..78abf85 --- /dev/null +++ b/MashinDD/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/MashinDD/lab2/docs/data/maze_large.txt b/MashinDD/lab2/docs/data/maze_large.txt new file mode 100644 index 0000000..df1bb6a --- /dev/null +++ b/MashinDD/lab2/docs/data/maze_large.txt @@ -0,0 +1,100 @@ +#################################################################################################### +#S### # ## ## # # # ## ####### ## # # ## ## ## # # ### # # +# # # # # # # # # # # # # # # # # ## ### # ## ## ## # ## ## # +# # # # # # ## # # ## ## # # # # # ### # # # ### # # # # ## ## +# ## ## ### # # # # # ### # # # ## # # # ## # +# ## # ## #### # # # # # # ## ## #### ## # # # # +### # # # # # # # # ### #### # # # ## # # # # # # # # # +# # ## ## # ## ##### ## ###### # # ## # ## # # ## #### # +# ## ## ## ## ## ## # # # # # # ## # # # +## # # ## # # # # # # ## # # # # ## # # ### +## # # # # # # # # ## ## # # # # ### ## # # +## # # # # # ## # ## # ## # # #### ## # ## # # # ## ## # # +# # # # # # ## # # ## # ## # # # # ### # # # # # # ### # # +## # ## ## # # # # ### # ## ## # # ### ## # # +## ## # # ## ### # # # # # # # # ## # # # # # # +# ## # # ## # ### ## # # # ## # # # ## # # # #### # # # # +# # # # # # # ## ## ## # # # # ### # # # +# # # #### # # # # ## # ### # # #### # # # # # # +# # # # # # ## # # # # # # # ## # ### # ## +## # ### ## ## # # # # # # # # # # # # # # ### ## # # +## ## ### # ## # # ### ## # # # # ## # # # # # # # # +##### # # # #### # ## # # # # # # ### # ## # # # # # +## # # ### # # # # ## # # # # # # #### # # # ### # +# # ## ## # ### # # ## # ## ## ### # # # # # # # ### +## ## # # # # # # # # # # ## ## # # ## +# # # ### # # # # # ## # # # ### # # # # # ## ## ## # ## # +# # # # # ##### # ## # # # # # # # # # ## ## # # # ## +# # # # # # # ## # ## # # # # # # ## ### ## # # ##### # +# # # # # ## # # ## # # ## # ## # # # # ## # # # ## # +## ## # # # # # # ### # ## ### ## # ### # ## # # # ## # # ## # # +# # # # #### # ## #### # # # # # # # # # # ### # ## # # +# # ## # # # # # # # # # # ###### # ## # ## # # # #### #### # # +# # ##### # # # ### # # # # # # # # # ## ### # # +# # # # # # # ## # # ## # # ## # # # # # # # ## # # ### +## # ## # # # # #### # # ## # ## ## # ## # # ## # # +## # # # ## # # # # # # # # # # # # ###### # ## # # ## ### # #### # # +## # # # # # # # # # # # ## # # # # # # ## # # # ## # ## +## # # # ### # # # # # # # # # # # # # # ### +# # ### # # # # # ## ## ## # # ## # ### ### # # # +# # # # # ## # # ## ## # # # # # # ## ## ## # +# ### # # ### # # # # ### # # # # # # # ## # ## +# # ### ## ## ## ## # # ### # ## # # # # ## ## # # # # # # +# ## # # # ## # # # # ## # ### #### # ## ###### ### # +# # # # ### ### # # ## # # # ### ## # ## # # ## ## +# # # ### #### # # # # ### # # # ## ### ## # ## #### # # +# ### ## # # # # # # # # ### # # # # ## # ### ### ## # +# # # # # # # # # # ## ### ## ### # ## # # # ## # #### # ## # # +# # # # # # # # # # # ### # # # # # ## # # # # # # # +# ## # # # # ## # # # # ## ## ## # # ## # ## # # ## # ## # +# # # ## # # # # ### # # # # # # # ## # # # ## # ### ## # # # +## # ## # ## ### ## # # # # ## # # # # # # # +## ## # # ### # # # # # ## # # # # # ## # ## # # # # +# # # ## # ### # ## # # ## # # # # # # # # +# # # # # ## #### # # ### # ## # # ## # # ## # +# # # # ## # ### # ## ## # # # # ### # # # +# # # # # # # # # ## # ## ## ### ### # # ## # # # ## # +# # # # ## # # ### ##### # # # # ## # # # # # ## # # # +## # # # ## # # ## # ## ## # ## # ### # # # # # +# ## ## # ### # ## ### # # ## # # # # # # # # # # # ### +# ## # # # # # # # # # # # ## # # # # # # # # # # # ## # +# # # # ## # # # # # ## # # ## # # ## # # # ### ### # # # ## +# # # # ## # ## # # # # # # # ## # # ## # ### ## +### # # ## ### # ## # # #### # # # # ##### # ## #### # +# # # # # # # #### ## # ### ### # ## # ## # # ## # # # # # # ### +# #### # ## # # # # # # ## # # # # # # # # +# ## # # # # # # ## # ## ## # ### #### # # # # ## # +# # ## # ## # # # # ## ## # ## # ## # +# # # # # # # ## # # # # # # ### ## ### # ## # # ### +### # # # ##### # ## ## # # # ## # ## ## # # # # # # +# # # # # # ## ##### # ### # ## # # # ## # ### #### # # +# # ### # ## # # ### ## ## # ## # ### # ## ### # ### +# ## ## ## # # # # # # ### # ## # # ## # # # # +## ## ## # ## # ## # # # ## # ## # ## # ## # # # # +# # # # # # # # ## # # # ####### # ## ## ## ## +# # # # # # # # # ## # # # # # ## # # ### # ## +# # ## #### # # # # # ## ### # ### # ### # ### ## # # # +## # # ## # # # # # # # # ## # ##### # ## ##### #### ### +# # # # ## # ## # # ## # # ### ## ## # ###### +# # ## # # # # # # # # # ## ## # ## ## ## # ## # # +### #### # # ## # # # # # ## # # ## # # # #### # # ## # # +# ## ## # # ## # ## ## # # ## # # # # # #### # # +# ## # # # ## ### ## #### # # # # # # ## ### # # # ## +## # # # # # # # ## # ## ### # ## # ## # # # # +# # # # # # # # # ### # # # ## # # ## ## # #### # +# # ## # # # # # # # # # # ## ### # # # ## +## ## # ## # # # ## # # # # # #### # # ## ### # +## # ## ## # # # # ### # # ## # # # ## ## # # # # ## # +# ## # ## # # #### # # # # # # ## # # # # # # ### # +# ## # #### # # ## # # # # ### ## # ## ### # ## ## ## +# # # # # # ## # # # ## # #### # ##### # # # # # # # # +# # ## ## ### # ### ### # # #### # # # # ## # ## # # # # #### # # +# # # # ## # # ## # # ## # # ## # ## # # # ## ## # +# # ## # # # ## ## # ### ## # ## # # # # # # # ## # # # +# # ## # ## ## ## # # ## # # # # # ## # # # # ### # # +# # # ## # # # # # # # # # # # # ## # # # ## # # # +## # ## # # # # ## # # ## # # # # # # ## # # # # # # # # +# # ## # ## # ### # # ### # ## # # # ## # ### # ## # # +# # # ## # # ## # # # ## # # #### ## # # # ### # ## +# #### ## ### ### # # ### # # ## # # # ### # ####### # ## # #E# +#################################################################################################### \ No newline at end of file diff --git a/MashinDD/lab2/docs/data/maze_medium.txt b/MashinDD/lab2/docs/data/maze_medium.txt new file mode 100644 index 0000000..8bed293 --- /dev/null +++ b/MashinDD/lab2/docs/data/maze_medium.txt @@ -0,0 +1,50 @@ +################################################## +#S### # ## ## # # # ## ## ##### +# ## # # ## ## ## # # ### # # +# # # # # # # # # # # # # # # +# # # ## ### # ## ## ## # ## ## +## # # # # # # # # ## ## # # +# # # # ### # # ### # # # ## +# ## # ## ## ### # # # # # +## ### # # # ## # # # # +# # # # ## #### # # # # # # +## ## ## ## # ## # # # +# # ## # # # # # # # # ### ## +#### # # # ## # # # # # # +# # # # # ## ## # ## ###### +# ## ##### # # ## # ## # # # +# ## #### # ## # ## ## +## ## # # # # # +## ## # # # # # # # ## +# # # # ## # # +## # ## # # ### # # # # # # # +# # ## # # # # # +# ### ## # # # # # # # ### +# # ## # ## # # #### ## # ## # # ## +# ## ## # # # # # # ## # # +# # ## # ## # # # # ### # +# # # # # # ### # # # ## ## ## +# # # # ### # ## ## # # # +# ### ## # ## # # +# ## ### # # # # # # # +# ## # # # # ## # # # # ## +### # # # # ## # # # ## # # +## # ### # # # # # # +# # # # # ## ## ## # # +# # # ### # # # # ### +### # # # # ## ## # # +# # ### # # # # # # ## +# # # # ## # # # +# # # # ## # ### # ## # # # +### # # # # # # # # # # +# # # # # ### ## # # ## ### # +# # ## # ### ## # # # # ## # # +# # # # # # # ### # +## # # #### # ## # # # # # +# # ### # ## # # # # # # +# # # ### # # # # ## # # +## # # # # #### # # # ### # +## ## ## # ### # # ## # +# # ## ## ### # # # # # # ### # +# ## # # # # # E# +################################################## \ No newline at end of file diff --git a/MashinDD/lab2/docs/data/maze_model.py b/MashinDD/lab2/docs/data/maze_model.py new file mode 100644 index 0000000..664ad01 --- /dev/null +++ b/MashinDD/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/MashinDD/lab2/docs/data/maze_no_exit.txt b/MashinDD/lab2/docs/data/maze_no_exit.txt new file mode 100644 index 0000000..c93724b --- /dev/null +++ b/MashinDD/lab2/docs/data/maze_no_exit.txt @@ -0,0 +1,20 @@ +#################### +#S# # # ## # +# # # ## # +# # # # # +# # # # # +# ### +## # # # # +# # # # # +## # # # # # +# # # # +# # # ## # +# # # ## +# # # # +# # # # ## # +# # # +## # # ## +# ### ## +# # ## ### +# # # #E# +#################### \ No newline at end of file diff --git a/MashinDD/lab2/docs/data/maze_open.txt b/MashinDD/lab2/docs/data/maze_open.txt new file mode 100644 index 0000000..335d47e --- /dev/null +++ b/MashinDD/lab2/docs/data/maze_open.txt @@ -0,0 +1,50 @@ +################################################## +#S # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# E# +################################################## \ No newline at end of file diff --git a/MashinDD/lab2/docs/data/maze_small.txt b/MashinDD/lab2/docs/data/maze_small.txt new file mode 100644 index 0000000..952175d --- /dev/null +++ b/MashinDD/lab2/docs/data/maze_small.txt @@ -0,0 +1,10 @@ +########## +#S# ## +# # # # +# # # +# ## # +# # +# # # # # +# # +# E# +########## \ No newline at end of file diff --git a/MashinDD/lab2/docs/data/maze_solver.py b/MashinDD/lab2/docs/data/maze_solver.py new file mode 100644 index 0000000..5347cf9 --- /dev/null +++ b/MashinDD/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/MashinDD/lab2/docs/data/maze_strategies.py b/MashinDD/lab2/docs/data/maze_strategies.py new file mode 100644 index 0000000..a71c794 --- /dev/null +++ b/MashinDD/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/MashinDD/lab2/docs/data/plot_results.py b/MashinDD/lab2/docs/data/plot_results.py new file mode 100644 index 0000000..ac1d330 --- /dev/null +++ b/MashinDD/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/MashinDD/lab2/docs/data/results.csv b/MashinDD/lab2/docs/data/results.csv new file mode 100644 index 0000000..d762dc6 --- /dev/null +++ b/MashinDD/lab2/docs/data/results.csv @@ -0,0 +1,16 @@ +лабиринт,стратегия,время_мс,посещено_клеток,длина_пути,замер_1,замер_2,замер_3,замер_4,замер_5,замер_6,замер_7 +small_10x10,BFS,0.0594,54,15,0.0748,0.0593,0.0566,0.0550,0.0572,0.0570,0.0558 +small_10x10,DFS,0.0376,33,33,0.0434,0.0371,0.0356,0.0354,0.0351,0.0398,0.0368 +small_10x10,A*,0.0567,36,15,0.0700,0.0572,0.0526,0.0532,0.0543,0.0557,0.0538 +medium_50x50,BFS,1.7956,1639,95,1.9363,2.0031,1.8182,1.6895,1.7023,1.7157,1.7044 +medium_50x50,DFS,1.1344,1063,185,1.1353,1.1197,1.0973,1.1086,1.1111,1.1919,1.1772 +medium_50x50,A*,0.9810,588,95,0.9948,1.0057,0.9409,1.0389,0.9598,0.9937,0.9334 +large_100x100,BFS,7.6139,6564,0,8.5640,7.3117,7.5035,7.3270,7.2386,7.8444,7.5083 +large_100x100,DFS,7.0206,6564,0,7.2992,6.9348,7.0939,7.2919,6.9533,6.7842,6.7870 +large_100x100,A*,10.8821,6564,0,11.4343,11.5845,10.8324,10.3998,10.9124,10.6376,10.3738 +open_50x50,BFS,2.3515,2304,95,2.5185,2.3020,2.3359,2.2938,2.4015,2.3200,2.2889 +open_50x50,DFS,1.4357,1223,1129,1.6775,1.6397,1.3331,1.3384,1.3042,1.4293,1.3276 +open_50x50,A*,3.6998,2304,95,3.9999,3.5379,3.4987,3.9374,3.7333,3.7175,3.4739 +no_exit_20x20,BFS,0.2706,260,0,0.3313,0.3122,0.2750,0.2455,0.2482,0.2424,0.2397 +no_exit_20x20,DFS,0.2807,260,0,0.3192,0.3031,0.3427,0.2430,0.2509,0.2406,0.2654 +no_exit_20x20,A*,0.4247,260,0,0.4879,0.4647,0.4534,0.4483,0.3620,0.3585,0.3979 diff --git a/MashinDD/lab2/docs/report.md b/MashinDD/lab2/docs/report.md new file mode 100644 index 0000000..72cc8c3 --- /dev/null +++ b/MashinDD/lab2/docs/report.md @@ -0,0 +1,235 @@ +# Отчёт: Поиск выхода из лабиринта (ООП + паттерны проектирования) + +## Цель работы + +Разработать гибкую расширяемую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма, визуализации процесса и экспериментального сравнения алгоритмов. Применить минимум 3 паттерна проектирования из списка GoF и обосновать их выбор. + +--- + +## Применённые паттерны проектирования + +### 1. Builder (Строитель) — `maze_builder.py` + +**Задача:** загрузка лабиринта из файла — сложный процесс (парсинг, валидация, расстановка старта/выхода). + +**Решение:** интерфейс `MazeBuilder` с методом `build_from_file()` и реализация `TextFileMazeBuilder`. Клиентский код работает только с интерфейсом и не знает деталей парсинга. + +**Преимущество:** чтобы добавить поддержку JSON или бинарного формата — достаточно создать новый класс, не трогая ничего остального. + +### 2. Strategy (Стратегия) — `maze_strategies.py` + +**Задача:** несколько алгоритмов поиска пути (BFS, DFS, A*) нужно переключать без изменения кода оркестратора. + +**Решение:** интерфейс `PathFindingStrategy` с методом `find_path()`. Каждый алгоритм — отдельный класс. `MazeSolver.set_strategy()` меняет алгоритм в одну строку. + +**Преимущество:** новый алгоритм (например, Dijkstra) добавляется реализацией интерфейса, без правок в `MazeSolver`. + +### 3. Observer (Наблюдатель) — `maze_solver.py` + +**Задача:** отображать события (путь найден, игрок переместился) без жёсткой связи между логикой и интерфейсом. + +**Решение:** интерфейс `Observer` с методом `update(event, data)`. `ConsoleView` подписывается на `MazeSolver` и реагирует на события `path_found`, `maze_loaded`, `move`. + +**Преимущество:** можно добавить графический интерфейс или логгер, не меняя логику решателя. + +### 4. Command (Команда) — `maze_solver.py` + +**Задача:** пошаговое перемещение игрока с возможностью отмены хода. + +**Решение:** интерфейс `Command` с `execute()` и `undo()`. `MoveCommand` хранит предыдущую клетку и умеет откатить ход. `Player` хранит текущую позицию. + +**Преимущество:** история команд позволяет реализовать `Ctrl+Z` для любого количества шагов. + +--- + +## Диаграмма классов (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 +``` +--- + +## Экспериментальная часть + +### Параметры эксперимента + +| Параметр | Значение | +|---|---| +| Повторений на замер | 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) + +--- + +## Анализ результатов + +### 1. BFS — оптимальный путь, высокое покрытие + +BFS всегда находит **кратчайший путь** (15 шагов на small, 95 на medium). Но для этого он обходит больше клеток, чем DFS: на medium_50x50 посетил 1639 против 1063 у DFS. Это нормально — BFS расширяется волнами во все стороны. + +### 2. DFS — быстрый по времени, длинный путь + +DFS посещает меньше клеток в среднем, но путь получается значительно длиннее: 185 шагов против 95 у BFS на том же лабиринте. На открытом лабиринте без стен DFS нашёл путь в **1129 шагов** вместо 95 у BFS — наглядная демонстрация того, что DFS не гарантирует оптимальности. + +### 3. A* — меньше всего посещённых клеток + +На medium_50x50 A* посетил всего **588 клеток** против 1639 у BFS — в 2.8 раза меньше. При этом путь тот же оптимальный (95 шагов). Манхэттенская эвристика направляет поиск к выходу и отсекает лишние направления. + +На открытом лабиринте без стен A* тратит больше времени (5.566 мс против 3.296 мс у BFS) — эвристика считается для каждого узла, а без препятствий нет выигрыша в отсечении. + +### 4. Большой лабиринт (100×100) — путь не найден + +Все три алгоритма исчерпали все 6564 доступные клетки и не нашли пути. При плотности стен 30% на данном лабиринте выход оказался недостижим. Все алгоритмы корректно вернули пустой результат. + +### 5. Лабиринт без выхода + +Все алгоритмы корректно обработали случай недостижимого выхода, посетив все 260 доступных клеток. + +--- + +## Выводы + +### Когда какой алгоритм выбирать + +| Задача | Рекомендация | +|---|---| +| Нужен кратчайший путь | BFS или A* | +| Нужно быстро найти хоть какой-то путь | DFS | +| Большой лабиринт, нужна оптимальность | A* (посещает меньше клеток) | +| Лабиринт без препятствий | BFS (A* теряет преимущество) | +| Обнаружить недостижимый выход | Любой — все обходят все клетки | + +### Как ООП и паттерны помогли + +**Без паттернов** весь код был бы в одной функции: парсинг, алгоритм и вывод перемешаны. Добавление нового алгоритма требовало бы правки основного кода. + +**С паттернами:** +- `Builder` — смена формата файла (txt → JSON) не затрагивает логику поиска +- `Strategy` — новый алгоритм добавляется одним классом без правок `MazeSolver` +- `Observer` — `ConsoleView` отключается или заменяется GUI без правок логики +- `Command` — история ходов и отмена реализуются без изменения `Player` + +Каждый класс отвечает за одну вещь, код можно тестировать по частям независимо.