From e71fe47f8cbec6cf52b68e9bec12107bbba923db Mon Sep 17 00:00:00 2001 From: shekurovaa Date: Wed, 20 May 2026 20:55:28 +0300 Subject: [PATCH] [2] lab2 --- shekurovaa/2/docs/Report.docx | Bin 0 -> 78061 bytes shekurovaa/2/docs/data/builder.py | 46 +++++++++++ shekurovaa/2/docs/data/command.py | 44 +++++++++++ shekurovaa/2/docs/data/experiments.py | 30 +++++++ shekurovaa/2/docs/data/main.py | 33 ++++++++ shekurovaa/2/docs/data/mazes/small.txt | 10 +++ shekurovaa/2/docs/data/model.py | 67 ++++++++++++++++ shekurovaa/2/docs/data/observer.py | 15 ++++ shekurovaa/2/docs/data/solver.py | 38 +++++++++ shekurovaa/2/docs/data/strategies.py | 103 +++++++++++++++++++++++++ shekurovaa/2/docs/~$Report.docx | Bin 0 -> 162 bytes 11 files changed, 386 insertions(+) create mode 100644 shekurovaa/2/docs/Report.docx create mode 100644 shekurovaa/2/docs/data/builder.py create mode 100644 shekurovaa/2/docs/data/command.py create mode 100644 shekurovaa/2/docs/data/experiments.py create mode 100644 shekurovaa/2/docs/data/main.py create mode 100644 shekurovaa/2/docs/data/mazes/small.txt create mode 100644 shekurovaa/2/docs/data/model.py create mode 100644 shekurovaa/2/docs/data/observer.py create mode 100644 shekurovaa/2/docs/data/solver.py create mode 100644 shekurovaa/2/docs/data/strategies.py create mode 100644 shekurovaa/2/docs/~$Report.docx diff --git a/shekurovaa/2/docs/Report.docx b/shekurovaa/2/docs/Report.docx new file mode 100644 index 0000000000000000000000000000000000000000..1d5ac2a4520dcee94f3206772df6e2956e139bd1 GIT binary patch literal 78061 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 z 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 Wv`+yd1w!`&KMg?VF+zt< Maze: + raise NotImplementedError + + +class TextFileMazeBuilder(MazeBuilder): + def buildFromFile(self, filename: str) -> Maze: + with open(filename, "r", encoding="utf-8") as f: + raw_lines = [line.rstrip("\n") for line in f if line.strip("\n") != ""] + + width = max(len(line) for line in raw_lines) + grid = [] + + start_count = 0 + exit_count = 0 + + for y, line in enumerate(raw_lines): + row = [] + padded = line.ljust(width) + for x, ch in enumerate(padded): + if ch == "#": + row.append(Cell(x, y, isWall=True)) + elif ch == "S": + row.append(Cell(x, y, isStart=True)) + start_count += 1 + elif ch == "E": + row.append(Cell(x, y, isExit=True)) + exit_count += 1 + elif ch == "1": + row.append(Cell(x, y, weight=1)) + elif ch == "2": + row.append(Cell(x, y, weight=2)) + elif ch == "3": + row.append(Cell(x, y, weight=3)) + else: + row.append(Cell(x, y)) + grid.append(row) + + maze = Maze(grid) + + if start_count != 1 or exit_count != 1: + raise ValueError("В лабиринте должен быть ровно один S и один E") + + return maze \ No newline at end of file diff --git a/shekurovaa/2/docs/data/command.py b/shekurovaa/2/docs/data/command.py new file mode 100644 index 0000000..d5ed005 --- /dev/null +++ b/shekurovaa/2/docs/data/command.py @@ -0,0 +1,44 @@ +class Command: + def execute(self): + raise NotImplementedError + + def undo(self): + raise NotImplementedError + + +class Player: + def __init__(self, position): + self.position = position + + +class MoveCommand(Command): + DIRS = { + "W": (0, -1), + "S": (0, 1), + "A": (-1, 0), + "D": (1, 0), + } + + def __init__(self, maze, player, direction): + self.maze = maze + self.player = player + self.direction = direction.upper() + self.prev_position = None + + def execute(self): + if self.direction not in self.DIRS: + return False + dx, dy = self.DIRS[self.direction] + current = self.player.position + nxt = self.maze.getCell(current.x + dx, current.y + dy) + if nxt is None or not nxt.isPassable(): + return False + self.prev_position = current + self.player.position = nxt + return True + + def undo(self): + if self.prev_position is not None: + self.player.position = self.prev_position + return True + return False \ No newline at end of file diff --git a/shekurovaa/2/docs/data/experiments.py b/shekurovaa/2/docs/data/experiments.py new file mode 100644 index 0000000..41df502 --- /dev/null +++ b/shekurovaa/2/docs/data/experiments.py @@ -0,0 +1,30 @@ +import csv +from statistics import mean + +def run_experiments(maze_files, strategies, runs=5, out_csv="output/results.csv"): + rows = [] + for maze_name, maze in maze_files.items(): + for strat_name, strat_cls in strategies.items(): + times = [] + visiteds = [] + lengths = [] + for _ in range(runs): + solver = maze["solver_factory"](strat_cls()) + stats = solver.solve() + times.append(stats.timeMs) + visiteds.append(stats.visitedCells) + lengths.append(stats.pathLength) + rows.append({ + "maze": maze_name, + "strategy": strat_name, + "time_ms": round(mean(times), 3), + "visited_cells": round(mean(visiteds), 1), + "path_length": round(mean(lengths), 1) + }) + + with open(out_csv, "w", newline="", encoding="utf-8") as f: + writer = csv.DictWriter(f, fieldnames=["maze", "strategy", "time_ms", "visited_cells", "path_length"]) + writer.writeheader() + writer.writerows(rows) + + return rows \ No newline at end of file diff --git a/shekurovaa/2/docs/data/main.py b/shekurovaa/2/docs/data/main.py new file mode 100644 index 0000000..f8e59fe --- /dev/null +++ b/shekurovaa/2/docs/data/main.py @@ -0,0 +1,33 @@ +from builder import TextFileMazeBuilder +from strategies import BFSStrategy, DFSStrategy, AStarStrategy +from solver import MazeSolver +from observer import ConsoleView +from command import Player, MoveCommand + +def main(): + builder = TextFileMazeBuilder() + maze = builder.buildFromFile("mazes/small.txt") + + console = ConsoleView() + console.update({"type": "message", "text": "Лабиринт загружен:"}) + console.update({"type": "render", "maze": maze}) + + strategies = { + "BFS": BFSStrategy(), + "DFS": DFSStrategy(), + "A*": AStarStrategy() + } + + for name, strat in strategies.items(): + solver = MazeSolver(maze, strat) + stats = solver.solve() + print(f"{name}: time={stats.timeMs:.3f} ms, visited={stats.visitedCells}, path={stats.pathLength}") + console.update({"type": "render", "maze": maze, "path": stats.path}) + + player = Player(maze.start) + cmd = MoveCommand(maze, player, "D") + cmd.execute() + console.update({"type": "render", "maze": maze, "player": player.position}) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/shekurovaa/2/docs/data/mazes/small.txt b/shekurovaa/2/docs/data/mazes/small.txt new file mode 100644 index 0000000..f3d092c --- /dev/null +++ b/shekurovaa/2/docs/data/mazes/small.txt @@ -0,0 +1,10 @@ +########## +#S # # +# ## # # # +# ## # # +# ### # +### ## # +# # # +# # ###E # +# # +########## \ No newline at end of file diff --git a/shekurovaa/2/docs/data/model.py b/shekurovaa/2/docs/data/model.py new file mode 100644 index 0000000..587691b --- /dev/null +++ b/shekurovaa/2/docs/data/model.py @@ -0,0 +1,67 @@ +from dataclasses import dataclass +from typing import List, Optional + +@dataclass(frozen=True) +class Cell: + x: int + y: int + isWall: bool = False + isStart: bool = False + isExit: bool = False + weight: int = 1 + + def isPassable(self) -> bool: + return not self.isWall + + +class Maze: + def __init__(self, grid: List[List[Cell]]): + self.grid = grid + self.height = len(grid) + self.width = len(grid[0]) if self.height else 0 + self.start: Optional[Cell] = None + self.exit: Optional[Cell] = None + + for row in grid: + for cell in row: + if cell.isStart: + self.start = cell + if cell.isExit: + self.exit = cell + + def getCell(self, x: int, y: int) -> Optional[Cell]: + if 0 <= y < self.height and 0 <= x < self.width: + return self.grid[y][x] + return None + + def getNeighbors(self, cell: Cell) -> List[Cell]: + result = [] + for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]: + nxt = self.getCell(cell.x + dx, cell.y + dy) + if nxt is not None and nxt.isPassable(): + result.append(nxt) + return result + + def render(self, path=None, player_position=None) -> str: + path_set = {(c.x, c.y) for c in path} if path else set() + player_xy = (player_position.x, player_position.y) if player_position else None + + lines = [] + for y in range(self.height): + row = [] + for x in range(self.width): + c = self.grid[y][x] + if player_xy == (x, y): + row.append("P") + elif c.isStart: + row.append("S") + elif c.isExit: + row.append("E") + elif (x, y) in path_set: + row.append(".") + elif c.isWall: + row.append("#") + else: + row.append(" ") + lines.append("".join(row)) + return "\n".join(lines) \ No newline at end of file diff --git a/shekurovaa/2/docs/data/observer.py b/shekurovaa/2/docs/data/observer.py new file mode 100644 index 0000000..43628e8 --- /dev/null +++ b/shekurovaa/2/docs/data/observer.py @@ -0,0 +1,15 @@ +class Observer: + def update(self, event): + raise NotImplementedError + + +class ConsoleView(Observer): + def update(self, event): + if isinstance(event, dict) and event.get("type") == "message": + print(event["text"]) + elif isinstance(event, dict) and event.get("type") == "render": + maze = event["maze"] + path = event.get("path") + player = event.get("player") + print(maze.render(path=path, player_position=player)) + print() \ No newline at end of file diff --git a/shekurovaa/2/docs/data/solver.py b/shekurovaa/2/docs/data/solver.py new file mode 100644 index 0000000..57d22c5 --- /dev/null +++ b/shekurovaa/2/docs/data/solver.py @@ -0,0 +1,38 @@ +import time +from dataclasses import dataclass + +@dataclass +class SearchStats: + timeMs: float + visitedCells: int + pathLength: int + path: list + + +class MazeSolver: + def __init__(self, maze, strategy): + self.maze = maze + self.strategy = strategy + + def setStrategy(self, strategy): + self.strategy = strategy + + def solve(self) -> SearchStats: + if self.maze.start is None or self.maze.exit is None: + raise ValueError("Лабиринт должен содержать start и exit") + + t0 = time.perf_counter() + result = self.strategy.findPath(self.maze, self.maze.start, self.maze.exit) + t1 = time.perf_counter() + + if isinstance(result, tuple): + path, visited = result + else: + path, visited = result, 0 + + return SearchStats( + timeMs=(t1 - t0) * 1000, + visitedCells=visited, + pathLength=len(path), + path=path + ) \ No newline at end of file diff --git a/shekurovaa/2/docs/data/strategies.py b/shekurovaa/2/docs/data/strategies.py new file mode 100644 index 0000000..0274d9a --- /dev/null +++ b/shekurovaa/2/docs/data/strategies.py @@ -0,0 +1,103 @@ +from collections import deque +import heapq +from math import inf + +class PathFindingStrategy: + def findPath(self, maze, start, exit): + raise NotImplementedError + + +def reconstruct_path(parent, start, goal): + if goal not in parent and goal != start: + return [] + path = [] + cur = goal + while cur != start: + path.append(cur) + cur = parent[cur] + path.append(start) + path.reverse() + return path + + +class BFSStrategy(PathFindingStrategy): + def findPath(self, maze, start, exit): + queue = deque([start]) + visited = {start} + parent = {} + visited_count = 0 + + while queue: + current = queue.popleft() + visited_count += 1 + if current == exit: + path = reconstruct_path(parent, start, exit) + return path, visited_count + + for nxt in maze.getNeighbors(current): + if nxt not in visited: + visited.add(nxt) + parent[nxt] = current + queue.append(nxt) + + return [], visited_count + + +class DFSStrategy(PathFindingStrategy): + def findPath(self, maze, start, exit): + stack = [start] + visited = {start} + parent = {} + visited_count = 0 + + while stack: + current = stack.pop() + visited_count += 1 + if current == exit: + path = reconstruct_path(parent, start, exit) + return path, visited_count + + for nxt in maze.getNeighbors(current): + if nxt not in visited: + visited.add(nxt) + parent[nxt] = current + stack.append(nxt) + + return [], visited_count + + +class AStarStrategy(PathFindingStrategy): + def h(self, a, b): + return abs(a.x - b.x) + abs(a.y - b.y) + + def findPath(self, maze, start, exit): + open_heap = [] + heapq.heappush(open_heap, (0, 0, start)) + parent = {} + g = {start: 0} + visited = set() + visited_count = 0 + counter = 1 + + while open_heap: + _, _, current = heapq.heappop(open_heap) + if current in visited: + continue + + visited.add(current) + visited_count += 1 + + if current == exit: + path = reconstruct_path(parent, start, exit) + return path, visited_count + + for nxt in maze.getNeighbors(current): + tentative_g = g[current] + nxt.weight + if tentative_g < g.get(nxt, inf): + g[nxt] = tentative_g + parent[nxt] = current + f = tentative_g + self.h(nxt, exit) + heapq.heappush(open_heap, (f, counter, nxt)) + counter += 1 + + return [], visited_count \ No newline at end of file diff --git a/shekurovaa/2/docs/~$Report.docx b/shekurovaa/2/docs/~$Report.docx new file mode 100644 index 0000000000000000000000000000000000000000..6288f3314cfad7e737348ab6c8dcf8ebf7d26351 GIT binary patch literal 162 zcmZQS@cQYik56ARkObHn1X!$DOj)d09D$@I3rw@g+QNVz^$ZLLQVO=MWn^IZf5{{S e#1EJs1LgyTumYI;+JI89{(|H2=@CGcAoT!uXdIjX literal 0 HcmV?d00001