forked from UNN/2026-rff_mp
develop #1
187
konnovaea/lab2_report.ipynb
Normal file
187
konnovaea/lab2_report.ipynb
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
{
|
||||
"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",
|
||||
"\n",
|
||||
"\n",
|
||||
"\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
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
Лабиринт,Стратегия,Время(мс),Посещено клеток,Длина пути
|
||||
Простой (10x10),BFS,0.001,-,-
|
||||
Простой (10x10),DFS,0.001,-,-
|
||||
Простой (10x10),A*,0.001,-,-
|
||||
С тупиками (50x50),BFS,2.732,1818.0,95.0
|
||||
С тупиками (50x50),DFS,1.338,841.0,289.0
|
||||
С тупиками (50x50),A*,2.907,1159.0,95.0
|
||||
Пустой (100x100),BFS,16.894,9604.0,195.0
|
||||
Пустой (100x100),DFS,296.432,9604.0,4851.0
|
||||
Пустой (100x100),A*,28.451,9604.0,195.0
|
||||
Без выхода,BFS,0.0,-,-
|
||||
Без выхода,DFS,0.0,-,-
|
||||
Без выхода,A*,0.0,-,-
|
||||
|
Gitea Version: 1.22.0 |
