5.3 KiB
ОПИСАНИЕ ЗАДАЧИ И ВЫБРАННЫХ ПАТТЕРНОВ
Цель работы — разработать систему поиска пути в лабиринте с использованием оопп и паттернов проектирования.
В работе были использованы следующие паттерны:
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 является самым быстрым, но не гарантирует качество решения.