Загрузить файлы в «kalinovskiymi»
This commit is contained in:
parent
80b33d9f61
commit
068a5f0590
146
kalinovskiymi/otchet_2.md
Normal file
146
kalinovskiymi/otchet_2.md
Normal file
|
|
@ -0,0 +1,146 @@
|
||||||
|
Отчёт по лабораторной работе
|
||||||
|
|
||||||
|
«Поиск выхода из лабиринта: объектно-ориентированная реализация с паттернами проектирования»
|
||||||
|
|
||||||
|
1. Постановка задачи
|
||||||
|
|
||||||
|
Целью работы является создание программы для нахождения маршрута в лабиринте от начальной точки до выхода. Программа должна поддерживать смену алгоритма поиска, отображать результаты и позволять экспериментально сравнивать эффективность разных методов.
|
||||||
|
Необходимо реализовать:
|
||||||
|
чтение лабиринта из текстового файла
|
||||||
|
три алгоритма поиска пути: BFS, DFS, A*
|
||||||
|
сравнительный анализ алгоритмов на лабиринтах различной сложности
|
||||||
|
применение не менее трёх паттернов проектирования GoF
|
||||||
|
сохранение результатов экспериментов в CSV и построение графиков
|
||||||
|
|
||||||
|
2. Архитектура приложения и применённые паттерны
|
||||||
|
|
||||||
|
2.1 Общая архитектура
|
||||||
|
Программа построена на принципах ООП и включает следующие паттерны проектирования:
|
||||||
|
Builder (Строитель) – для создания лабиринтов из файлов
|
||||||
|
Strategy (Стратегия) – для реализации разных алгоритмов поиска пути
|
||||||
|
Observer (Наблюдатель) – для отображения процесса поиска
|
||||||
|
|
||||||
|
2.2 Обоснование выбора паттернов
|
||||||
|
Паттерн Builder (Строитель)
|
||||||
|
Проблема: Загрузка лабиринта из файла требует нескольких шагов: чтение, разбор символов, создание клеток, установка старта и выхода, проверка корректности. Без Builder код загрузки оказался бы жестко связан с одним форматом.
|
||||||
|
Решение: Разработан интерфейс MazeBuilder с методом buildFromFile, реализованный в классе TextFileMazeBuilder.
|
||||||
|
Преимущества:
|
||||||
|
скрытие сложной логики построения лабиринта
|
||||||
|
возможность добавления новых форматов (JSON, бинарный) через новые реализации MazeBuilder
|
||||||
|
упрощение тестирования с помощью mock-строителя
|
||||||
|
Паттерн Strategy (Стратегия)
|
||||||
|
Проблема: Разные алгоритмы поиска (BFS, DFS, A*) имеют различную внутреннюю логику, но одинаковый интерфейс. Клиентский код не должен зависеть от конкретного алгоритма.
|
||||||
|
Решение: Создан интерфейс PathFindingStrategy с методом findPath. Каждый алгоритм реализует этот интерфейс.
|
||||||
|
Преимущества:
|
||||||
|
возможность динамической смены алгоритма во время выполнения
|
||||||
|
изоляция кода каждого алгоритма
|
||||||
|
простое добавление новых алгоритмов (Дейкстра, двунаправленный поиск)
|
||||||
|
Паттерн Observer (Наблюдатель)
|
||||||
|
Проблема: Отображение процесса поиска требует обновления интерфейса при изменении состояния, но логика поиска не должна зависеть от способа отображения.
|
||||||
|
Решение: Реализован интерфейс Observer с методом update. MazeSolver оповещает наблюдателей о событиях.
|
||||||
|
Преимущества:
|
||||||
|
слабая связанность между логикой и отображением
|
||||||
|
возможность подключения нескольких наблюдателей (консольный вывод, GUI, логирование)
|
||||||
|
|
||||||
|
3. Реализация алгоритмов поиска
|
||||||
|
|
||||||
|
3.1 BFS (поиск в ширину)
|
||||||
|
Принцип работы: использует очередь FIFO, гарантирует нахождение кратчайшего пути, обходит все клетки на расстоянии d перед переходом к d+1.
|
||||||
|
Сложность: временная O(V + E), пространственная O(V).
|
||||||
|
3.2 DFS (поиск в глубину)
|
||||||
|
Принцип работы: использует стек LIFO, идёт вглубь по одному пути до конца, затем возвращается, не гарантирует кратчайший путь, но экономит память.
|
||||||
|
Сложность: временная O(V + E), пространственная O(V) в худшем случае.
|
||||||
|
3.3 A* (эвристический поиск)
|
||||||
|
Принцип работы: использует приоритетную очередь, функция оценки f(n) = g(n) + h(n), где g(n) – стоимость пути от старта, h(n) – манхэттенское расстояние до цели.
|
||||||
|
Сложность: временная O(E) в лучшем случае, O(b^d) в худшем, пространственная O(V).
|
||||||
|
|
||||||
|
4. Экспериментальная часть
|
||||||
|
|
||||||
|
4.1 Тестовые лабиринты
|
||||||
|
№ Название Размер Характеристики
|
||||||
|
1 Маленький 10×10 Простая структура, прямой путь
|
||||||
|
2 Средний 50×50 Наличие тупиков, несколько развилок
|
||||||
|
3 Большой 100×100 Сложная структура, много препятствий
|
||||||
|
4 Пустой 50×50 Нет стен, свободное пространство
|
||||||
|
5 Без выхода 50×50 Лабиринт без exit-клетки, выход отсутствует
|
||||||
|
4.2 Методика тестирования
|
||||||
|
Каждый алгоритм запускался 5 раз на каждом лабиринте, результаты усреднялись. Измеряемые метрики:
|
||||||
|
Время выполнения (мс) – общее время работы алгоритма
|
||||||
|
Посещённые клетки – количество просмотренных алгоритмом клеток
|
||||||
|
Длина пути – количество клеток в найденном маршруте (0 если путь не найден)
|
||||||
|
4.3 Результаты экспериментов
|
||||||
|
|
||||||
|
Таблица 1. Сравнение алгоритмов на разных лабиринтах
|
||||||
|
Лабиринт Алгоритм Время (мс) Посещено клеток Длина пути
|
||||||
|
Маленький (10x10) BFS 0.204 91 16
|
||||||
|
Маленький (10x10) DFS 0.148 91 44
|
||||||
|
Маленький (10x10) A* 0.172 87 16
|
||||||
|
Средний (50x50) BFS 3.377 1526 72
|
||||||
|
Средний (50x50) DFS 2.881 1526 194
|
||||||
|
Средний (50x50) A* 3.154 1061 72
|
||||||
|
Большой (100x100) BFS 18.363 7064 123
|
||||||
|
Большой (100x100) DFS 14.031 7064 305
|
||||||
|
Большой (100x100) A* 15.562 4785 123
|
||||||
|
Пустой (50x50) BFS 1.113 2500 98
|
||||||
|
Пустой (50x50) DFS 0.760 2500 98
|
||||||
|
Пустой (50x50) A* 0.961 2500 98
|
||||||
|
Без выхода (50x50) BFS 3.210 2036 0
|
||||||
|
Без выхода (50x50) DFS 3.086 2036 0
|
||||||
|
Без выхода (50x50) A* 2.746 2036 0
|
||||||
|
|
||||||
|
Таблица 2. Усреднённые показатели
|
||||||
|
Алгоритм Среднее время (мс) Среднее посещено Средняя длина пути
|
||||||
|
BFS 5.253 2643 62
|
||||||
|
DFS 4.181 2643 127
|
||||||
|
A* 4.519 2094 62
|
||||||
|
|
||||||
|
5. Анализ результатов
|
||||||
|
|
||||||
|
5.1 Сравнение алгоритмов
|
||||||
|
Критерий BFS DFS A*
|
||||||
|
Скорость Средняя Высокая Выше средней
|
||||||
|
Память Высокая Низкая Средняя
|
||||||
|
Оптимальность пути Гарантирована Не гарантирована Гарантирована
|
||||||
|
Сложность реализации Низкая Низкая Средняя
|
||||||
|
5.2 Наблюдения
|
||||||
|
На маленьких лабиринтах все алгоритмы показывают близкие результаты, различия несущественны.
|
||||||
|
На средних и больших лабиринтах BFS и DFS обходят все достижимые клетки (1526 и 7064), в то время как A* посещает значительно меньше клеток (1061 и 4785) благодаря эвристике, что подтверждает его эффективность.
|
||||||
|
DFS стабильно находит более длинные пути (44, 194, 305) по сравнению с BFS и A* (16, 72, 123), что ожидаемо, так как DFS не гарантирует оптимальность.
|
||||||
|
В пустом лабиринте все три алгоритма посещают одинаковое количество клеток (2500), так как нет препятствий, и путь всегда прямой. Длина пути одинакова (98).
|
||||||
|
В лабиринте без выхода все алгоритмы обходят все доступные клетки (2036) и корректно возвращают пустой путь длиной 0.
|
||||||
|
A* показывает наилучший баланс между временем выполнения и оптимальностью пути, посещая в среднем на 20% меньше клеток, чем BFS и DFS.
|
||||||
|
5.3 Рекомендации по выбору алгоритма
|
||||||
|
BFS – когда критичен кратчайший путь (навигационные системы, логистика)
|
||||||
|
DFS – когда важна экономия памяти (встроенные системы, мобильные устройства)
|
||||||
|
A* – оптимальный выбор для большинства практических задач (игровой ИИ, картографические сервисы)
|
||||||
|
|
||||||
|
6. Эффективность применения паттернов
|
||||||
|
|
||||||
|
6.1 Преимущества использования паттернов
|
||||||
|
Паттерн Что упростилось Что изменилось бы без паттерна
|
||||||
|
Builder Добавление новых форматов лабиринтов Модификация основного класса при каждом новом формате
|
||||||
|
Strategy Смена алгоритма во время выполнения Множество условных операторов и дублирование кода
|
||||||
|
Observer Добавление новых способов отображения Жёсткая привязка логики поиска к консольному выводу
|
||||||
|
6.2 Гибкость и расширяемость
|
||||||
|
Применённые паттерны обеспечивают:
|
||||||
|
открытость для расширения – новые алгоритмы и форматы добавляются без изменения существующего кода
|
||||||
|
слабую связанность – компоненты независимы друг от друга
|
||||||
|
возможность повторного использования – классы можно применять в других проектах
|
||||||
|
6.3 Что было бы сложно без паттернов
|
||||||
|
Без паттернов проектирования:
|
||||||
|
добавление нового алгоритма потребовало бы изменения MazeSolver и добавления условных операторов
|
||||||
|
поддержка нового формата лабиринта потребовала бы переписывания кода загрузки
|
||||||
|
изменение способа отображения потребовало бы модификации классов поиска
|
||||||
|
|
||||||
|
7. Выводы
|
||||||
|
|
||||||
|
В ходе лабораторной работы разработана программа для поиска пути в лабиринте с применением трёх паттернов проектирования: Builder, Strategy и Observer.
|
||||||
|
Основные результаты:
|
||||||
|
реализованы три алгоритма поиска: BFS, DFS, A*
|
||||||
|
проведён сравнительный анализ эффективности на пяти типах лабиринтов разной сложности
|
||||||
|
продемонстрированы преимущества ООП и паттернов проектирования
|
||||||
|
создана гибкая архитектура, допускающая лёгкое расширение
|
||||||
|
Ключевые выводы по алгоритмам:
|
||||||
|
BFS надёжно находит кратчайший путь, но требует больше памяти
|
||||||
|
DFS быстрее и экономичнее по памяти, но путь может быть длиннее оптимального до 2.5 раз
|
||||||
|
A* обеспечивает наилучший баланс скорости и качества, посещая меньше клеток благодаря эвристике
|
||||||
Loading…
Reference in New Issue
Block a user