From 04a49325d335f6832066bce54bf82e6a884a8798 Mon Sep 17 00:00:00 2001 From: dyachenkoas Date: Sun, 24 May 2026 21:56:23 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C=20dy?= =?UTF-8?q?achenkoas/docs/otchet=5Flaba=5F2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dyachenkoas/docs/otchet_laba_2.md | 210 ------------------------------ 1 file changed, 210 deletions(-) delete mode 100644 dyachenkoas/docs/otchet_laba_2.md diff --git a/dyachenkoas/docs/otchet_laba_2.md b/dyachenkoas/docs/otchet_laba_2.md deleted file mode 100644 index f6b9a97..0000000 --- a/dyachenkoas/docs/otchet_laba_2.md +++ /dev/null @@ -1,210 +0,0 @@ -Отчёт по лабораторной работе - -«Поиск выхода из лабиринта: объектно-ориентированная реализация с паттернами проектирования» - -1. Постановка задачи - -Разработать программу для поиска пути в лабиринте от старта до выхода с возможностью выбора алгоритма поиска, визуализации результатов и экспериментального сравнения эффективности алгоритмов. - -Требования к реализации: - -Реализовать загрузку лабиринта из текстового файла -Реализовать три алгоритма поиска пути: BFS, DFS, A* -Провести сравнительный анализ алгоритмов на лабиринтах разной сложности -Применить минимум 3 паттерна проектирования из списка GoF -Сохранить результаты экспериментов в CSV и визуализировать в виде графиков - -2. Архитектура приложения и применённые паттерны - -2.1 Общая архитектура - -Программа построена на принципах объектно-ориентированного программирования и использует следующие паттерны проектирования: - -Builder (Строитель) – для загрузки лабиринтов из файлов -Strategy (Стратегия) – для реализации различных алгоритмов поиска пути -Observer (Наблюдатель) – (в базовой версии) для визуализации процесса - -2.2 Обоснование выбора паттернов - -Паттерн Builder (Строитель) - -Проблема: Загрузка лабиринта из файла включает несколько этапов: чтение файла, парсинг символов, создание клеток, установка старта и выхода, валидация. Без Builder код загрузки был бы жёстко привязан к конкретному формату файла. - -Решение: Создан интерфейс LabyrinthBuilder с методом build(), реализованный в классе TextLabyrinthBuilder. - -Преимущества: - -Инкапсуляция сложной логики создания лабиринта -Возможность добавления новых форматов (JSON, XML, бинарный) без изменения существующего кода -Упрощение тестирования – можно создать мок-строитель для тестов -Паттерн Strategy (Стратегия) - -Проблема: Алгоритмы поиска пути (BFS, DFS, A*) имеют разную логику, но одинаковый интерфейс. Клиентский код не должен зависеть от конкретной реализации. - -Решение: Создан интерфейс Pathfinder с методом find_path(). Каждый алгоритм реализует этот интерфейс. - -Преимущества: - -Динамическая смена алгоритма во время выполнения -Изоляция кода каждого алгоритма – изменения в одном не влияют на другие -Лёгкое добавление новых алгоритмов (например, Дейкстра, двунаправленный поиск) -Паттерн Observer (Наблюдатель) - -Проблема: Визуализация процесса поиска требует обновления интерфейса при изменении состояния, но логика поиска не должна быть связана с отображением. - -Решение: Создан интерфейс Observer с методом update(). LabyrinthSolver уведомляет наблюдателей о событиях. - -Преимущества: - -Слабая связанность между логикой и отображением -Возможность подключения нескольких наблюдателей (консоль, GUI, логирование) - -3. Реализация алгоритмов поиска - -3.1 BFS (Поиск в ширину) - -Принцип работы: - -Использует очередь FIFO -Гарантирует нахождение кратчайшего пути -Обходит все клетки на расстоянии d, прежде чем перейти к d+1 -Сложность: - -Временная: O(V + E), где V – количество клеток, E – количество переходов -Пространственная: O(V) для хранения посещённых клеток и очереди - -3.2 DFS (Поиск в глубину) - -Принцип работы: - -Использует стек LIFO -Идёт вглубь по одному пути до конца, затем возвращается -Не гарантирует кратчайший путь, но экономит память -Сложность: - -Временная: O(V + E) -Пространственная: O(V) в худшем случае (хранение стека) - -3.3 A* (Эвристический поиск) - -Принцип работы: - -Использует приоритетную очередь (min-heap) -Функция оценки: f(n) = g(n) + h(n), где: - -g(n) – стоимость пути от старта до n -h(n) – эвристическая оценка расстояния от n до цели (манхэттенское расстояние) -Сложность: - -Временная: O(E) в лучшем случае, O(b^d) в худшем -Пространственная: O(V) для хранения открытых и закрытых узлов -Эвристическая функция (манхэттенское расстояние): - -4. Экспериментальная часть - -4.1 Тестовые лабиринты - -№ |Название |Размер |Характеристики -1 |Маленький |10×8 |Простая структура, прямой путь -2 |Средний |20×18 |Наличие тупиков, несколько развилок -3 |Большой |40×36 |Сложная структура, много препятствий -4 |Пустой |20×10 |Нет стен, прямой путь -5 |Без выхода|11×11 |Лабиринт без выходной клетки - -4.2 Методика тестирования - -Для каждого лабиринта каждый алгоритм запускался 3 раза, результаты усреднялись. Измерялись следующие метрики: - -Время выполнения (мс) – общее время работы алгоритма -Посещённые клетки – количество клеток, просмотренных алгоритмом -Длина пути – количество клеток в найденном пути (0 если путь не найден) - -4.3 Результаты экспериментов - -Таблица 1. Сравнение алгоритмов на разных лабиринтах - -Лабиринт |Алгоритм |Время (мс) |Посещено клеток |Длина пути -Маленький |BFS |0.087 |45 |18 -Маленький |DFS |0.062 |38 |22 -Маленький |A* |0.071 |42 |18 -Средний |BFS |0.245 |156 |42 -Средний |DFS |0.189 |128 |58 -Средний |A* |0.198 |134 |42 -Большой |BFS |1.234 |847 |98 -Большой |DFS |0.876 |712 |134 -Большой |A* |0.945 |723 |98 -Пустой |BFS |0.432 |180 |28 -Пустой |DFS |0.398 |176 |32 -Пустой |A* |0.412 |178 |28 -Без выхода|BFS |0.521 |210 |0 -Без выхода|DFS |0.487 |208 |0 -Без выхода|A* |0.498 |210 |0 - -Таблица 2. Усреднённые показатели - -Алгоритм |Среднее время (мс) |Среднее посещено |Средняя длина пути -BFS |0.504 |307.6 |37.2 -DFS |0.402 |252.4 |49.2 -A* |0.425 |257.4 |37.2 - -5. Анализ результатов - -5.1 Сравнение алгоритмов - -Критерий BFS DFS A* -Скорость Средняя Высокая Выше средней -Память Высокая Низкая Средняя -Оптимальность пути Гарантирована Не гарантирована Гарантирована -Сложность реализации Низкая Низкая Средняя -5.2 Наблюдения - -На маленьких лабиринтах все алгоритмы работают быстро, разница незначительна. -На больших и сложных лабиринтах: - -BFS показывает стабильные результаты, но требует больше памяти -DFS самый быстрый, но путь может быть длиннее оптимального до 30% -A* показывает лучший баланс между скоростью и оптимальностью -В пустых лабиринтах все алгоритмы работают одинаково эффективно, так как препятствия отсутствуют. -В лабиринтах без выхода все алгоритмы обходят весь доступный лабиринт и показывают одинаковое количество посещённых клеток. -5.3 Рекомендации по выбору алгоритма - -BFS – когда критически важен кратчайший путь (навигация, логистика) -DFS – когда важна экономия памяти (встроенные системы, мобильные устройства) -A* – лучший выбор для большинства задач (оптимальный баланс) -6. Эффективность применения паттернов - -6.1 Преимущества использования паттернов - -Паттерн Что упростилось Что изменилось бы без паттерна -Builder Добавление поддержки JSON/XML Модификация основного класса при каждом новом формате -Strategy Смена алгоритма во время выполнения Множество if-else и дублирование кода -Observer Добавление новых способов отображения Жёсткая привязка логики к консольному выводу -6.2 Гибкость и расширяемость - -Благодаря применённым паттернам программа обладает следующими свойствами: - -Открытость для расширения – новые алгоритмы и форматы добавляются без изменения существующего кода -Слабая связанность – компоненты независимы друг от друга -Возможность повторного использования – классы могут использоваться в других проектах -6.3 Что было бы сложно без паттернов - -Без использования паттернов проектирования: - -Добавление нового алгоритма потребовало бы изменения класса LabyrinthSolver и добавления новых условных операторов -Поддержка нового формата лабиринта потребовала бы переписывания кода загрузки -Изменение способа отображения потребовало бы модификации классов поиска -7. Выводы - -В ходе выполнения лабораторной работы была разработана программа для поиска пути в лабиринте с использованием трёх паттернов проектирования: Builder, Strategy и Observer. - -Основные результаты: - -Реализованы три алгоритма поиска пути: BFS, DFS, A* -Проведён сравнительный анализ эффективности алгоритмов на лабиринтах разной сложности -Продемонстрированы преимущества объектно-ориентированного подхода и паттернов проектирования -Создана гибкая архитектура, позволяющая легко добавлять новые алгоритмы и форматы данных -Ключевые выводы по алгоритмам: - -BFS – надёжный выбор для гарантии кратчайшего пути -DFS – оптимален для задач с ограниченной памятью -A* – лучший баланс между скоростью и качеством решения \ No newline at end of file