2026-rff_mp/pomelovsd/ExitMaze/main.ipynb

366 lines
130 KiB
Plaintext
Raw Normal View History

2026-05-22 22:06:48 +00:00
{
"cells": [
{
"cell_type": "code",
2026-05-25 13:02:23 +00:00
"execution_count": 1,
2026-05-23 10:37:43 +00:00
"id": "a1dff6b4",
2026-05-22 22:06:48 +00:00
"metadata": {},
"outputs": [],
2026-05-23 10:37:43 +00:00
"source": [
"import time\n",
"import csv\n",
2026-05-25 10:45:18 +00:00
"import matplotlib.pyplot as plt\n",
"from statistics import mean\n",
"import numpy as np"
2026-05-23 10:37:43 +00:00
]
},
{
"cell_type": "code",
2026-05-25 13:02:23 +00:00
"execution_count": 2,
2026-05-23 10:37:43 +00:00
"id": "66bfd079",
"metadata": {},
2026-05-25 10:45:18 +00:00
"outputs": [],
2026-05-22 22:06:48 +00:00
"source": [
"from Builder.Builder import TextFileMazeBuilder\n",
"from Core.Benchmark import RunBenchmark\n",
2026-05-23 10:37:43 +00:00
"from MazeSolver.Solver import MazeSolver\n",
"from Observer_Command.ConsoleView import ConsoleView\n",
"from Strategies.BFS import BFS\n",
"from Strategies.DFS import DFS\n",
"from Strategies.AStar import AStar"
2026-05-22 22:06:48 +00:00
]
2026-05-23 10:37:43 +00:00
},
{
"cell_type": "code",
2026-05-25 13:02:23 +00:00
"execution_count": 3,
2026-05-23 10:37:43 +00:00
"id": "50c7010d",
"metadata": {},
2026-05-25 10:45:18 +00:00
"outputs": [],
2026-05-23 10:37:43 +00:00
"source": [
"builder = TextFileMazeBuilder()\n",
"\n",
"mazes = {\n",
" \"small\": builder.build_from_file(\"Mazes/small.txt\"),\n",
" \"medium\": builder.build_from_file(\"Mazes/medium.txt\"),\n",
" \"large\": builder.build_from_file(\"Mazes/large.txt\"),\n",
" \"empty\": builder.build_from_file(\"Mazes/empty.txt\"),\n",
" \"no_exit\": builder.build_from_file(\"Mazes/no_exit.txt\"),\n",
2026-05-25 10:45:18 +00:00
"}"
]
},
{
"cell_type": "code",
2026-05-25 13:02:23 +00:00
"execution_count": 4,
2026-05-25 10:45:18 +00:00
"id": "7326fe7d",
"metadata": {},
"outputs": [],
"source": [
2026-05-23 10:37:43 +00:00
"strategies = {\n",
" \"BFS\": BFS(),\n",
" \"DFS\": DFS(),\n",
" \"A*\": AStar()\n",
2026-05-25 10:45:18 +00:00
"}"
]
},
{
"cell_type": "code",
2026-05-25 13:02:23 +00:00
"execution_count": 5,
2026-05-25 10:45:18 +00:00
"id": "8d47b4cf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Лабиринт: small\n",
"Testing BFS\n",
2026-05-25 13:02:23 +00:00
"BFS: time=0.21313328579708468 ms | visited=58.0 | path_len=15.0\n",
2026-05-25 10:45:18 +00:00
"Testing DFS\n",
2026-05-25 13:02:23 +00:00
"DFS: time=0.0768381428965118 ms | visited=31.0 | path_len=19.0\n",
2026-05-25 10:45:18 +00:00
"Testing A*\n",
2026-05-25 13:02:23 +00:00
"A*: time=0.2827478572596322 ms | visited=57.0 | path_len=15.0\n",
2026-05-25 10:45:18 +00:00
"Лабиринт: medium\n",
"Testing BFS\n",
2026-05-25 13:02:23 +00:00
"BFS: time=5.220513428477196 ms | visited=1263.0 | path_len=173.0\n",
2026-05-25 10:45:18 +00:00
"Testing DFS\n",
2026-05-25 13:02:23 +00:00
"DFS: time=4.18784342861857 ms | visited=1229.0 | path_len=173.0\n",
2026-05-25 10:45:18 +00:00
"Testing A*\n",
2026-05-25 13:02:23 +00:00
"A*: time=4.219951571420617 ms | visited=806.0 | path_len=173.0\n",
2026-05-25 10:45:18 +00:00
"Лабиринт: large\n",
"Testing BFS\n",
2026-05-25 13:02:23 +00:00
"BFS: time=11.833781999874711 ms | visited=3918.0 | path_len=269.0\n",
2026-05-25 10:45:18 +00:00
"Testing DFS\n",
2026-05-25 13:02:23 +00:00
"DFS: time=5.629428999977141 ms | visited=1905.0 | path_len=269.0\n",
2026-05-25 10:45:18 +00:00
"Testing A*\n",
2026-05-25 13:02:23 +00:00
"A*: time=10.02670385716036 ms | visited=2040.0 | path_len=269.0\n",
2026-05-25 10:45:18 +00:00
"Лабиринт: empty\n",
"Testing BFS\n",
2026-05-25 13:02:23 +00:00
"BFS: time=0.19871557131929357 ms | visited=64.0 | path_len=15.0\n",
2026-05-25 10:45:18 +00:00
"Testing DFS\n",
2026-05-25 13:02:23 +00:00
"DFS: time=0.13947814282541263 ms | visited=64.0 | path_len=29.0\n",
2026-05-25 10:45:18 +00:00
"Testing A*\n",
2026-05-25 13:02:23 +00:00
"A*: time=0.28600042846197277 ms | visited=63.0 | path_len=15.0\n",
2026-05-25 10:45:18 +00:00
"Лабиринт: no_exit\n",
"Testing BFS\n",
2026-05-25 13:02:23 +00:00
"BFS: time=0.18080571427552578 ms | visited=58.0 | path_len=0.0\n",
2026-05-25 10:45:18 +00:00
"Testing DFS\n",
2026-05-25 13:02:23 +00:00
"DFS: time=0.19448514272621 ms | visited=58.0 | path_len=0.0\n",
"Testing A*\n"
]
},
{
"ename": "AttributeError",
"evalue": "'NoneType' object has no attribute 'x'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[5], line 19\u001b[0m\n\u001b[1;32m 16\u001b[0m solver \u001b[38;5;241m=\u001b[39m MazeSolver(maze, strategy)\n\u001b[1;32m 18\u001b[0m start_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mperf_counter()\n\u001b[0;32m---> 19\u001b[0m stats, path \u001b[38;5;241m=\u001b[39m \u001b[43msolver\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msolve\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 20\u001b[0m end_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mperf_counter()\n\u001b[1;32m 22\u001b[0m elapsed_ms \u001b[38;5;241m=\u001b[39m (end_time \u001b[38;5;241m-\u001b[39m start_time) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m1000\u001b[39m\n",
"File \u001b[0;32m~/2026-rff_mp/pomelovsd/ExitMaze/MazeSolver/Solver.py:16\u001b[0m, in \u001b[0;36mMazeSolver.solve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msolve\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 14\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mperf_counter()\n\u001b[0;32m---> 16\u001b[0m path, visited \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrategy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfindPath\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmaze\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmaze\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmaze\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexit\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 18\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mperf_counter()\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m SearchStats((end\u001b[38;5;241m-\u001b[39mstart)\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m1000\u001b[39m, visited, \u001b[38;5;28mlen\u001b[39m(path)), path\n",
"File \u001b[0;32m~/2026-rff_mp/pomelovsd/ExitMaze/Strategies/AStar.py:33\u001b[0m, in \u001b[0;36mAStar.findPath\u001b[0;34m(self, maze, start, exit)\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m g \u001b[38;5;129;01mor\u001b[39;00m tentative \u001b[38;5;241m<\u001b[39m g[n]:\n\u001b[1;32m 32\u001b[0m g[n] \u001b[38;5;241m=\u001b[39m tentative\n\u001b[0;32m---> 33\u001b[0m priority \u001b[38;5;241m=\u001b[39m tentative \u001b[38;5;241m+\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheuristic\u001b[49m\u001b[43m(\u001b[49m\u001b[43mn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexit\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 34\u001b[0m heapq\u001b[38;5;241m.\u001b[39mheappush(heap, (priority, counter, n))\n\u001b[1;32m 35\u001b[0m counter \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n",
"File \u001b[0;32m~/2026-rff_mp/pomelovsd/ExitMaze/Strategies/AStar.py:8\u001b[0m, in \u001b[0;36mAStar.heuristic\u001b[0;34m(self, a, b)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mheuristic\u001b[39m(\u001b[38;5;28mself\u001b[39m, a, b):\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mabs\u001b[39m(a\u001b[38;5;241m.\u001b[39mx \u001b[38;5;241m-\u001b[39m \u001b[43mb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mx\u001b[49m) \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mabs\u001b[39m(a\u001b[38;5;241m.\u001b[39my \u001b[38;5;241m-\u001b[39m b\u001b[38;5;241m.\u001b[39my)\n",
"\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'x'"
2026-05-25 10:45:18 +00:00
]
}
],
"source": [
2026-05-23 10:37:43 +00:00
"results = []\n",
"\n",
2026-05-25 10:45:18 +00:00
"N = 7\n",
2026-05-23 10:37:43 +00:00
"\n",
"for maze_name, maze in mazes.items():\n",
2026-05-25 10:45:18 +00:00
" print(f\"Лабиринт: {maze_name}\")\n",
2026-05-23 10:37:43 +00:00
"\n",
" for strategy_name, strategy in strategies.items():\n",
" total_time = 0\n",
" total_visited = 0\n",
2026-05-25 13:02:23 +00:00
" total_path_len = 0\n",
2026-05-23 10:37:43 +00:00
"\n",
2026-05-25 10:45:18 +00:00
" print(f\"Testing {strategy_name}\")\n",
2026-05-23 10:37:43 +00:00
"\n",
2026-05-25 10:45:18 +00:00
" for _ in range(N):\n",
2026-05-23 10:37:43 +00:00
" solver = MazeSolver(maze, strategy)\n",
"\n",
" start_time = time.perf_counter()\n",
" stats, path = solver.solve()\n",
" end_time = time.perf_counter()\n",
"\n",
" elapsed_ms = (end_time - start_time) * 1000\n",
"\n",
" total_time += elapsed_ms\n",
2026-05-25 13:02:23 +00:00
" total_visited += stats.visited_cells \n",
" total_path_len += len(path) \n",
2026-05-25 10:45:18 +00:00
"\n",
" avg_time = total_time / N\n",
" avg_visited = total_visited / N\n",
2026-05-25 13:02:23 +00:00
" avg_path_len = total_path_len / N\n",
2026-05-23 10:37:43 +00:00
"\n",
" results.append({\n",
" \"maze\": maze_name,\n",
" \"strategy\": strategy_name,\n",
" \"time_ms\": round(avg_time, 3),\n",
2026-05-25 13:02:23 +00:00
" \"visited_cells\": int(avg_visited), \n",
" \"path_length\": int(avg_path_len), \n",
2026-05-23 10:37:43 +00:00
" })\n",
"\n",
" print(\n",
" f\"{strategy_name}: \"\n",
2026-05-25 10:45:18 +00:00
" f\"time={avg_time} ms | \"\n",
2026-05-25 13:02:23 +00:00
" f\"visited={avg_visited} | \"\n",
" f\"path_len={avg_path_len}\"\n",
2026-05-25 10:45:18 +00:00
" )"
]
},
{
"cell_type": "code",
2026-05-25 13:02:23 +00:00
"execution_count": null,
2026-05-25 10:45:18 +00:00
"id": "347cb7be",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"CSV saved: results.csv\n"
]
}
],
"source": [
"csv_file = \"results.csv\"\n",
2026-05-23 10:37:43 +00:00
"\n",
"with open(csv_file, \"w\", newline=\"\", encoding=\"utf-8\") as file:\n",
"\n",
" writer = csv.writer(file)\n",
"\n",
" writer.writerow([\n",
" \"maze\",\n",
" \"strategy\",\n",
" \"time_ms\",\n",
" \"visited_cells\",\n",
2026-05-25 13:02:23 +00:00
" \"path_length\"\n",
2026-05-23 10:37:43 +00:00
" ])\n",
"\n",
" for row in results:\n",
" writer.writerow([\n",
" row[\"maze\"],\n",
" row[\"strategy\"],\n",
" row[\"time_ms\"],\n",
" row[\"visited_cells\"],\n",
2026-05-25 13:02:23 +00:00
" row[\"path_length\"]\n",
2026-05-23 10:37:43 +00:00
" ])\n",
"\n",
2026-05-25 10:45:18 +00:00
"print(f\"\\nCSV saved: {csv_file}\")"
]
},
{
"cell_type": "code",
2026-05-25 13:02:23 +00:00
"execution_count": null,
2026-05-25 10:45:18 +00:00
"id": "4b6fb0b0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Результаты:\n",
2026-05-25 13:02:23 +00:00
"small | BFS | 0.029 ms | 17 visited \n",
"small | DFS | 0.018 ms | 14 visited \n",
"small | A* | 0.033 ms | 16 visited \n",
"medium | BFS | 0.018 ms | 10 visited \n",
"medium | DFS | 0.019 ms | 10 visited \n",
"medium | A* | 0.024 ms | 10 visited \n",
"large | BFS | 0.292 ms | 198 visited \n",
"large | DFS | 0.201 ms | 198 visited \n",
"large | A* | 0.277 ms | 198 visited \n",
"empty | BFS | 0.014 ms | 10 visited \n",
"empty | DFS | 0.015 ms | 10 visited \n",
"empty | A* | 0.021 ms | 9 visited \n",
2026-05-25 10:45:18 +00:00
"no_exit | BFS | 0.007 ms | 1 visited \n",
2026-05-25 13:02:23 +00:00
"no_exit | DFS | 0.006 ms | 1 visited \n",
2026-05-25 10:45:18 +00:00
"no_exit | A* | 0.006 ms | 1 visited \n"
]
}
],
"source": [
2026-05-23 10:37:43 +00:00
"\n",
2026-05-25 10:45:18 +00:00
"print(\"Результаты:\")\n",
2026-05-23 10:37:43 +00:00
"\n",
"for row in results:\n",
"\n",
" print(\n",
2026-05-25 10:45:18 +00:00
" f\"{row['maze']} | \"\n",
" f\"{row['strategy']} | \"\n",
" f\"{row['time_ms']} ms | \"\n",
" f\"{row['visited_cells']} visited \"\n",
" )\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "95a41c2e",
"metadata": {},
"outputs": [
{
"data": {
2026-05-25 13:02:23 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAVuCAYAAACk5Y+IAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeVxU9f7H8feZYRUEFBRQFNHc9yVTy61c0iyzRdtcSitvWi4t5tVyK03b1ErLMq3smtcW2zRDK5c0LZM2vf2Ki5IGKqggKNvM+f3BZWSYQcFwRun1fDx45Hzme77n85kzZ4IP33MwTNM0BQAAAAAAAHiQxdsJAAAAAAAA4O+HphQAAAAAAAA8jqYUAAAAAAAAPI6mFAAAAAAAADyOphQAAAAAAAA8jqYUAAAAAAAAPI6mFAAAAAAAADyOphQAAAAAAAA8jqYUAAAAAAAAPI6mFADgovHjjz/qzjvvVFxcnAICAhQcHKx27dpp3rx5Onr0qLfTAwAAAFAOhmmapreTAADgbF599VXdd999aty4se677z41a9ZM+fn5+u677/Tqq6+qdevW+uCDD7ydJgAAAIAyoikFALjgbd++XV27dlXv3r21Zs0a+fv7Oz2fl5enzz77TNddd52XMgQAAABQXly+BwC44M2ePVuGYWjJkiUuDSlJ8vPzc2pI1atXTwMGDNAHH3ygVq1aKSAgQPXr19fChQudtsvJydGDDz6oNm3aKDQ0VNWrV1fnzp314YcfuuzDMAzHl9VqVa1atTR8+HAdOnTIMWbfvn0yDEPPPPOMy/YtWrRQjx49nGKZmZl66KGHFBcXJz8/P9WuXVvjx49Xdna2y77Hjh3rMueAAQNUr149l/0vX77cadzIkSNlGIZGjBjhFE9NTdW9996rmJgY+fn5KS4uTjNmzFBBQYHLvkqqV6+e4/WwWCyqWbOmBg0apN9++81t7q+88ooaNWokf39/NWvWTO+8847LnGXJp6hGwzC0evVqp+2zsrIUGhrq9hj89ttvuu2221SzZk35+/uradOmeumll5zGfPXVVzIMQ++++65LbsHBwU6v3/Lly2UYhvbt2+eI5efnq2nTpm6PQUlF2xd9BQYGqlmzZlqwYIHTuOnTp8swDKWlpZU6V7169dzmVtrX9OnTnbbfunWrrrrqKlWtWlVVqlRRly5d9Omnn7rdV48ePdzOWbzeHj16qEWLFi7bPvPMMy6vmSStWrVKnTt3VlBQkIKDg9W3b1/t3r3bacyIESMUHBzsMue7774rwzD01VdfOe2/5Lm2ZcsWR67Fpaam6q677lKdOnXk4+PjVFPJPEuKj4/XwIEDFRMTo4CAAF1yySW69957Sz1Wxc+Z4l/Fcy9tTPHjm5OTo8mTJzt9bowZM0bHjx932V9ZPgeL3vfF85CkXr16Ob1fit6LZ/oqmqPofXLNNde4vA533nmnDMNweY8cPXpU9913n2rXri0/Pz/Vr19fU6ZMUW5urtO4snwWAwAuHj7eTgAAgDOx2Wz64osv1L59e9WpU6fM2yUkJGj8+PGaPn26oqKi9Pbbb2vcuHHKy8vTQw89JEnKzc3V0aNH9dBDD6l27drKy8vThg0bdMMNN2jZsmUaNmyY05wjR47UqFGjVFBQoG+//VaTJ0/WkSNHtHbt2nLXdfLkSXXv3l0HDhzQP//5T7Vq1Uq//PKLHn/8cf3000/asGGDyw/Q52LHjh1atmyZrFarUzw1NVUdO3aUxWLR448/rgYNGmj79u164okntG/fPi1btuysc/fv31+PPfaY7Ha79uzZo0mTJmngwIHas2eP07iPPvpIX375pWbOnKmgoCAtWrRIt956q3x8fHTTTTedUz7Vq1fXCy+8oJtvvtkRe+ONN+Tr6+uS5549e9SlSxfVrVtXzz77rKKiorR+/Xo98MADSktL07Rp08r8ep7J888/79KUO5v3339f0dHROnHihJYsWaLx48crOjpagwcP/sv5LFu2TE2aNHE8zsjI0NVXX+00ZtOmTerdu7datWqlpUuXyt/fX4sWLdK1116rlStXasiQIS7ztm3bVosWLZIkpaSk6IYbbjjnHGfPnq2pU6fqzjvv1NSpU5WXl6enn35aXbt21c6dO9WsWbNznruIzWbTmDFjZLVaZbPZnJ4bPny4vv76a82dO1etW7eWj4+P/vWvf+mFF14467yJiYnq3LmzRo0apdDQUO3bt0/PPfecrrjiCv30009u34tF54wkff/99xozZozLmMsvv9ylqVqjRg1Jkmmauv7667Vx40ZNnjxZXbt21Y8//qhp06Zp+/bt2r59u1Pjviyfg+78+9//dmlSjRo1yun9M2jQILVr185RjySn41WtWjWtX79eiYmJatCggSQpPT1d77zzjqpXr+40d05Ojnr27KnExETNmDFDrVq10pYtWzRnzhwlJCS4NEkr8rMYAOBlJgAAF7DU1FRTknnLLbeUeZvY2FjTMAwzISHBKd67d28zJCTEzM7OdrtdQUGBmZ+fb44cOdJs27at03OSzGnTpjnFrr/+erNmzZqOx0lJSaYk8+mnn3aZu3nz5mb37t0dj+fMmWNaLBbz22+/dRr37rvvmpLMtWvXOu17zJgxLnNec801ZmxsrMv+ly1bZpqmadpsNrN9+/bmddddZ8bGxprDhw93jL333nvN4OBgc//+/U5zPvPMM6Yk85dffnHZX3El5zNN0xw/frwpyTx58qRT7oGBgWZqaqojVlBQYDZp0sS85JJLyp1PUY0TJkwwfX19zR9++MExtmnTpuYjjzzicgz69u1rxsTEmBkZGU5zjx071gwICDCPHj1qmqZpfvnll6Ykc/Xq1S71BgUFOdW7bNkyU5KZlJRkmqZpHjhwwAwODjYfeOABp2NQmpLbm6ZpHj9+3JRkPvLII47YtGnTTEnmkSNHSp2r5LEomrvke+vIkSMu7+NOnTqZNWvWNE+cOOGIFRQUmC1atDBjYmJMu93uNEfnzp3Nq666yvG45HvONE2ze/fuZvPmzV3yfPrpp51qTk5ONn18fMz777/fadyJEyfMqKgoc/DgwY7Y8OHDzaCgIJc5V69ebUoyv/zyS6f9Fz/X5s+fbwYFBZl33XWXWfJb36CgIHPo0KFnzLMs7Ha7mZ+fb+7fv9+UZH744YcuY6Kjo82RI0c6Hhe934rnHhsba15zzTWl7uezzz4zJZnz5s1ziq9atcqUZC5ZssRprrJ8DpbMIysry4yJiXG8l0t+7hWfv+RnQJGi90C/fv3MCRMmOOJPPfWU2bFjR5f3yMsvv2xKMv/97387zTN37lxTkvn55587YmX5LAYAXDy4fA8AUCk1b95crVu3dorddtttyszM1Pfff++IrV69WpdffrmCg4Pl4+MjX19fLV26VHv37nWZ0263q6CgQLm5udqyZYvjsqfSxhX/KumTTz5RixYt1KZNG6dxffv2dXspjWmaLnOaZ7kt5CuvvKI9e/Zo/vz5bvffs2dP1apVy2nOfv36SSpcQXM2RTnl5eUpISFBn3zyiTp37qzAwECncVdddZUiIyMdj61Wq4YMGaLff/9dBw4cOKd8atWqpUGDBjlWtGzYsEEHDx7U0KFDncbl5ORo48aNGjRokKpUqeI0d//+/ZWTk6NvvvnGaZuyHL+SJk6cqHr16un+++8/69jibDabCgoKdOzYMS1YsECGYahnz56ljjvbMS+P7Oxs7dixQzfddJPTpXFWq1VDhw7VgQMH9Ouvvzptc+rUKQUEBJRp/pKvod1ud3p+/fr1Kigo0LBhw5zGBQQEqHv37i7nQFnmLOnQoUOaNm2aHnvsMbcrLS+55BJ98cUX2rFjh3Jycso0Z5HDhw9r9OjRjkv/fH19FRsbK0luPz/K89qV5osvvpAkl0txb775ZgUFBWnjxo1O8bJ+DhY3c+ZM5efna+bMmX8pV0m6//77tWzZMmVnZ8tms2nx4sVuV4d98cUXCgoKcqycLFJUZ8m6yvpZDAC48HH5HgDgghYREaEqVaooKSmpXNtFRUWVGktPT5dUeOnU4MGDdfPNN+vhhx9WVFS
2026-05-25 10:45:18 +00:00
"text/plain": [
2026-05-25 13:02:23 +00:00
"<Figure size 1200x1400 with 3 Axes>"
2026-05-25 10:46:44 +00:00
]
},
"metadata": {},
"output_type": "display_data"
2026-05-25 10:45:18 +00:00
}
],
"source": [
"maze_names = [\"small\", \"medium\", \"large\", \"empty\", \"no_exit\"]\n",
"strategies = [\"BFS\", \"DFS\", \"A*\"]\n",
2026-05-23 10:37:43 +00:00
"\n",
2026-05-25 10:45:18 +00:00
"colors = {\"BFS\": \"#EEDC82\", \"DFS\": \"#88D94C\", \"A*\": \"#FF43A4\"}\n",
2026-05-23 10:37:43 +00:00
"\n",
2026-05-25 10:45:18 +00:00
"# Подготовим данные для графиков\n",
"time_data = {maze: {s: None for s in strategies} for maze in maze_names}\n",
"visited_data = {maze: {s: None for s in strategies} for maze in maze_names}\n",
2026-05-25 13:02:23 +00:00
"path_data = {maze: {s: None for s in strategies} for maze in maze_names}\n",
2026-05-23 10:37:43 +00:00
"\n",
2026-05-25 10:45:18 +00:00
"for row in results:\n",
" maze = row[\"maze\"]\n",
" strat = row[\"strategy\"]\n",
" time_data[maze][strat] = row[\"time_ms\"]\n",
" visited_data[maze][strat] = row[\"visited_cells\"]\n",
2026-05-25 13:02:23 +00:00
" path_data[maze][strat] = row[\"path_length\"]\n",
2026-05-25 10:45:18 +00:00
"\n",
2026-05-25 13:02:23 +00:00
"fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(12, 14))\n",
2026-05-25 10:45:18 +00:00
"\n",
"x = np.arange(len(maze_names))\n",
"width = 0.25 \n",
"multiplier = 0\n",
"\n",
"for strategy in strategies:\n",
" values = [time_data[maze][strategy] for maze in maze_names]\n",
" offset = width * multiplier\n",
2026-05-25 13:02:23 +00:00
" ax1.bar(x + offset, values, width, label=strategy, color=colors[strategy])\n",
2026-05-25 10:45:18 +00:00
" multiplier += 1\n",
"\n",
"ax1.set_xticks(x + width, maze_names)\n",
"ax1.set_ylabel(\"Время (мс)\")\n",
"ax1.set_title(\"Сравнение времени выполнения алгоритмов\")\n",
"ax1.legend()\n",
"ax1.grid(axis='y', alpha=0.5, linestyle='--')\n",
"\n",
"multiplier = 0\n",
"for strategy in strategies:\n",
" values = [visited_data[maze][strategy] for maze in maze_names]\n",
" offset = width * multiplier\n",
" ax2.bar(x + offset, values, width, label=strategy, color=colors[strategy])\n",
" multiplier += 1\n",
"\n",
"ax2.set_xticks(x + width, maze_names)\n",
2026-05-25 13:02:23 +00:00
"ax2.set_ylabel(\"Количество исследованных клеток\")\n",
"ax2.set_title(\"Сравнение количества исследованных клеток\")\n",
2026-05-25 10:45:18 +00:00
"ax2.legend()\n",
"ax2.grid(axis='y', alpha=0.5, linestyle='--')\n",
"\n",
2026-05-25 13:02:23 +00:00
"multiplier = 0\n",
"for strategy in strategies:\n",
" values = [path_data[maze][strategy] for maze in maze_names]\n",
" offset = width * multiplier\n",
" ax3.bar(x + offset, values, width, label=strategy, color=colors[strategy])\n",
" multiplier += 1\n",
"\n",
"ax3.set_xticks(x + width, maze_names)\n",
"ax3.set_ylabel(\"Длина пути\")\n",
"ax3.set_title(\"Сравнение длины найденного пути\")\n",
"ax3.legend()\n",
"ax3.grid(axis='y', alpha=0.5, linestyle='--')\n",
"\n",
2026-05-25 10:45:18 +00:00
"plt.tight_layout()\n",
2026-05-25 10:46:44 +00:00
"plt.savefig('analysis.png')\n",
2026-05-25 13:02:23 +00:00
"plt.show()"
2026-05-23 10:37:43 +00:00
]
2026-05-22 22:06:48 +00:00
}
],
"metadata": {
2026-05-23 10:37:43 +00:00
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
2026-05-22 22:06:48 +00:00
"language_info": {
2026-05-23 10:37:43 +00:00
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
2026-05-22 22:06:48 +00:00
}
},
"nbformat": 4,
"nbformat_minor": 5
}