{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b41a67fc",
   "metadata": {},
   "source": [
    "# Экспериментальная часть "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3986182c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import sys\n",
    "\n",
    "sys.path.insert(0, os.path.abspath(\"..\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c304f83d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from source.build.builder import TextFileBuilder\n",
    "from source.models.base import Maze\n",
    "from source.strategy import BFSStrategy, DFSStrategy, AStarStrategy\n",
    "from source.strategy.solver import MazeSolver, SearchStats"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4d32c9b",
   "metadata": {},
   "source": [
    "**Задача:** Сравнить эффективность реализованных стратегий на лабиринтах разной сложности."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4233a72f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<source.models.base.Maze at 0x27e49568d70>,\n",
       " <source.models.base.Maze at 0x27e49383ed0>,\n",
       " <source.models.base.Maze at 0x27e497bc050>,\n",
       " <source.models.base.Maze at 0x27e49590640>,\n",
       " <source.models.base.Maze at 0x27e49590770>,\n",
       " <source.models.base.Maze at 0x27e49555250>,\n",
       " <source.models.base.Maze at 0x27e495746b0>,\n",
       " <source.models.base.Maze at 0x27e495747c0>,\n",
       " <source.models.base.Maze at 0x27e4931ef50>,\n",
       " <source.models.base.Maze at 0x27e4931f050>,\n",
       " <source.models.base.Maze at 0x27e4955e3f0>,\n",
       " <source.models.base.Maze at 0x27e4955e4e0>,\n",
       " <source.models.base.Maze at 0x27e4948fcb0>,\n",
       " <source.models.base.Maze at 0x27e4948fd90>,\n",
       " <source.models.base.Maze at 0x27e49584390>,\n",
       " <source.models.base.Maze at 0x27e4954fb90>,\n",
       " <source.models.base.Maze at 0x27e4954fa10>,\n",
       " <source.models.base.Maze at 0x27e4742f490>,\n",
       " <source.models.base.Maze at 0x27e473df8b0>,\n",
       " <source.models.base.Maze at 0x27e4951f930>,\n",
       " <source.models.base.Maze at 0x27e4951fbb0>,\n",
       " <source.models.base.Maze at 0x27e49511d90>,\n",
       " <source.models.base.Maze at 0x27e4a0506d0>,\n",
       " <source.models.base.Maze at 0x27e4a050bd0>,\n",
       " <source.models.base.Maze at 0x27e4a083f50>,\n",
       " <source.models.base.Maze at 0x27e4a08df60>,\n",
       " <source.models.base.Maze at 0x27e49516ab0>,\n",
       " <source.models.base.Maze at 0x27e49516a50>,\n",
       " <source.models.base.Maze at 0x27e49516db0>,\n",
       " <source.models.base.Maze at 0x27e49516bd0>,\n",
       " <source.models.base.Maze at 0x27e49516b70>,\n",
       " <source.models.base.Maze at 0x27e49517170>,\n",
       " <source.models.base.Maze at 0x27e49516b10>,\n",
       " <source.models.base.Maze at 0x27e49517110>,\n",
       " <source.models.base.Maze at 0x27e495171d0>,\n",
       " <source.models.base.Maze at 0x27e49517230>,\n",
       " <source.models.base.Maze at 0x27e49517290>,\n",
       " <source.models.base.Maze at 0x27e495172f0>,\n",
       " <source.models.base.Maze at 0x27e49517350>,\n",
       " <source.models.base.Maze at 0x27e495173b0>,\n",
       " <source.models.base.Maze at 0x27e49517470>,\n",
       " <source.models.base.Maze at 0x27e49517530>,\n",
       " <source.models.base.Maze at 0x27e49517590>,\n",
       " <source.models.base.Maze at 0x27e495175f0>,\n",
       " <source.models.base.Maze at 0x27e49517650>,\n",
       " <source.models.base.Maze at 0x27e495176b0>,\n",
       " <source.models.base.Maze at 0x27e49517710>,\n",
       " <source.models.base.Maze at 0x27e49517770>,\n",
       " <source.models.base.Maze at 0x27e495177d0>,\n",
       " <source.models.base.Maze at 0x27e49517830>]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "filenames: list[str] = os.listdir(\"../source/templates\")\n",
    "\n",
    "list_maze: list[Maze] = [\n",
    "    TextFileBuilder().build_from_file(filename=\"../source/templates/\" + filename)\n",
    "    for filename in filenames\n",
    "]\n",
    "\n",
    "list_maze"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8c9592fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "50"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(filenames)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "04e5e6a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "strategies = {\n",
    "    \"BFS\": BFSStrategy(),\n",
    "    \"DFS\": DFSStrategy(),\n",
    "    \"A*\": AStarStrategy(),\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3ccf351f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v1.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v1.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v1.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v10.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v10.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v10.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v2.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v2.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v2.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v3.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v3.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v3.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v4.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v4.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v4.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v5.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v5.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v5.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v6.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v6.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v6.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v7.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v7.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v7.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v8.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v8.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v8.txt | A*\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v9.txt | BFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v9.txt | DFS\n",
      "Выходная клетка не найдена в лабиринте | 20x20_noexit_v9.txt | A*\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[{'лабиринт': '100x100_spaghetti_v1.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 9.698449999996228,\n",
       "  'посещено_клеток': 205.0,\n",
       "  'длина_пути': 205.0},\n",
       " {'лабиринт': '100x100_spaghetti_v1.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 7.488289999992048,\n",
       "  'посещено_клеток': 2129.0,\n",
       "  'длина_пути': 2129.0},\n",
       " {'лабиринт': '100x100_spaghetti_v1.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 7.629470000074434,\n",
       "  'посещено_клеток': 205.0,\n",
       "  'длина_пути': 205.0},\n",
       " {'лабиринт': '100x100_spaghetti_v10.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 8.57915999999932,\n",
       "  'посещено_клеток': 207.0,\n",
       "  'длина_пути': 207.0},\n",
       " {'лабиринт': '100x100_spaghetti_v10.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 8.580700000084107,\n",
       "  'посещено_клеток': 2489.0,\n",
       "  'длина_пути': 2489.0},\n",
       " {'лабиринт': '100x100_spaghetti_v10.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 8.167220000041198,\n",
       "  'посещено_клеток': 207.0,\n",
       "  'длина_пути': 207.0},\n",
       " {'лабиринт': '100x100_spaghetti_v2.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 8.6136500000066,\n",
       "  'посещено_клеток': 217.0,\n",
       "  'длина_пути': 217.0},\n",
       " {'лабиринт': '100x100_spaghetti_v2.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 6.336869999950068,\n",
       "  'посещено_клеток': 2063.0,\n",
       "  'длина_пути': 2063.0},\n",
       " {'лабиринт': '100x100_spaghetti_v2.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 10.417360000155895,\n",
       "  'посещено_клеток': 217.0,\n",
       "  'длина_пути': 217.0},\n",
       " {'лабиринт': '100x100_spaghetti_v3.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 8.563159999994241,\n",
       "  'посещено_клеток': 217.0,\n",
       "  'длина_пути': 217.0},\n",
       " {'лабиринт': '100x100_spaghetti_v3.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 5.783009999913702,\n",
       "  'посещено_клеток': 2107.0,\n",
       "  'длина_пути': 2107.0},\n",
       " {'лабиринт': '100x100_spaghetti_v3.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 6.953359999988606,\n",
       "  'посещено_клеток': 217.0,\n",
       "  'длина_пути': 217.0},\n",
       " {'лабиринт': '100x100_spaghetti_v4.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 8.79095000000234,\n",
       "  'посещено_клеток': 205.0,\n",
       "  'длина_пути': 205.0},\n",
       " {'лабиринт': '100x100_spaghetti_v4.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 6.422280000060709,\n",
       "  'посещено_клеток': 2409.0,\n",
       "  'длина_пути': 2409.0},\n",
       " {'лабиринт': '100x100_spaghetti_v4.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 6.4153799999985495,\n",
       "  'посещено_клеток': 205.0,\n",
       "  'длина_пути': 205.0},\n",
       " {'лабиринт': '100x100_spaghetti_v5.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 8.864429999994172,\n",
       "  'посещено_клеток': 217.0,\n",
       "  'длина_пути': 217.0},\n",
       " {'лабиринт': '100x100_spaghetti_v5.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 7.053909999922325,\n",
       "  'посещено_клеток': 2071.0,\n",
       "  'длина_пути': 2071.0},\n",
       " {'лабиринт': '100x100_spaghetti_v5.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 10.017580000112503,\n",
       "  'посещено_клеток': 217.0,\n",
       "  'длина_пути': 217.0},\n",
       " {'лабиринт': '100x100_spaghetti_v6.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 9.399200000052588,\n",
       "  'посещено_клеток': 243.0,\n",
       "  'длина_пути': 243.0},\n",
       " {'лабиринт': '100x100_spaghetti_v6.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 7.747049999989031,\n",
       "  'посещено_клеток': 1869.0,\n",
       "  'длина_пути': 1869.0},\n",
       " {'лабиринт': '100x100_spaghetti_v6.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 14.121079999995345,\n",
       "  'посещено_клеток': 243.0,\n",
       "  'длина_пути': 243.0},\n",
       " {'лабиринт': '100x100_spaghetti_v7.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 8.773490000021411,\n",
       "  'посещено_клеток': 211.0,\n",
       "  'длина_пути': 211.0},\n",
       " {'лабиринт': '100x100_spaghetti_v7.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 6.66454999995949,\n",
       "  'посещено_клеток': 2283.0,\n",
       "  'длина_пути': 2283.0},\n",
       " {'лабиринт': '100x100_spaghetti_v7.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 7.22499999997126,\n",
       "  'посещено_клеток': 211.0,\n",
       "  'длина_пути': 211.0},\n",
       " {'лабиринт': '100x100_spaghetti_v8.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 8.687369999961447,\n",
       "  'посещено_клеток': 221.0,\n",
       "  'длина_пути': 221.0},\n",
       " {'лабиринт': '100x100_spaghetti_v8.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 7.4791699999423145,\n",
       "  'посещено_клеток': 2473.0,\n",
       "  'длина_пути': 2473.0},\n",
       " {'лабиринт': '100x100_spaghetti_v8.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 10.324829999944996,\n",
       "  'посещено_клеток': 221.0,\n",
       "  'длина_пути': 221.0},\n",
       " {'лабиринт': '100x100_spaghetti_v9.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 9.33376999992106,\n",
       "  'посещено_клеток': 209.0,\n",
       "  'длина_пути': 209.0},\n",
       " {'лабиринт': '100x100_spaghetti_v9.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 6.118089999927179,\n",
       "  'посещено_клеток': 1939.0,\n",
       "  'длина_пути': 1939.0},\n",
       " {'лабиринт': '100x100_spaghetti_v9.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 7.4974299999212235,\n",
       "  'посещено_клеток': 209.0,\n",
       "  'длина_пути': 209.0},\n",
       " {'лабиринт': '10x10_path_v1.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.03240000014557154,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v1.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.03378000001248438,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v1.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.03725999999915075,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v10.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.030790000027991482,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v10.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.035979999984192546,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v10.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.03738000000339525,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v2.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.035089999892079504,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v2.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.045300000101633486,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v2.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.04377000000204134,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v3.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.035430000025371555,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v3.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.055879999990793294,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v3.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.04907000002276618,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v4.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.053650000018024,\n",
       "  'посещено_клеток': 29.0,\n",
       "  'длина_пути': 29.0},\n",
       " {'лабиринт': '10x10_path_v4.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.09142999997493462,\n",
       "  'посещено_клеток': 29.0,\n",
       "  'длина_пути': 29.0},\n",
       " {'лабиринт': '10x10_path_v4.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.09646000012253353,\n",
       "  'посещено_клеток': 29.0,\n",
       "  'длина_пути': 29.0},\n",
       " {'лабиринт': '10x10_path_v5.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.035020000041185995,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v5.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.03366999999343534,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v5.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.037369999972725054,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v6.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.03128999992441095,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v6.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.03374999996594852,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v6.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.037149999934626976,\n",
       "  'посещено_клеток': 13.0,\n",
       "  'длина_пути': 13.0},\n",
       " {'лабиринт': '10x10_path_v7.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.040439999975205865,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v7.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.05008999996789498,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v7.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.04825999994864105,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v8.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.04994999994778482,\n",
       "  'посещено_клеток': 29.0,\n",
       "  'длина_пути': 29.0},\n",
       " {'лабиринт': '10x10_path_v8.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.058220000073561096,\n",
       "  'посещено_клеток': 29.0,\n",
       "  'длина_пути': 29.0},\n",
       " {'лабиринт': '10x10_path_v8.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.08468999990327575,\n",
       "  'посещено_клеток': 29.0,\n",
       "  'длина_пути': 29.0},\n",
       " {'лабиринт': '10x10_path_v9.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.048520000018470455,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v9.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.04457000009097101,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '10x10_path_v9.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.04779000005328271,\n",
       "  'посещено_клеток': 17.0,\n",
       "  'длина_пути': 17.0},\n",
       " {'лабиринт': '30x30_empty_v1.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.3075400000161608,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v1.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.7962099999531347,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v1.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 3.0833899998924608,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v10.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.6444799998680537,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v10.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.1289500000657426,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v10.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 3.0003100000158156,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v2.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.5947500000493164,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v2.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.0904399999617453,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v2.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.242679999972097,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v3.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.3086099999327416,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v3.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.0075400000459922,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v3.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.17491000003065,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v4.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.5689699999711593,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v4.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.0746400001153233,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v4.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.2863700000471,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v5.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.3352300000406103,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v5.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.8594300000368094,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v5.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.264869999999064,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v6.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.158610000175031,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v6.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.7807300000422401,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v6.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.158290000170382,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v7.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.1674999999286229,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v7.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.7544099999449827,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v7.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.252279999993334,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v8.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.248879999957353,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v8.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.7802099999480561,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v8.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.2779600000831124,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v9.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.201050000054238,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '30x30_empty_v9.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 0.7864399999107263,\n",
       "  'посещено_клеток': 379.0,\n",
       "  'длина_пути': 379.0},\n",
       " {'лабиринт': '30x30_empty_v9.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.155060000040976,\n",
       "  'посещено_клеток': 55.0,\n",
       "  'длина_пути': 55.0},\n",
       " {'лабиринт': '50x50_deadends_v1.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.8954199999825505,\n",
       "  'посещено_клеток': 729.0,\n",
       "  'длина_пути': 729.0},\n",
       " {'лабиринт': '50x50_deadends_v1.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.8011099999966973,\n",
       "  'посещено_клеток': 729.0,\n",
       "  'длина_пути': 729.0},\n",
       " {'лабиринт': '50x50_deadends_v1.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.820240000028207,\n",
       "  'посещено_клеток': 729.0,\n",
       "  'длина_пути': 729.0},\n",
       " {'лабиринт': '50x50_deadends_v10.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.7890000001225417,\n",
       "  'посещено_клеток': 261.0,\n",
       "  'длина_пути': 261.0},\n",
       " {'лабиринт': '50x50_deadends_v10.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.94999999994252,\n",
       "  'посещено_клеток': 261.0,\n",
       "  'длина_пути': 261.0},\n",
       " {'лабиринт': '50x50_deadends_v10.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 1.0044500000731205,\n",
       "  'посещено_клеток': 261.0,\n",
       "  'длина_пути': 261.0},\n",
       " {'лабиринт': '50x50_deadends_v2.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.0780099999919912,\n",
       "  'посещено_клеток': 249.0,\n",
       "  'длина_пути': 249.0},\n",
       " {'лабиринт': '50x50_deadends_v2.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.8470900000920665,\n",
       "  'посещено_клеток': 249.0,\n",
       "  'длина_пути': 249.0},\n",
       " {'лабиринт': '50x50_deadends_v2.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 1.1555500000213215,\n",
       "  'посещено_клеток': 249.0,\n",
       "  'длина_пути': 249.0},\n",
       " {'лабиринт': '50x50_deadends_v3.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.9816600000704057,\n",
       "  'посещено_клеток': 297.0,\n",
       "  'длина_пути': 297.0},\n",
       " {'лабиринт': '50x50_deadends_v3.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.8496700000014243,\n",
       "  'посещено_клеток': 297.0,\n",
       "  'длина_пути': 297.0},\n",
       " {'лабиринт': '50x50_deadends_v3.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 1.18772000005265,\n",
       "  'посещено_клеток': 297.0,\n",
       "  'длина_пути': 297.0},\n",
       " {'лабиринт': '50x50_deadends_v4.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.5539699999862933,\n",
       "  'посещено_клеток': 413.0,\n",
       "  'длина_пути': 413.0},\n",
       " {'лабиринт': '50x50_deadends_v4.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.6492100000050414,\n",
       "  'посещено_клеток': 413.0,\n",
       "  'длина_пути': 413.0},\n",
       " {'лабиринт': '50x50_deadends_v4.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 1.9135399998958746,\n",
       "  'посещено_клеток': 413.0,\n",
       "  'длина_пути': 413.0},\n",
       " {'лабиринт': '50x50_deadends_v5.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.1528699998507363,\n",
       "  'посещено_клеток': 309.0,\n",
       "  'длина_пути': 309.0},\n",
       " {'лабиринт': '50x50_deadends_v5.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.7570300000897987,\n",
       "  'посещено_клеток': 309.0,\n",
       "  'длина_пути': 309.0},\n",
       " {'лабиринт': '50x50_deadends_v5.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 1.199769999993805,\n",
       "  'посещено_клеток': 309.0,\n",
       "  'длина_пути': 309.0},\n",
       " {'лабиринт': '50x50_deadends_v6.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.0987699999986944,\n",
       "  'посещено_клеток': 337.0,\n",
       "  'длина_пути': 337.0},\n",
       " {'лабиринт': '50x50_deadends_v6.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.9475800000236632,\n",
       "  'посещено_клеток': 337.0,\n",
       "  'длина_пути': 337.0},\n",
       " {'лабиринт': '50x50_deadends_v6.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 1.3809099999434693,\n",
       "  'посещено_клеток': 337.0,\n",
       "  'длина_пути': 337.0},\n",
       " {'лабиринт': '50x50_deadends_v7.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.8687199999258155,\n",
       "  'посещено_клеток': 261.0,\n",
       "  'длина_пути': 261.0},\n",
       " {'лабиринт': '50x50_deadends_v7.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.8890300000293792,\n",
       "  'посещено_клеток': 261.0,\n",
       "  'длина_пути': 261.0},\n",
       " {'лабиринт': '50x50_deadends_v7.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 1.1017699999683828,\n",
       "  'посещено_клеток': 261.0,\n",
       "  'длина_пути': 261.0},\n",
       " {'лабиринт': '50x50_deadends_v8.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 1.7002200001115853,\n",
       "  'посещено_клеток': 565.0,\n",
       "  'длина_пути': 565.0},\n",
       " {'лабиринт': '50x50_deadends_v8.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.7665699999724893,\n",
       "  'посещено_клеток': 565.0,\n",
       "  'длина_пути': 565.0},\n",
       " {'лабиринт': '50x50_deadends_v8.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 2.3602600000231178,\n",
       "  'посещено_клеток': 565.0,\n",
       "  'длина_пути': 565.0},\n",
       " {'лабиринт': '50x50_deadends_v9.txt',\n",
       "  'стратегия': 'BFS',\n",
       "  'время_мс': 0.7835800000066229,\n",
       "  'посещено_клеток': 209.0,\n",
       "  'длина_пути': 209.0},\n",
       " {'лабиринт': '50x50_deadends_v9.txt',\n",
       "  'стратегия': 'DFS',\n",
       "  'время_мс': 1.0580000001027656,\n",
       "  'посещено_клеток': 209.0,\n",
       "  'длина_пути': 209.0},\n",
       " {'лабиринт': '50x50_deadends_v9.txt',\n",
       "  'стратегия': 'A*',\n",
       "  'время_мс': 0.8593499999733467,\n",
       "  'посещено_клеток': 209.0,\n",
       "  'длина_пути': 209.0}]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "RUNS = 10\n",
    "results = []\n",
    "\n",
    "\n",
    "for filename, maze in zip(filenames, list_maze):\n",
    "    for strategy_name, strategy in strategies.items():\n",
    "        try:\n",
    "            solver = MazeSolver(maze, strategy)\n",
    "\n",
    "            times, visited, lengths = [], [], []\n",
    "            for _ in range(RUNS):\n",
    "                stats = solver.solve()\n",
    "                times.append(stats.elapsed_ms)\n",
    "                visited.append(stats.visited_count)\n",
    "                lengths.append(stats.path_length)\n",
    "\n",
    "            results.append(\n",
    "                {\n",
    "                    \"лабиринт\": filename,\n",
    "                    \"стратегия\": strategy_name,\n",
    "                    \"время_мс\": sum(times) / RUNS,\n",
    "                    \"посещено_клеток\": sum(visited) / RUNS,\n",
    "                    \"длина_пути\": sum(lengths) / RUNS,\n",
    "                }\n",
    "            )\n",
    "        except Exception as ex:\n",
    "            print(ex, filename, strategy_name, sep=\" | \")\n",
    "\n",
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "f6cfb407",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "120"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "c6d14f8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 183720 characters]",
      "text/plain": [
       "<Figure size 1200x1400 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "\n",
    "df = pd.DataFrame(results)\n",
    "\n",
    "metrics = [\"время_мс\", \"посещено_клеток\", \"длина_пути\"]\n",
    "titles = [\"Время (мс)\", \"Посещено клеток\", \"Длина пути\"]\n",
    "colors = {\"BFS\": \"#4C72B0\", \"DFS\": \"#DD8452\", \"A*\": \"#55A868\"}\n",
    "\n",
    "fig, axes = plt.subplots(len(metrics), 1, figsize=(12, 14))\n",
    "\n",
    "for ax, metric, title in zip(axes, metrics, titles):\n",
    "    for strategy_name in df[\"стратегия\"].unique():\n",
    "        subset = df[df[\"стратегия\"] == strategy_name].reset_index(drop=True)\n",
    "        ax.bar(\n",
    "            [\n",
    "                i + list(df[\"стратегия\"].unique()).index(strategy_name) * 0.25\n",
    "                for i in range(len(subset))\n",
    "            ],\n",
    "            subset[metric],\n",
    "            width=0.25,\n",
    "            label=strategy_name,\n",
    "            color=colors[strategy_name],\n",
    "        )\n",
    "    ax.set_title(title, fontsize=13)\n",
    "    ax.set_xticks([i + 0.25 for i in range(len(df[\"лабиринт\"].unique()))])\n",
    "    ax.set_xticklabels(df[\"лабиринт\"].unique(), rotation=90, ha=\"right\")\n",
    "    ax.legend()\n",
    "    ax.grid(axis=\"y\", alpha=0.3)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.savefig(\"results.png\", dpi=150)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "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.14.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
