2026-rff_mp/konnovaea/lab2_report.ipynb

188 lines
8.1 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": "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
}