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