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

122 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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