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 является самым быстрым, но не гарантирует качество решения. |