2026-rff_mp/stepinim/lab2_oop/docs/otchet_2lab.md

122 lines
5.3 KiB
Markdown
Raw Normal View History

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