add result.md and fix cod
This commit is contained in:
parent
18359cc7ad
commit
4a8728f3e0
|
|
@ -1,26 +1,22 @@
|
||||||
class Maze:
|
class Maze:
|
||||||
def __init__(self, grid, start = None, exit = None):
|
def __init__(self, grid, start=None, exit=None):
|
||||||
self.grid = grid
|
self.grid = grid
|
||||||
self.start = start
|
self.start = start
|
||||||
self.exit = exit
|
self.exit = exit
|
||||||
self.height = len(grid)
|
self.height = len(grid)
|
||||||
self.width = len(grid[0]) if grid else 0
|
self.width = len(grid[0]) if grid else 0
|
||||||
|
|
||||||
# Создание новой ячейки
|
def getCell(self, x, y):
|
||||||
def getCell(self, x, y):
|
if 0 <= x < self.width and 0 <= y < self.height:
|
||||||
if 0 <= x < self.height and 0 <= y < self.width:
|
return self.grid[y][x]
|
||||||
return self.grid[x][y]
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Ищет соседние проходимые клетки
|
|
||||||
def getNeighbors(self, cell):
|
def getNeighbors(self, cell):
|
||||||
directions = [(0,1),(1,0),(0,-1),(-1,0)]
|
directions = [(0,1),(1,0),(0,-1),(-1,0)]
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
for dx, dy in directions:
|
for dx, dy in directions:
|
||||||
nx, ny = cell.x + dx, cell.y + dy
|
nx, ny = cell.x + dx, cell.y + dy
|
||||||
neighbor = self.getCell(nx, ny)
|
neighbor = self.getCell(nx, ny)
|
||||||
if neighbor and neighbor.isPassable():
|
if neighbor and neighbor.isPassable():
|
||||||
result.append(neighbor)
|
result.append(neighbor)
|
||||||
|
return result
|
||||||
return result
|
|
||||||
|
|
@ -1 +1,10 @@
|
||||||
S E
|
##########
|
||||||
|
#S #
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# E#
|
||||||
|
##########
|
||||||
|
|
@ -1,31 +1,103 @@
|
||||||
############################################################
|
#######################################################################################################
|
||||||
#S # # # # # # # #
|
#S # # # # # # # # # # # # # #
|
||||||
# ### ##### ##### ### ##### ### ### ##### ### ##### ### ### #
|
# ### ##### # ##### # # ### ### ####### ####### # # ### ### ### # ### ### ### ### # ### # # # #########
|
||||||
# # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
### ##### ##### ### ##### ######### ### ### ### ####### ### #
|
### ### ##### # ##### ### # # ##### ####### ### ### # # # ####### # ### # # ### # ### ### ##### # ### #
|
||||||
# # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# ### # ##### ### ##### ####### # ### ### ######### ##### # #
|
# ### ### # # # # ### ### # ### ##### # ### # # # # # ####### # # ##### ### # ### ### # ##### ### # # #
|
||||||
# # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
########### # # ### # ####### # ### ### ######### # # # #####
|
# ### ####### # ######### ##### # # ### # ### ### ### # ####### # # ### # ##### ##### ########### # # #
|
||||||
# # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# ####### # # ########### ### ### ####### ##### # # # ##### #
|
# ##### ### # ##### # ####### ### # # # ##### # ##### ##### # ######### # # # # # # ### ### # ### # ###
|
||||||
# # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# # ### # # ####### # ##### ### ### ### # # # # # # ##### # #
|
# # ####### # ##### # ### ##### ##### # ####### ######### # ##### # # # # # ### # ### # # # ### ### # #
|
||||||
# # # # # # # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# # # ### ####### # ##### # # ##### # # # # # # # # # # # # #
|
# ##### ######### ##### # # # # # # ##### ##### ### # # # ### ####### ########### # # # # ### # ### # #
|
||||||
# # # # # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # #
|
||||||
# # ### ####### # ##### # # ##### # # ##### ##### # # # #####
|
####### # ####### ### ##### # # # # # # # ######### ##### # # # # ####### # ### ### # ### ########### #
|
||||||
# # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# ### # # ########### # # # # # # # ##### ######### # ##### #
|
# ### # # # ####### # # # ##### ### # ### # ### ### # ### ####### ### # # ### ##### ### ### ######### #
|
||||||
# # # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
### # # # # ##### # ### # ##### # ##### # # ##### # ##### # #
|
# ### ### # ##### # ### ####### # ####### ##### # # # # # # # # # # ######### # ########### # ### # # #
|
||||||
# # # # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# ####### ##### # # # ### # ######### # # ##### # # # # # # #
|
# # # ####### ### ####### ### # ##### # ##### ### # # # # # # # # ### # # ####### ### ### # ### ### ###
|
||||||
# # # # # # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
####### # # # # # # # # ######### # ### # # # # # # # # # # #
|
##### ### ##### ####### # # ### ### ##### ### ############# ### ### ### ####### ##### ####### # # #####
|
||||||
# # # # # # # # # # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# ### # # # # # # # # # # ##### # ### # # # # # # # # # # # #
|
# ######### ##### # # ### ### ### ####### ##### # ### ### ### # # # # # # # ##### # # # # # # ### # # #
|
||||||
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
# # ### # # # # # # # # ##### # # # ### # # # # # # # # # # #
|
# ####### ### ### ### ##### # # # # ####### # ##### ############# ### ### ### # # # # # ######### ### #
|
||||||
# # # # # # # # # # # # # # #
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
###########################################################E#
|
# ### # ### ### # ### ##### ### # ##### # ####### # ### ### ##### ### # ######### # ### # ### ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ### ######### # ##### # ### ### ### # # ##### # # # ### # # ####### # # ### ##### ### # ##### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ### ##### # ########### ##### ####### ########### # ### ######### # ### # # # # ### # # ##### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ##### # # ### # # ##### ### # ### # ##### # # # ##### ### # # # ##### ####### ##### ### # ### ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # # ############# ##### # # ### ### ### ### ### # # ####### # ### ### ##### ### ### ### ### # # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # ##### # # # # # # # ### ### # ### # ##### # ### ### ### ##### # ### ### ### ### ### ##### # ### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ### ### ### # ### ### ##### ### # # # # ### # ##### ##### # # # # ### ######### ### # # # ##### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # # ### # ########### # # ### ######### # # ### # # # ##### # ### ##### # # ### ##### ##### # # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # ##### ### ### # # # ####### ############# ##### # ### ############### ##### # ##### ##### # # #####
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ### ####### # ##### ### # # # # # # # # ##### # ##### ### ##### # # ##### # ### # # ### # # ### #####
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ##### # ### ### ### ##### # # # ### # ### ### ##### # ### ### ##### # # ####### # ### ### # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # ####### # ### # # # ### ####### # ################# # # ##### # # ### # # ### # # # ##### ### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ##### # ### ### ### # # ########### # # # ##### ##### ##### ### ############# # # ### ### ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### ### ##### ### ### # ############# ### # ##### # # # ######### ### ### ### ### # ##### ### #######
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
################# ### # ### # # ### # ####### ### ### ### ### # ####### # # # ### ##### # # ######### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
####### ##### ##### # ### ### ######### ### # # ######### ### ### ### ##### # ### # # # ### # ##### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ### ##### ##### ### # ### # # # # ### ### # # ##### ##### ### # # ##### # # # ######### # ##### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # ####### ### # ##### ####### # ####### ####### # # ######### ### ####### ##### ### # ######### ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ### ### ##### ##### # ##### ### # ### # ########### # ### # ### # ######### # ### # ##### ### ### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ### ####### # # # ##### ##### ########### # # # # ####### # # # # # ########### # # # ######### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ##### # # ### # # ### # ##### ### # ### ### ##### ### # ### ##### # ### # # ############### ####### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # # ##### # # # ##### # ######### # # ####### ##### ### # ### ### # # # ### # ####### ### # ### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### ##### # ### # ### # ##### ##### ##### ##### ##### # # ########### ##### ############# ### ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # #
|
||||||
|
### ### # # ############### # # ### # # ####### ### ### # ### ### # # ##### # # # ####### ####### # ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ####### ##### # ### # # # ##### ### # ### # ### # ########### ### # # ##### # ##### ####### # ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
########### # ######### # ### # ### ### ### # ### ####################### # ### # ####### # ### # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # ### ####### # ### ### ### ### ########### # ##### # ##### ### ### # ### # ##### # ########### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ### # ####### # # # ### ### # # # ### # # # ### # ##### # # ########### ######### # ### ### # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # ####### # ### # # # ### # ### ### ### ######### # ### # ### # ### # # ### ##### ####### ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ##### ##### # # # # # # ##### # ### # ### ####### ####### ##### ### # ### ##### # # ### # # #######
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # ### # ####### # ####### # ##### # ### # ### # # ####### ##### # ##### ##### # ### # # ### ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ######### # ##### # ### ##### ### # ##### ##### ### # ##### ### # # ############# # # ### # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ### # # # # # ### # # ### ### ##### ### # # # ### ### # # # # # ### # ### # # # # # # ##### # ### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ####### ### # ### # ### # ### # # ####### # ##### # ### ### ##### # # # # ### # ### ### # ### ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ### ##### ### # # # ##### ############### ### # ### # # ### ##### ### # ##### ### ### ### ### # #####
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ### ####### ### ### ##### # # # ##### ##### ######### ### ##### # ####### # # ### ### # ### #####
|
||||||
|
# # # # # # # # # # # # # # # # E#
|
||||||
|
#######################################################################################################
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,53 @@
|
||||||
##################################################
|
#####################################################
|
||||||
#S # # # # # # E#
|
#S # # # # # # # # #
|
||||||
# ## # #### # ### # ##### # #### # ##### # ##### #
|
# ### # ### ########### # ### ### # ### # ###########
|
||||||
# # # # # # # # # # # # # #
|
# # # # # # # # # #
|
||||||
##################################################
|
### ### # # ### ### ##### # ##### ### ### ##### ### #
|
||||||
|
# # # # # # # # # # # # #
|
||||||
|
# ######### ##### # # ### ####### # ####### # ##### #
|
||||||
|
# # # # # # # # # # # # # # # #
|
||||||
|
# ### # ##### # # ### # ### # # ##### ##### # ##### #
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
### ### # # ### # ### ### # ### # # # ##### # # # ###
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
# ##### ####### ### ### ##### ### # ### # ### ### ###
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# ### ####### ### ### # ##### ######### ### ##### # #
|
||||||
|
# # # # # # # # # # # # # # # #
|
||||||
|
# # # ### ### # # # ####### # # # ######### ### ### #
|
||||||
|
# # # # # # # # # # # # # # # # # #
|
||||||
|
### ####### # # ### # # ### ### # ### # ##### # # # #
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# ####### # # # ### # # # # # ### # # ### # # ### # #
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
### ### ### ##### ### ### ### ### ##### ### ####### #
|
||||||
|
# # # # # # # # # # #
|
||||||
|
##### # # # ### # # ####### ### # ##### ### # ### ###
|
||||||
|
# # # # # # # # # # # # # # # # #
|
||||||
|
# ####### ### ### # ########### # # ##### # ### ### #
|
||||||
|
# # # # # # # # # # # # # # # # #
|
||||||
|
# # ### ### ### ### ### ### # # ### # # ### ##### # #
|
||||||
|
# # # # # # # # # # # # # # # # #
|
||||||
|
# ### # ##### ### ##### ##### # # ### # ### ### ### #
|
||||||
|
# # # # # # # # # # # # #
|
||||||
|
# ##### ######### ### # ### # ### # ### ####### #####
|
||||||
|
# # # # # # # #
|
||||||
|
### # # ##### ##### ########### # ### ### # ### #####
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# # # ### ##### ##### # ############# ##### # ##### #
|
||||||
|
# # # # # # # # # # #
|
||||||
|
# ### # # # ### ### ### ##### # # ##### ##### #######
|
||||||
|
# # # # # # # # # # # # #
|
||||||
|
### # ##### ### # ####### ####### # # # # ##### # ###
|
||||||
|
# # # # # # # # # # # # # # # # #
|
||||||
|
### ### ### ####### ####### # ### # ### # # ### ### #
|
||||||
|
# # # # # # # # # # # # # # # # #
|
||||||
|
# # # # ### # # # # ##### ### ####### # # # ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # ### ### # ##### # ### # # ### # ##### # # ### #
|
||||||
|
# # # # # # # # # # # #
|
||||||
|
### # # # # # # ##### # ### ### ##### ### # ##### ###
|
||||||
|
# # # # # # # # # # # # # # # # #
|
||||||
|
# # # ### ### ####### # ### # ### # ### ### ### ### #
|
||||||
|
# # # # # # # # # #E#
|
||||||
|
#####################################################
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,10 @@
|
||||||
#####
|
##########
|
||||||
#S###
|
#S #
|
||||||
#####
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# #
|
||||||
|
##########
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
##########
|
##########
|
||||||
#S #E#
|
#S #
|
||||||
# ### ## #
|
# # #
|
||||||
|
# # #
|
||||||
# # #
|
# # #
|
||||||
##########
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# E#
|
||||||
|
##########
|
||||||
|
|
@ -8,6 +8,9 @@ class AStar(PathFindingStrategy):
|
||||||
return abs(a.x - b.x) + abs(a.y - b.y)
|
return abs(a.x - b.x) + abs(a.y - b.y)
|
||||||
|
|
||||||
def findPath(self, maze, start, exit):
|
def findPath(self, maze, start, exit):
|
||||||
|
if exit is None:
|
||||||
|
return [], 0
|
||||||
|
|
||||||
heap = []
|
heap = []
|
||||||
counter = 0
|
counter = 0
|
||||||
heapq.heappush(heap, (0, counter, start))
|
heapq.heappush(heap, (0, counter, start))
|
||||||
|
|
@ -18,7 +21,7 @@ class AStar(PathFindingStrategy):
|
||||||
visited = set()
|
visited = set()
|
||||||
|
|
||||||
while heap:
|
while heap:
|
||||||
_, _, current = heapq.heappop(heap) # распаковка трёх элементов
|
_, _, current = heapq.heappop(heap)
|
||||||
|
|
||||||
if current == exit:
|
if current == exit:
|
||||||
break
|
break
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,10 @@ from Strategies.path import restore
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
class BFS(PathFindingStrategy):
|
class BFS(PathFindingStrategy):
|
||||||
def findPath(self, maze, start, exit):
|
def findPath(self, maze, start, exit):
|
||||||
|
if exit is None:
|
||||||
|
return [], 0
|
||||||
|
|
||||||
queue = deque([start])
|
queue = deque([start])
|
||||||
visited = {start}
|
visited = {start}
|
||||||
parent = {}
|
parent = {}
|
||||||
|
|
@ -18,6 +21,6 @@ class BFS(PathFindingStrategy):
|
||||||
if n not in visited:
|
if n not in visited:
|
||||||
visited.add(n)
|
visited.add(n)
|
||||||
parent[n] = current
|
parent[n] = current
|
||||||
queue.append(n)
|
queue.append(n)
|
||||||
|
|
||||||
return restore(parent, start, exit), len(visited)
|
return restore(parent, start, exit), len(visited)
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
from Strategies.strat import PathFindingStrategy
|
from Strategies.strat import PathFindingStrategy
|
||||||
from Strategies.path import restore
|
from Strategies.path import restore
|
||||||
|
|
||||||
|
|
||||||
class DFS(PathFindingStrategy):
|
class DFS(PathFindingStrategy):
|
||||||
def findPath(self, maze, start, exit):
|
def findPath(self, maze, start, exit):
|
||||||
|
if exit is None:
|
||||||
|
return [], 0
|
||||||
|
|
||||||
stack = [start]
|
stack = [start]
|
||||||
visited = {start}
|
visited = {start}
|
||||||
parent = {}
|
parent = {}
|
||||||
|
|
@ -20,4 +22,4 @@ class DFS(PathFindingStrategy):
|
||||||
parent[n] = current
|
parent[n] = current
|
||||||
stack.append(n)
|
stack.append(n)
|
||||||
|
|
||||||
return restore(parent, start, exit), len(visited)
|
return restore(parent, start, exit), len(visited)
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
def restore(parent, start, exit):
|
def restore(parent, start, exit):
|
||||||
if exit not in parent and start != exit:
|
if exit not in parent and start != exit:
|
||||||
return[]
|
return []
|
||||||
|
|
||||||
path = []
|
path = []
|
||||||
current = exit
|
current = exit
|
||||||
|
|
||||||
while current != start:
|
while current != start:
|
||||||
path.append(current)
|
path.append(current)
|
||||||
current = parent[current]
|
current = parent[current]
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 88 KiB |
File diff suppressed because one or more lines are too long
BIN
pomelovsd/ExitMaze/mermaid.png
Normal file
BIN
pomelovsd/ExitMaze/mermaid.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 914 KiB |
173
pomelovsd/ExitMaze/result maze.md
Normal file
173
pomelovsd/ExitMaze/result maze.md
Normal file
|
|
@ -0,0 +1,173 @@
|
||||||
|
# Структура:
|
||||||
|
- **Описание задачи и выбранных паттернов** (с диаграммой классов из Mermaid).
|
||||||
|
- **Листинги ключевых классов** (можно выборочно) **или ссылка на репозиторий**.
|
||||||
|
- **Результаты экспериментов** (таблицы, графики).
|
||||||
|
- **Анализ эффективности алгоритмов и применимости паттернов**.
|
||||||
|
- **Выводы: как ООП и паттерны помогли сделать код гибким и расширяемым. Что было бы сложно изменить без них**.
|
||||||
|
### Выводы:
|
||||||
|
#### 1) **Описание задачи и выбранных паттернов**
|
||||||
|
![[mermaid.png]]
|
||||||
|
>Диаграмма классов
|
||||||
|
|
||||||
|
| Паттерн | Реализация в проекте | Обоснование |
|
||||||
|
| ------------ | --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| **Builder** | `MazeBuilders` (интерфейс)<br>`TextFileMazeBuilder` | Создание лабиринта из текстового файла.<br>Позволяя легко добавить другие форматы без изменения `Maze` |
|
||||||
|
| **Strategy** | `PathFindingStrategy` (интерфейс)<br>`BFS`<br>`DFS`<br>`AStar` | Алгоритмы поиска пути взаимозаменяемы<br>Strategy позволяет переключать их через `MazeSolver.setStrategy()` и добавлять новые (например, Дейкстра) без изменения кода |
|
||||||
|
| **Observer** | `Observer` (интерфейс)<br>`ConsoleView` | Отделяет визуализацию от логики поиска<br>`MazeSolver` может уведомлять подписчиков о событиях (начало/конец поиска), а `ConsoleView` реагирует на них<br>Легко добавить другие виды отображения (GUI, лог-файл) |
|
||||||
|
| **Command** | `Command` (интерфейс)<br>`Observer` (интерфейс)<br>`MoveCommand`<br>`ConsoleView` | Обеспечивает пошаговое наблюдение и отслеживание с возможностью отмены |
|
||||||
|
| | | |
|
||||||
|
|
||||||
|
#### 2) **Листинги ключевых классов**:
|
||||||
|
**Core:**
|
||||||
|
```python
|
||||||
|
class Cell:
|
||||||
|
|
||||||
|
def __init__(self, x = 0, y = 0, isWall = False, isStart = False, isExit = False):
|
||||||
|
|
||||||
|
self.x = x
|
||||||
|
|
||||||
|
self.y = y
|
||||||
|
|
||||||
|
self.isWall = isWall
|
||||||
|
|
||||||
|
self.isStart = isStart
|
||||||
|
|
||||||
|
self.isExit = isExit
|
||||||
|
|
||||||
|
# Возращает True, если посаседству стена
|
||||||
|
|
||||||
|
def isPassable(self):
|
||||||
|
|
||||||
|
return not self.isWall
|
||||||
|
|
||||||
|
class Maze:
|
||||||
|
|
||||||
|
def __init__(self, grid, start = None, exit = None):
|
||||||
|
|
||||||
|
self.grid = grid
|
||||||
|
|
||||||
|
self.start = start
|
||||||
|
|
||||||
|
self.exit = exit
|
||||||
|
|
||||||
|
self.height = len(grid)
|
||||||
|
|
||||||
|
self.width = len(grid[0]) if grid else 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Создание новой ячейки
|
||||||
|
|
||||||
|
def getCell(self, x, y):
|
||||||
|
|
||||||
|
if 0 <= x < self.height and 0 <= y < self.width:
|
||||||
|
|
||||||
|
return self.grid[x][y]
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Ищет соседние проходимые клетки
|
||||||
|
|
||||||
|
def getNeighbors(self, cell):
|
||||||
|
|
||||||
|
directions = [(0,1),(1,0),(0,-1),(-1,0)]
|
||||||
|
|
||||||
|
result = []
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for dx, dy in directions:
|
||||||
|
|
||||||
|
nx, ny = cell.x + dx, cell.y + dy
|
||||||
|
|
||||||
|
neighbor = self.getCell(nx, ny)
|
||||||
|
|
||||||
|
if neighbor and neighbor.isPassable():
|
||||||
|
|
||||||
|
result.append(neighbor)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return result
|
||||||
|
```
|
||||||
|
**Builder:**
|
||||||
|
```python
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
|
class MazeBuilders(ABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
|
||||||
|
def build_from_file(self, filename):
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from Core.Cell import Cell
|
||||||
|
|
||||||
|
from Core.Maze import Maze
|
||||||
|
|
||||||
|
from Builder.BuilderInterface import MazeBuilders
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class TextFileMazeBuilder(MazeBuilders):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def build_from_file(self, filename):
|
||||||
|
|
||||||
|
grid = []
|
||||||
|
|
||||||
|
start = None
|
||||||
|
|
||||||
|
exit = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
with open(filename, "r", encoding="utf-8") as f:
|
||||||
|
|
||||||
|
lines = [line.rstrip("\n") for line in f]
|
||||||
|
|
||||||
|
for y, line in enumerate(lines):
|
||||||
|
|
||||||
|
row = []
|
||||||
|
|
||||||
|
for x, ch in enumerate(line):
|
||||||
|
|
||||||
|
cell = Cell(x, y, isWall = (ch == "#"), isStart = (ch == "S"), isExit = (ch == "E"))
|
||||||
|
|
||||||
|
if (ch == "S"):
|
||||||
|
|
||||||
|
start = cell
|
||||||
|
|
||||||
|
if (ch == "E"):
|
||||||
|
|
||||||
|
exit = cell
|
||||||
|
|
||||||
|
row.append(cell)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
grid.append(row)
|
||||||
|
|
||||||
|
return Maze(grid, start, exit)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### 3) **Результаты экспериментов**:
|
||||||
|
![[analysis 3.png]]
|
||||||
|
>График созданный на основе 5 попыток замеров и их усреднения
|
||||||
|
### 4) **Анализ эффективности алгоритмов и применимости паттернов:**
|
||||||
|
- **BFS**
|
||||||
|
Работает медленно и обходит гораздо больше клеток, но гарантирует кратчайший маршерут
|
||||||
|
- **DFS**
|
||||||
|
Работает быстро, но за это приходиться платить не самыми оптимальными путями и количеством обходимых маршерутов(из-за чего растёт время работы)
|
||||||
|
- **A****
|
||||||
|
Является золотой серединой между DFS и BFS ищет маршерут хуже BFS, но лучше чем DFS, обратная зависимость наблюдается в измерении времени
|
||||||
|
#### 5)**Выводы: как ООП и паттерны помогли сделать код гибким и расширяемым? Что было бы сложно изменить без них?**
|
||||||
|
ООП и паттерны помогли систематизировать код и написать единый код для 3 структур, так же легко масштабировать проект, за счёт единых функций применимых для разных алгоритмов
|
||||||
|
Сложно было бы изменить файлы лабиринтов, алгоритмы поиска пути,
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
maze,strategy,time_ms,visited_cells
|
maze,strategy,time_ms,visited_cells,path_length
|
||||||
small,BFS,0.031,8
|
small,BFS,0.379,58,15
|
||||||
small,DFS,0.027,8
|
small,DFS,0.076,31,19
|
||||||
small,A*,0.039,8
|
small,A*,0.298,57,15
|
||||||
medium,BFS,0.033,10
|
medium,BFS,5.197,1263,173
|
||||||
medium,DFS,0.031,10
|
medium,DFS,3.898,1229,173
|
||||||
medium,A*,0.044,10
|
medium,A*,4.109,806,173
|
||||||
large,BFS,0.641,197
|
large,BFS,17.886,3918,269
|
||||||
large,DFS,0.574,197
|
large,DFS,7.197,1905,269
|
||||||
large,A*,1.016,197
|
large,A*,10.377,2040,269
|
||||||
empty,BFS,0.01,2
|
empty,BFS,0.195,64,15
|
||||||
empty,DFS,0.008,2
|
empty,DFS,0.135,64,29
|
||||||
empty,A*,0.01,2
|
empty,A*,0.288,63,15
|
||||||
no_exit,BFS,0.006,1
|
no_exit,BFS,0.007,0,0
|
||||||
no_exit,DFS,0.005,1
|
no_exit,DFS,0.007,0,0
|
||||||
no_exit,A*,0.006,1
|
no_exit,A*,0.007,0,0
|
||||||
|
|
|
||||||
|
Loading…
Reference in New Issue
Block a user