From ef877978d2e4151dd16b0d94fbb92867385e0db9 Mon Sep 17 00:00:00 2001 From: GordStep Date: Fri, 22 May 2026 22:27:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=BC=D0=B0=20A*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../labyrinth/mazes/tests/test_lab3.txt | 9 + .../labyrinth/source/strategy/astar.py | 60 +++++- stepushovgs/labyrinth/test.ipynb | 172 ++++++++++++------ 3 files changed, 183 insertions(+), 58 deletions(-) create mode 100644 stepushovgs/labyrinth/mazes/tests/test_lab3.txt diff --git a/stepushovgs/labyrinth/mazes/tests/test_lab3.txt b/stepushovgs/labyrinth/mazes/tests/test_lab3.txt new file mode 100644 index 0000000..ea8361a --- /dev/null +++ b/stepushovgs/labyrinth/mazes/tests/test_lab3.txt @@ -0,0 +1,9 @@ +#################### +#S # +# ########## # +# #### # +# ######## # +# # +# ####### #### # +# E # +#################### diff --git a/stepushovgs/labyrinth/source/strategy/astar.py b/stepushovgs/labyrinth/source/strategy/astar.py index 933a139..33b8283 100644 --- a/stepushovgs/labyrinth/source/strategy/astar.py +++ b/stepushovgs/labyrinth/source/strategy/astar.py @@ -1,4 +1,7 @@ -from source.strategy import PathFindingStrategy +from heapq import * + + +from source.strategy import PathFindingStrategy, reconstruct_path from source.classes import Maze, Cell @@ -7,8 +10,55 @@ class AStar(PathFindingStrategy): def name(self) -> str: return "A*" - def findPath(self, maze: Maze, start: Cell, exit: Cell): - pass + def heuristic(self, a: Cell, b: Cell) -> int: + x1, y1 = a.getXY() + x2, y2 = b.getXY() - def __A__(self, maze: Maze, start: Cell, exit: Cell): - pass \ No newline at end of file + return abs(x1 - x2) + abs(y1 - y2) + + def findPath(self, maze: Maze): + start_cell = maze.start + exit_cell = maze.exit + + queue = [] + counter = 0 # счётчик для уникальности, чтобы не сравнивать клетки + + start_h = self.heuristic(start_cell, exit_cell) + + heappush(queue, (start_h, counter, start_cell)) + counter += 1 + + cost_visited = {start_cell.getXY(): 0} + came_from = {start_cell.getXY(): None} + visited_count = 1 + + while queue: + current_cost, _, current_cell = heappop(queue) + current_g = cost_visited[current_cell.getXY()] + + if current_cell.getXY() == exit_cell.getXY(): + return reconstruct_path( + came_from=came_from, + start=start_cell, + end=current_cell + ), visited_count + + next_cells = maze.getNeighbors(current_cell) + + for next_cell in next_cells: + neighbor_cost = next_cell.value + neighbor_cell_xy = next_cell.getXY() + + new_cost = current_g + neighbor_cost + + if neighbor_cell_xy not in cost_visited or new_cost < cost_visited[neighbor_cell_xy]: + priority = new_cost + self.heuristic(next_cell, exit_cell) + + heappush(queue, (priority, counter, next_cell)) + counter += 1 + + cost_visited[neighbor_cell_xy] = new_cost + came_from[neighbor_cell_xy] = current_cell + visited_count += 1 + + return [], visited_count diff --git a/stepushovgs/labyrinth/test.ipynb b/stepushovgs/labyrinth/test.ipynb index 6f87ca3..d3d8311 100644 --- a/stepushovgs/labyrinth/test.ipynb +++ b/stepushovgs/labyrinth/test.ipynb @@ -2,14 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "id": "4dbe48b6", "metadata": {}, "outputs": [], "source": [ "from source.builder import TextFileMazeBuilder\n", "from source.observer import ConsoleView, Event\n", - "from source.strategy import MazeSolver, BFS, DFS, Dijkstra\n", + "from source.strategy import MazeSolver, BFS, DFS, Dijkstra, AStar\n", "# from source.strategy.maze_solver import \n", "from source.classes import Cell\n", "# from source.strategy import " @@ -17,19 +17,20 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "007bf97a", "metadata": {}, "outputs": [], "source": [ "test_lab = './mazes/tests/test_lab.txt'\n", "test_lab2 = './mazes/tests/test_lab2.txt'\n", - "test_lab3 = './mazes/tests/test_lab20x20.txt'" + "test_lab3 = './mazes/tests/test_lab3.txt'\n", + "test_lab4 = './mazes/tests/test_lab20x20.txt'" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 17, "id": "4489fc7e", "metadata": {}, "outputs": [ @@ -55,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 18, "id": "fde1eddb", "metadata": {}, "outputs": [ @@ -83,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 19, "id": "22325f68", "metadata": {}, "outputs": [ @@ -116,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 20, "id": "19840429", "metadata": {}, "outputs": [ @@ -154,7 +155,7 @@ " (7, 1)])" ] }, - "execution_count": 6, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -168,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 21, "id": "73ba37a8", "metadata": {}, "outputs": [ @@ -206,7 +207,7 @@ " (7, 1)])" ] }, - "execution_count": 7, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -220,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 22, "id": "857c5c04", "metadata": {}, "outputs": [ @@ -229,11 +230,11 @@ "output_type": "stream", "text": [ "0\n", - "2\n", "1\n", - "4\n", "3\n", - "3\n" + "4\n", + "2\n", + "2\n" ] }, { @@ -242,7 +243,7 @@ "{'0', '1', '2', '3', '4'}" ] }, - "execution_count": 8, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -271,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 23, "id": "9a5ea5cb", "metadata": {}, "outputs": [ @@ -357,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 24, "id": "32edf4d1", "metadata": {}, "outputs": [ @@ -382,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 25, "id": "48d20564", "metadata": {}, "outputs": [ @@ -403,7 +404,7 @@ "#. #\n", "#..................................E#\n", "#####################################\n", - "time: 0.000567700000374316 ms\n", + "time: 0.0008461000002171204 ms\n", "visited cells: 315\n", "path length: 43\n" ] @@ -420,7 +421,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 26, "id": "bf13d5ba", "metadata": {}, "outputs": [ @@ -430,25 +431,34 @@ "text": [ "DFS\n", "Путь найден:\n", - "#####################################\n", - "#S..................................#\n", - "# .#\n", - "#...................................#\n", - "#. #\n", - "#...................................#\n", - "# .#\n", - "#...................................#\n", - "#. #\n", - "#..................................E#\n", - "#####################################\n", - "time: 0.0004403000002639601 ms\n", - "visited cells: 315\n", - "path length: 179\n" + "####################\n", + "S...# # # #\n", + "###.# ### # ### # ##\n", + "#...# # # # # # # ##\n", + "#.### # ### # ### ##\n", + "#.# .....# # # ##\n", + "#.###.###.### # # ##\n", + "#.# #.# #...# # # ##\n", + "#.# #.# ###.# # # ##\n", + "#.# #.# #.# # # ##\n", + "#.# #.### #.# # # ##\n", + "#.# #...# #...# # ##\n", + "#.# ###.# ###.# # ##\n", + "#.# #.# #.# ##\n", + "#.### #.### #.### ##\n", + "#.#...#.# # #.# # ##\n", + "#.#.#.#.# # #.# # ##\n", + "#.#.#.#.# # #.# # ##\n", + "#...#...# #.....E#\n", + "####################\n", + "time: 0.00014700000019729487 ms\n", + "visited cells: 83\n", + "path length: 76\n" ] } ], "source": [ - "maze2 = builder.buildFromFile(test_lab2)\n", + "maze2 = builder.buildFromFile(test_lab3)\n", "\n", "solver = MazeSolver(maze2, DFS(), ConsoleView())\n", "print(solver.strategyName())\n", @@ -458,7 +468,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 27, "id": "9383cb75", "metadata": {}, "outputs": [ @@ -468,25 +478,34 @@ "text": [ "Dijkstra\n", "Путь найден:\n", - "#####################################\n", - "#S #\n", - "#. #\n", - "#. #\n", - "#. #\n", - "#. #\n", - "#. #\n", - "#. #\n", - "#. #\n", - "#..................................E#\n", - "#####################################\n", - "time: 0.0007290000003195019 ms\n", - "visited cells: 315\n", - "path length: 43\n" + "####################\n", + "S...# # # #\n", + "###.# ### # ### # ##\n", + "#...# # # # # # # ##\n", + "#.### # ### # ### ##\n", + "#.# .....# # # ##\n", + "#.###.###.### # # ##\n", + "#.# #.# #...# # # ##\n", + "#.# #.# ###.# # # ##\n", + "#.# #.# #.# # # ##\n", + "#.# #.### #.# # # ##\n", + "#.# #...# #...# # ##\n", + "#.# ###.# ###.# # ##\n", + "#.# #.# #.# ##\n", + "#.### #.### #.### ##\n", + "#.#...#.# # #.# # ##\n", + "#.#.#.#.# # #.# # ##\n", + "#.#.#.#.# # #.# # ##\n", + "#...#...# #.....E#\n", + "####################\n", + "time: 0.00022080000007917988 ms\n", + "visited cells: 120\n", + "path length: 76\n" ] } ], "source": [ - "maze2 = builder.buildFromFile(test_lab2)\n", + "maze2 = builder.buildFromFile(test_lab3)\n", "\n", "solver = MazeSolver(maze2, Dijkstra(), ConsoleView())\n", "print(solver.strategyName())\n", @@ -496,9 +515,56 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "835cff61", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A*\n", + "Путь найден:\n", + "####################\n", + "S...# # # #\n", + "###.# ### # ### # ##\n", + "#...# # # # # # # ##\n", + "#.### # ### # ### ##\n", + "#.# .....# # # ##\n", + "#.###.###.### # # ##\n", + "#.# #.# #...# # # ##\n", + "#.# #.# ###.# # # ##\n", + "#.# #.# #.# # # ##\n", + "#.# #.### #.# # # ##\n", + "#.# #...# #...# # ##\n", + "#.# ###.# ###.# # ##\n", + "#.# #.# #.# ##\n", + "#.### #.### #.### ##\n", + "#.#...#.# # #.# # ##\n", + "#.#.#.#.# # #.# # ##\n", + "#.#.#.#.# # #.# # ##\n", + "#...#...# #.....E#\n", + "####################\n", + "time: 0.00025749999986146577 ms\n", + "visited cells: 92\n", + "path length: 76\n" + ] + } + ], + "source": [ + "maze2 = builder.buildFromFile(test_lab3)\n", + "\n", + "solver = MazeSolver(maze2, AStar(), ConsoleView())\n", + "print(solver.strategyName())\n", + "stats = solver.solve()\n", + "stats.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d84a151", + "metadata": {}, "outputs": [], "source": [] }