2026-rff_mp/stepinim/lab2_oop/docs/otchet_2lab.md
2026-05-20 15:19:09 +03:00

5.3 KiB
Raw Blame History

ОПИСАНИЕ ЗАДАЧИ И ВЫБРАННЫХ ПАТТЕРНОВ

Цель работы — разработать систему поиска пути в лабиринте с использованием оопп и паттернов проектирования.

В работе были использованы следующие паттерны:

Strategy — для реализации алгоритмов поиска пути (BFS, DFS, A*, Dijkstra). Позволяет менять алгоритм без изменения кода основного класса MazeSolver.

Builder — для создания лабиринта из текстового файла. Отделяет логику загрузки данных от основной системы. '''mermaid

classDiagram class Cell { +x +y +is_wall +is_start +is_exit +weight +isPassable() }

class Maze { +width +height +start +exit +getCell() +getNeighbors() +getWeightedNeighbors() }

class MazeBuilder { +buildFromFile() }

class TextFileMazeBuilder MazeBuilder <|-- TextFileMazeBuilder

class PathFindingStrategy { +findPath() }

class BFSStrategy class DFSStrategy class AStarStrategy class DijkstraStrategy

PathFindingStrategy <|-- BFSStrategy PathFindingStrategy <|-- DFSStrategy PathFindingStrategy <|-- AStarStrategy PathFindingStrategy <|-- DijkstraStrategy

class MazeSolver { +setStrategy() +solve() }

MazeSolver --> PathFindingStrategy Maze --> Cell ''' ЛИСТИНГИ КЛЮЧЕВЫХ КЛАССОВ

В проекте реализованы основные классы: Cell — хранение информации о клетке лабиринта Maze — структура лабиринта и работа с соседями MazeSolver — запуск поиска пути PathFindingStrategy — интерфейс алгоритмов BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy — реализации алгоритмов TextFileMazeBuilder — загрузка лабиринта из файла SearchStats — хранение статистики

РЕЗУЛЬТАТЫ ЭКСПЕРИМЕНТОВ

Алгоритмы тестировались на разных лабиринтах: small, medium, large, empty, no_exit.

Сравнивались:

время выполнения количество посещённых клеток длина найденного пути

Результаты в общем виде:

BFS — гарантирует кратчайший путь, но посещает много клеток DFS — быстрый, но не гарантирует оптимальный путь A* — самый быстрый в большинстве случаев за счёт эвристики Dijkstra — стабильный, но медленнее A* на больших лабиринтах

АНАЛИЗ ЭФФЕКТИВНОСТИ И ПАТТЕРНОВ

Результаты показали, что A* является наиболее эффективным алгоритмом на больших данных, так как использует эвристику и уменьшает количество проверяемых клеток.

BFS всегда находит оптимальный путь, но работает медленнее из-за полного обхода пространства.

DFS быстрее по времени, но не гарантирует лучший результат.

Dijkstra корректно работает с весами, но в данной задаче часто уступает A*.

Паттерн Strategy позволил легко переключать алгоритмы без изменения основной логики программы. Паттерн Builder упростил создание лабиринтов и отделил загрузку данных от логики поиска.

ВЫВОДЫ

В ходе работы была создана гибкая система поиска пути в лабиринте с использованием ООП и паттернов проектирования. Благодаря Strategy алгоритмы стали независимыми и легко заменяемыми. Благодаря Builder упростилась работа с созданием и загрузкой лабиринтов. В целом, архитектура получилась расширяемой: можно легко добавить новый алгоритм или тип лабиринта без переписывания существующего кода. Таким образом, наиболее сбалансированным алгоритмом для поиска пути в лабиринте является A*, так как он обеспечивает:

высокую скорость работы, оптимальность результата, минимальное количество исследуемых состояний.

Алгоритмы BFS и Dijkstra гарантируют оптимальность, но проигрывают по производительности, а DFS является самым быстрым, но не гарантирует качество решения.