2026-rff_mp/nikolaevda/docs/report_laba2.ipynb
2026-05-24 21:11:54 +03:00

232 lines
15 KiB
Plaintext
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.

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "99cf9991",
"metadata": {},
"outputs": [],
"source": [
"{\n",
" \"cells\": [\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"# Лабораторная работа: Поиск выхода из лабиринта\\n\",\n",
" \"\\n\",\n",
" \"## 1. Постановка задачи\\n\",\n",
" \"\\n\",\n",
" \"Разработать программу для загрузки лабиринта из текстового файла, поиска пути от стартовой клетки до выхода с возможностью выбора алгоритма поиска, визуализации процесса и экспериментального сравнения эффективности алгоритмов.\\n\",\n",
" \"\\n\",\n",
" \"### Основные требования\\n\",\n",
" \"\\n\",\n",
" \"- Реализовать модель лабиринта (классы `Cell`, `Maze`)\\n\",\n",
" \"- Реализовать загрузку лабиринта из файла с символами `#` (стена), `S` (старт), `E` (выход)\\n\",\n",
" \"- Реализовать четыре алгоритма поиска пути: BFS, DFS, A*, Дейкстра\\n\",\n",
" \"- Реализовать класс-оркестратор `MazeSolver` с возможностью смены стратегии\\n\",\n",
" \"- Собрать статистику: время выполнения, количество посещённых клеток, длина пути\\n\",\n",
" \"- Провести эксперименты на лабиринтах разной сложности\\n\",\n",
" \"- Реализовать интерактивный режим с пошаговым управлением и отменой ходов\\n\",\n",
" \"\\n\",\n",
" \"### Использованные паттерны проектирования GoF\\n\",\n",
" \"\\n\",\n",
" \"| Паттерн | Где используется | Преимущества |\\n\",\n",
" \"|---------|-----------------|---------------|\\n\",\n",
" \"| **Builder** | `MazeBuilder`, `TextFileMazeBuilder` | Скрывает детали парсинга, легко добавлять новые форматы |\\n\",\n",
" \"| **Strategy** | `PathFindingStrategy`, BFS, DFS, A*, Дейкстра | Динамическая смена алгоритма |\\n\",\n",
" \"| **Observer** | `Observer`, `ConsoleDisplay` | Отделяет отображение от логики |\\n\",\n",
" \"| **Command** | `Command`, `MoveCommand`, `CommandInvoker` | Undo/Redo, история ходов |\"\n",
" ]\n",
" },\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"## 2. Архитектура приложения\\n\",\n",
" \"\\n\",\n",
" \"Основные компоненты:\\n\",\n",
" \"\\n\",\n",
" \"- **Модель** `Cell`, `Maze` (хранение сетки, проверка стен, получение соседей)\\n\",\n",
" \"- **Загрузка** `MazeBuilder`, `TextFileMazeBuilder` (парсинг `.txt`‑файлов)\\n\",\n",
" \"- **Алгоритмы** `BFSStrategy`, `DFSStrategy`, `AStarStrategy`, `DijkstraStrategy`\\n\",\n",
" \"- **Оркестрация** `MazeSolver` (управление стратегией, сбор статистики)\\n\",\n",
" \"- **Визуализация** `ConsoleDisplay` (отрисовка лабиринта, игрока, пути)\\n\",\n",
" \"- **Интерактив** `Player`, `MoveCommand`, `CommandInvoker` (перемещение, отмена/повтор)\"\n",
" ]\n",
" },\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"## 3. Реализация алгоритмов поиска пути\\n\",\n",
" \"\\n\",\n",
" \"| Алгоритм | Структура данных | Гарантия кратчайшего пути | Особенности |\\n\",\n",
" \"|----------|-----------------|---------------------------|-------------|\\n\",\n",
" \"| **BFS** | Очередь (`deque`) | Да | Обходит по слоям, гарантирует минимум шагов |\\n\",\n",
" \"| **DFS** | Стек | Нет | Углубляется до конца, экономичен по памяти |\\n\",\n",
" \"| **A*** | Приоритетная очередь (`heapq`) + эвристика | Да | Использует манхэттенское расстояние |\\n\",\n",
" \"| **Дейкстра** | Приоритетная очередь (`heapq`) | Да | Частный случай A* с эвристикой 0 |\"\n",
" ]\n",
" },\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"## 4. Экспериментальная часть\\n\",\n",
" \"\\n\",\n",
" \"### Тестовые лабиринты\\n\",\n",
" \"\\n\",\n",
" \"| Имя | Размер | Описание |\\n\",\n",
" \"|-----|--------|----------|\\n\",\n",
" \"| tiny_simple | 10×10 | Маленький лабиринт с прямым путём |\\n\",\n",
" \"| small_empty | 20×20 | Пустой лабиринт без стен |\\n\",\n",
" \"| medium_dfs | 30×30 | Лабиринт среднего размера с тупиками |\\n\",\n",
" \"| medium_complex | 40×40 | Сложный запутанный лабиринт |\\n\",\n",
" \"| large_dfs | 50×50 | Большой лабиринт |\\n\",\n",
" \"| very_large_dfs | 100×100 | Очень большой лабиринт |\\n\",\n",
" \"| no_exit | 20×20 | Лабиринт без выхода |\\n\",\n",
" \"\\n\",\n",
" \"Каждый алгоритм запускался **5 раз** на каждом лабиринте, результаты усреднены.\"\n",
" ]\n",
" },\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"### Результаты замеров\\n\",\n",
" \"\\n\",\n",
" \"| Лабиринт | Алгоритм | Время (мс) | Посещено клеток | Длина пути |\\n\",\n",
" \"|----------|----------|------------|-----------------|------------|\\n\",\n",
" \"| tiny_simple (10x10) | BFS | 0.11 | 29 | 19 |\\n\",\n",
" \"| tiny_simple (10x10) | DFS | 0.07 | 29 | 19 |\\n\",\n",
" \"| tiny_simple (10x10) | A* | 0.17 | 29 | 19 |\\n\",\n",
" \"| tiny_simple (10x10) | Дейкстра | 0.15 | 29 | 19 |\\n\",\n",
" \"| small_empty (20x20) | BFS | 1.35 | 400 | 39 |\\n\",\n",
" \"| small_empty (20x20) | DFS | 1.02 | 400 | 191 |\\n\",\n",
" \"| small_empty (20x20) | A* | 2.61 | 400 | 39 |\\n\",\n",
" \"| small_empty (20x20) | Дейкстра | 1.02 | 400 | 39 |\\n\",\n",
" \"| medium_dfs (30x30) | BFS | 3.30 | 110 | 77 |\\n\",\n",
" \"| medium_dfs (30x30) | DFS | 2.58 | 80 | 77 |\\n\",\n",
" \"| medium_dfs (30x30) | A* | 0.51 | 88 | 77 |\\n\",\n",
" \"| medium_dfs (30x30) | Дейкстра | 0.55 | 110 | 77 |\\n\",\n",
" \"| no_exit (20x20) | BFS | 0.14 | 193 | 0 |\\n\",\n",
" \"| no_exit (20x20) | DFS | 0.07 | 52 | 0 |\\n\",\n",
" \"| no_exit (20x20) | A* | 0.16 | 162 | 0 |\"\n",
" ]\n",
" },\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"### Графики\\n\",\n",
" \"\\n\",\n",
" \"![Сравнение алгоритмов](algorithm_comparison.png)\\n\",\n",
" \"\\n\",\n",
" \"На графике представлено сравнение алгоритмов по трём метрикам: время выполнения, количество посещённых клеток и длина найденного пути.\\n\",\n",
" \"\\n\",\n",
" \"![Детальный анализ](maze_detailed_analysis.png)\\n\",\n",
" \"\\n\",\n",
" \"Детальные графики по каждому лабиринту.\"\n",
" ]\n",
" },\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"## 5. Анализ результатов\\n\",\n",
" \"\\n\",\n",
" \"### Сравнение характеристик\\n\",\n",
" \"\\n\",\n",
" \"**BFS**\\n\",\n",
" \"- Гарантирует кратчайший путь (длина пути совпадает с A*)\\n\",\n",
" \"- Посещает много клеток (400 в пустом лабиринте)\\n\",\n",
" \"- Время работы стабильно, предсказуемо\\n\",\n",
" \"\\n\",\n",
" \"**DFS**\\n\",\n",
" \"- Самый быстрый на большинстве лабиринтов (0.07 мс на маленьком)\\n\",\n",
" \"- НЕ гарантирует кратчайший путь (в пустом лабиринте путь 191 вместо 39)\\n\",\n",
" \"- Посещает меньше клеток, чем BFS (80 против 110 на 30x30)\\n\",\n",
" \"- Отлично работает в лабиринтах без выхода (52 посещённые клетки)\\n\",\n",
" \"\\n\",\n",
" \"**A***\\n\",\n",
" \"- Всегда находит оптимальный путь (как BFS)\\n\",\n",
" \"- Посещает меньше клеток, чем BFS (88 против 110 на 30x30)\\n\",\n",
" \"- На 30x30 оказался самым быстрым (0.51 мс)\\n\",\n",
" \"- На пустом лабиринте медленнее из-за накладных расходов на эвристику\\n\",\n",
" \"\\n\",\n",
" \"**Дейкстра**\\n\",\n",
" \"- На невзвешенных графах даёт те же результаты, что и BFS\\n\",\n",
" \"- Медленнее A* на сложных лабиринтах\\n\",\n",
" \"\\n\",\n",
" \"### Ключевые выводы\\n\",\n",
" \"\\n\",\n",
" \"1. **A* показывает лучший баланс** между скоростью и оптимальностью.\\n\",\n",
" \"2. **DFS самый быстрый**, когда не важна длина пути.\\n\",\n",
" \"3. **BFS** остаётся простым и предсказуемым решением.\\n\",\n",
" \"4. **На пустых лабиринтах** DFS находит очень длинный путь.\\n\",\n",
" \"5. **В лабиринтах без выхода** DFS быстрее всех обнаруживает отсутствие пути.\\n\",\n",
" \"\\n\",\n",
" \"### Рекомендации по выбору алгоритма\\n\",\n",
" \"\\n\",\n",
" \"| Сценарий | Рекомендуемый алгоритм | Обоснование |\\n\",\n",
" \"|----------|------------------------|-------------|\\n\",\n",
" \"| Нужен кратчайший путь + скорость | **A*** | Лучшие результаты на сложных лабиринтах |\\n\",\n",
" \"| Важна только скорость | **DFS** | Самый быстрый |\\n\",\n",
" \"| Простота реализации | **BFS** | Самый понятный алгоритм |\\n\",\n",
" \"| Проверка существования пути | **DFS** | Быстро находит или упирается в тупик |\"\n",
" ]\n",
" },\n",
" {\n",
" \"cell_type\": \"markdown\",\n",
" \"metadata\": {},\n",
" \"source\": [\n",
" \"## 6. Заключение\\n\",\n",
" \"\\n\",\n",
" \"В ходе лабораторной работы была разработана программа для поиска выхода из лабиринта с применением паттернов проектирования GoF.\\n\",\n",
" \"\\n\",\n",
" \"### Преимущества использованных паттернов\\n\",\n",
" \"\\n\",\n",
" \"| Паттерн | Что было бы сложно изменить без него |\\n\",\n",
" \"|---------|--------------------------------------|\\n\",\n",
" \"| **Builder** | Добавление нового формата файлов потребовало бы переписывания всей логики загрузки |\\n\",\n",
" \"| **Strategy** | Смена алгоритма поиска потребовала бы изменения кода `MazeSolver` |\\n\",\n",
" \"| **Observer** | Добавление нового способа вывода потребовало бы изменения всех классов |\\n\",\n",
" \"| **Command** | Реализация отмены ходов привела бы к дублированию кода |\\n\",\n",
" \"\\n\",\n",
" \"Экспериментальное сравнение алгоритмов показало, что A* является оптимальным выбором для большинства сценариев. DFS остаётся лучшим выбором, когда скорость критичнее оптимальности пути.\\n\",\n",
" \"\\n\",\n",
" \"Программа предоставляет два режима работы:\\n\",\n",
" \"- **Интерактивный режим** игра с ручным управлением, отменой и повторением ходов\\n\",\n",
" \"- **Экспериментальный режим** автоматическое тестирование алгоритмов с сохранением результатов в CSV и построением графиков\\n\",\n",
" \"\\n\",\n",
" \"Разработанное решение демонстрирует преимущества объектно-ориентированного подхода и паттернов проектирования при создании гибких, расширяемых и легко поддерживаемых программ.\"\n",
" ]\n",
" }\n",
" ],\n",
" \"metadata\": {\n",
" \"kernelspec\": {\n",
" \"display_name\": \"Python 3\",\n",
" \"language\": \"python\",\n",
" \"name\": \"python3\"\n",
" },\n",
" \"language_info\": {\n",
" \"name\": \"python\",\n",
" \"version\": \"3.10.0\"\n",
" }\n",
" },\n",
" \"nbformat\": 4,\n",
" \"nbformat_minor\": 4\n",
"}"
]
}
],
"metadata": {
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 5
}