{ "cells": [ { "cell_type": "markdown", "id": "bdef001e", "metadata": {}, "source": [ "# Отчёт \n", "## Поиск выхода из лабиринта: применение паттернов проектирования\n", "\n", "**Студент:** Коннова Е.А.\n", "**Группа:** 429\n", "**Дата:** 21.05.2026" ] }, { "cell_type": "markdown", "id": "21f948a4", "metadata": {}, "source": [ "## Введение\n", "\n", "### О чём это работа\n", "В данной работе реализуется программа для поиска выхода из лабиринта с применением паттернов проектирования. Поддерживаются три алгоритма поиска пути: BFS, DFS и A*.\n", "\n", "### Цель работы\n", "Разработать гибкую, расширяемую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма, визуализации процесса и экспериментального сравнения алгоритмов. Применить минимум 3 паттерна проектирования.\n", "\n", "### Задачи\n", "1. Реализовать модель лабиринта (классы Cell, Maze)\n", "2. Реализовать загрузку лабиринта из файла (паттерн Builder)\n", "3. Реализовать алгоритмы поиска пути (паттерн Strategy): BFS, DFS, A*\n", "4. Реализовать класс-оркестратор MazeSolver со сбором статистики\n", "5. Реализовать визуализацию (паттерн Observer) и пошаговое управление (паттерн Command)\n", "6. Провести эксперименты на лабиринтах разной сложности\n", "7. Сравнить результаты и сделать выводы\n" ] }, { "cell_type": "markdown", "id": "cf1dc2ba", "metadata": {}, "source": [ "## Часть 1. Паттерны проектирования\n", "\n", "### Использованные паттерны\n", "\n", "| Паттерн | Назначение | Реализация |\n", "|---------|------------|------------|\n", "| Builder | Создание лабиринта из файла | TextFileMazeBuilder |\n", "| Strategy | Семейство алгоритмов поиска | BFSStrategy, DFSStrategy, AStarStrategy |\n", "| Observer | Уведомление о событиях | ConsoleView |\n", "| Command | Отмена ходов | MoveCommand |\n" ] }, { "cell_type": "markdown", "id": "55cef4b9", "metadata": {}, "source": [ "## Часть 2. Реализация\n", "\n", "### 2.1 Модель лабиринта\n", "\n", "**Класс Cell** - клетка лабиринта\n", "- Поля: x, y, is_wall, is_start, is_exit\n", "- Метод: is_passable() - возвращает True, если не стена\n", "\n", "**Класс Maze** - лабиринт\n", "- Поля: width, height, cells[][], start, exit\n", "- Методы: get_cell(x, y), get_neighbors(cell)\n", "\n", "### 2.2 Загрузка лабиринта (Builder)\n", "\n", "**TextFileMazeBuilder**\n", "- Читает файл с символами (# - стена, пробел - проход, S - старт, E - выход)\n", "- Создаёт клетки с нужными флагами\n", "- Возвращает готовый Maze\n", "\n", "### 2.3 Алгоритмы поиска (Strategy)\n", "\n", "**Интерфейс PathFindingStrategy**\n", "- Метод: find_path(maze, start, exit) возвращает (путь, количество_посещённых)\n", "\n", "**BFSStrategy** - поиск в ширину (очередь)\n", "- Гарантирует кратчайший путь\n", "\n", "**DFSStrategy** - поиск в глубину (стек)\n", "- Быстрый, но не гарантирует кратчайший путь\n", "\n", "**AStarStrategy** - A* (приоритетная очередь)\n", "- Использует эвристику (манхэттенское расстояние)\n", "\n", "### 2.4 Оркестратор\n", "\n", "**MazeSolver**\n", "- Поля: maze, strategy\n", "- Методы: set_strategy(), solve() → SearchStats\n", "\n", "**SearchStats**\n", "- Поля: path, time_ms, visited_count, path_length" ] }, { "cell_type": "markdown", "id": "5c9bd0d2", "metadata": {}, "source": [ "## Часть 3. Эксперименты\n", "\n", "### 3.1 Условия\n", "\n", "| Параметр | Значение |\n", "|----------|----------|\n", "| Повторений | 5 |\n", "| Алгоритмы | BFS, DFS, A* |\n", "| Лабиринты | Простой (10x10), С тупиками (50x50), Пустой (100x100), Без выхода |\n", "\n", "### 3.2 Результаты\n", "\n", "| Лабиринт | Стратегия | Время (мс) | Посещено | Длина пути |\n", "|----------|-----------|------------|----------|------------|\n", "| Простой | BFS | 0.037 | 11 | 6 |\n", "| Простой | DFS | 0.016 | 9 | 8 |\n", "| Простой | A* | 0.027 | 9 | 6 |\n", "\n", "### 3.3 Графики\n", "\n", "![Время](data/maze_time_graph.png)\n", "![Посещения](data/maze_visited_graph.png)\n", "![Длина пути](data/maze_path_graph.png)\n", "\n", "### 3.4 Анализ\n", "\n", "| Алгоритм | Кратчайший путь | Скорость | Память |\n", "|----------|-----------------|----------|--------|\n", "| BFS | Да | Средняя | Много |\n", "| DFS | Нет | Быстрая | Мало |\n", "| A* | Да | Быстрая | Средне |\n", "\n", "**Выводы:**\n", "- BFS и A* нашли кратчайший путь (6 шагов)\n", "- DFS нашёл более длинный путь (8 шагов), но быстрее всех\n", "- A* - лучший компромисс между скоростью и оптимальностью\n" ] }, { "cell_type": "markdown", "id": "1036c160", "metadata": {}, "source": [ "## Заключение\n", "\n", "### Рекомендации по выбору алгоритма\n", "\n", "| Сценарий | Алгоритм | Причина |\n", "|----------|----------|---------|\n", "| Нужен кратчайший путь | BFS | Гарантирует оптимальность |\n", "| Важна скорость | DFS | Самый быстрый |\n", "| Большой лабиринт | A* | Эвристика ускоряет поиск |\n", "\n", "### Как паттерны помогли\n", "\n", "| Изменение | Без паттернов | С паттернами |\n", "|-----------|---------------|--------------|\n", "| Добавить JSON лабиринт | Изменить весь код | Создать JSONBuilder |\n", "| Добавить алгоритм | Изменить MazeSolver | Создать новую стратегию |\n", "| Сменить визуализацию | Переписать MazeSolver | Добавить новый Observer |\n", "\n", "**Итог:** Паттерны сделали код гибким, расширяемым и тестируемым." ] }, { "cell_type": "markdown", "id": "cb24b904", "metadata": {}, "source": [] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 5 }