2026-rff_mp/stepushovgs/labyrinth/benchmark.ipynb
GordStep 7782d2e812 Добавлены все лабиринты
- Добавил все лабиринты и проверил корректность работы
- очистил выходные данные ipynb файлов
2026-05-23 01:22:42 +03:00

209 lines
6.3 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": "73f2af9d",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pandas as pd\n",
"\n",
"# Переходим из docs/data/ в корень lab/\n",
"# os.chdir('../')\n",
"\n",
"from source import TextFileMazeBuilder\n",
"from source.observer import ConsoleView, Event\n",
"from source.strategy import MazeSolver, BFS, DFS, Dijkstra, AStar\n",
"# from source.strategy.maze_solver import \n",
"from source.classes import Cell, Maze"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c23c6e70",
"metadata": {},
"outputs": [],
"source": [
"builder = TextFileMazeBuilder()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ae0615f3",
"metadata": {},
"outputs": [],
"source": [
"csv_path = 'docs\\\\data\\\\csv\\\\banchmark.csv'"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5949d98c",
"metadata": {},
"outputs": [],
"source": [
"maze_empty = 'maze_empty'\n",
"maze_no_path = 'maze_no_path'\n",
"maze10x10 = 'maze10x10'\n",
"maze50x50 = 'maze50x50'\n",
"maze100x100 = 'maze100x100'\n",
"\n",
"mazes = [maze10x10, maze50x50, maze100x100, maze_empty, maze_no_path]\n",
"def make_maze_path(maze_name) -> str:\n",
" return 'mazes\\\\benchmarks\\\\' + maze_name + '.txt'"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e94b3b5a",
"metadata": {},
"outputs": [],
"source": [
"class DataBench():\n",
" \"\"\"Класс для хранения информации о тестировании\"\"\"\n",
" def __init__(self, maze_name: str, strategy: str, time_ms: float, count_visited: int, path_length: int):\n",
" self.maze_name = maze_name\n",
" self.strategy = strategy\n",
" self.time_ms = time_ms\n",
" self.count_visited = count_visited\n",
" self.path_length = path_length\n",
" \n",
" def toDict(self):\n",
" \"\"\"Формирует словарь\"\"\"\n",
" return {\n",
" 'Лабиринт': self.maze_name,\n",
" 'Алгоритм': self.strategy,\n",
" 'Время': self.time_ms,\n",
" 'Посещено клеток': self.count_visited,\n",
" 'Длина пути': self.path_length\n",
" }"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ad8278e6",
"metadata": {},
"outputs": [],
"source": [
"def save_data(data: DataBench, filename=csv_path):\n",
" \"\"\"Сохраняет данные в CSV\"\"\"\n",
"\n",
" # Создаём DataFrame из словаря\n",
" new_row = pd.DataFrame([data.toDict()])\n",
" \n",
" # Умная дозапись\n",
" if os.path.exists(filename) and not os.path.getsize(filename) == 0:\n",
" \n",
" existing = pd.read_csv(filename)\n",
" updated = pd.concat([existing, new_row], ignore_index=True)\n",
" updated.to_csv(filename, index=False)\n",
" print(f\"Добавлена запись. Всего строк: {len(updated)}\")\n",
" else:\n",
" new_row.to_csv(filename, index=False)\n",
" print(f\"Создан новый файл с 1 записью\")\n",
"\n",
"# def format_data(maze_name: str, strategy: str, time_ms: float, count_visited: int, path_length: int):\n",
"# \"\"\"Форматирует данные для последющей записи в csv(мне лень писать каждый раз словарь)\"\"\"\n",
"# return "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "da46fa84",
"metadata": {},
"outputs": [],
"source": [
"N_REPEAT = 10\n",
"strats = [BFS(), DFS(), AStar(), Dijkstra()]\n",
"\n",
"# Очищаю файл для перезаписи\n",
"open(csv_path, 'w').close()\n",
"\n",
"\n",
"for strat in strats:\n",
" \n",
" for maze_name in mazes:\n",
" \n",
" maze = builder.buildFromFile(make_maze_path(maze_name))\n",
" solver = MazeSolver(maze, strat, ConsoleView())\n",
" print(maze_name)\n",
" # print(solver.strategyName())\n",
" result_average = DataBench(\n",
" maze_name=maze_name + '(среднее)',\n",
" strategy=solver.strategyName(),\n",
" time_ms=0,\n",
" count_visited=0,\n",
" path_length=0\n",
" )\n",
" \n",
" for i in range(N_REPEAT):\n",
" stats = solver.solve()\n",
" result = DataBench(\n",
" maze_name=maze_name,\n",
" strategy=solver.strategyName(),\n",
" time_ms=stats.timeMs,\n",
" count_visited=stats.visitedCells,\n",
" path_length=stats.pathLength\n",
" )\n",
" save_data(result)\n",
"\n",
" result_average.time_ms += stats.timeMs\n",
" result_average.count_visited += stats.visitedCells\n",
" result_average.path_length += stats.pathLength\n",
" \n",
" result_average.time_ms /= N_REPEAT\n",
" result_average.count_visited /= N_REPEAT\n",
" result_average.path_length /= N_REPEAT\n",
"\n",
" save_data(result_average)\n",
" # stats.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "de0f513e",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "60b732ff",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}