forked from UNN/2026-rff_mp
- Добавил все лабиринты и проверил корректность работы - очистил выходные данные ipynb файлов
209 lines
6.3 KiB
Plaintext
209 lines
6.3 KiB
Plaintext
{
|
||
"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
|
||
}
|