232 lines
15 KiB
Plaintext
232 lines
15 KiB
Plaintext
|
|
{
|
|||
|
|
"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",
|
|||
|
|
" \"\\n\",\n",
|
|||
|
|
" \"\\n\",\n",
|
|||
|
|
" \"На графике представлено сравнение алгоритмов по трём метрикам: время выполнения, количество посещённых клеток и длина найденного пути.\\n\",\n",
|
|||
|
|
" \"\\n\",\n",
|
|||
|
|
" \"\\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
|
|||
|
|
}
|