forked from UNN/2026-rff_mp
Реализован класс-оркестратор для тестирования
This commit is contained in:
parent
983ef65bef
commit
9849075a38
13
MusinAA/docs/data/mazeRezults.csv
Normal file
13
MusinAA/docs/data/mazeRezults.csv
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
Алгоритм,Лабиринт,Время (мс),Посещённые клетки,Длинна пути
|
||||||
|
BFS,50x50,3.2134529003087664,720,431
|
||||||
|
BFS,10x10,0.2288821000547614,53,23
|
||||||
|
BFS,5x5,0.035640300302475225,8,7
|
||||||
|
BFS,100x100,11.366462300065905,2495,1171
|
||||||
|
DFS,50x50,1.7320569000730757,747,431
|
||||||
|
DFS,10x10,0.0645840002107434,35,31
|
||||||
|
DFS,5x5,0.015984299898264,8,7
|
||||||
|
DFS,100x100,8.414763500331901,3219,1243
|
||||||
|
AStar,50x50,1.8410825001410558,509,455
|
||||||
|
AStar,10x10,0.1062644998455653,23,23
|
||||||
|
AStar,5x5,0.03181890006089816,8,7
|
||||||
|
AStar,100x100,6.592893099877983,1286,1171
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
from task2.consoleView import ConsoleView
|
|
||||||
from task2.mazeBuilder import TextFileMazeBuilder
|
|
||||||
from task2.mazeSolver import MazeSolver
|
|
||||||
|
|
||||||
from task2.strategyObjects.BFS import BFS
|
|
||||||
from task2.strategyObjects.DFS import DFS
|
|
||||||
from task2.strategyObjects.AStar import AStar
|
|
||||||
|
|
||||||
console = ConsoleView()
|
|
||||||
builder = TextFileMazeBuilder()
|
|
||||||
solver = MazeSolver(BFS())
|
|
||||||
solver.attach(console)
|
|
||||||
|
|
||||||
maze = builder.buildFromFile("task2/mazeExamples/low.txt")
|
|
||||||
console.maze = maze # хмммм
|
|
||||||
solver.setMaze(maze)
|
|
||||||
|
|
||||||
input()
|
|
||||||
|
|
||||||
solver.solve()
|
|
||||||
1
MusinAA/task2/.gitignore
vendored
Normal file
1
MusinAA/task2/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
maze_generator.py
|
||||||
100
MusinAA/task2/mazeExamples/maze_100x100.txt
Normal file
100
MusinAA/task2/mazeExamples/maze_100x100.txt
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
S # # # # # # # # # # # # # #
|
||||||
|
# # ####### ### # ##### # # # # # # # # ### # # ### # # ### # ##### # ##### ### ### ### ######### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ##### ##### ### ### ##### ##### ####### # ##### ####### # # # ####### ##### # ######### ### ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # ##### # # ##### # # ####### # ### ##### # # # # ### ### ######### ##### # ##### # # ### ### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### # # # ### ### ####### # # ### ######### ### ### ### ### # # # # # ### ##### # # ### # # # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ### # ##### ##### ######### ######### # ##### ### # ####### # ##### ### ####### # ### # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ################# # ### # # # # # ########### ############# # ##### ##### ##### # ##### ### # ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ### # ### ####### # ##### ######### ### # ### ### # ####### # ### ####### ##### # ### # # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
######### ### ### # ### # ####### ##### # # # ####### ##### ####### # ########### ####### #########
|
||||||
|
# # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## # ####### ### ##### # ####### ### # # # # ##### ### ########### # # # ### # ##### # # ### ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # # ########### ######### # ### # # ### ### ####### ### # # # # ##### # ### ##### # # ### ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## ##### # # # # # ### # ### ##### # # # ##### # ### # ### # # # # # # # ##### ### ####### # ### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### ### # # # # # ######### ### ### ### # ##### ##### ### # ##### # ######### ############# ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ##### # # ### ### ##### # ### ### ##### # # ### # ##### ##### ### ### # ##### ### # # ### # # ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # ####### ####### ### ### ######### ### # # ##### # ### ########### ### # ### ####### ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
################### # # # # ### # # # ######### # # ### ############### # ### ##### ### ### ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### # # ### # # ### # ####### # # ##### # # ### ##### # ####### # # # ######### # ######### #####
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
#### # # ### # # ### # ### ####### ##### # # ### # # ##### # # ####### # # # ##### ### # # ####### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## # # # # ### ### # ### ### # # # ### # ####### ### # ########### # ##### ##### # # ### ### ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
########### # # ########### ### # # # # # ### # # ### # ####### # ######### # # ### # ######### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
######## # # # ### # ########### # # ####### ### # # # ####### ### # # # ### # ### ######### # # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### ##### ### # # # ####### ### ### # # # # ############# # ##### # ### ##### ######### ### ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ### # ### # ##### # # # ### # # # ### # ### ### # # # # ########### ####### # ##### ####### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## ####### # ##### # ### ### # # # # # # # ####### ### # # # # # # # # ### # # ##### # # # # ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # # # ##### ####### # ### # ### ### ####### # # ### ####### ### ####### # ### ####### # # # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ##### ##### # # ### ### # ######### ### ### ### ### ####### ##### # ######### ##### # ### # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # ####### # ##### ### # # # # # ### ### # ### ### ######### # ####### # ####### ### ######### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
######### # ### ### # # # # # # ####### ##### ### # # ##### # ### # # ####### # # # ### # # # # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## # # # ### ##### # ######### # # ####### ### ### # ##### ######### # # # ####### ### # # # # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ######### ####### # # ######### # # ### ### ### ##### ### # ########### ######### # # # ### ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## ######### # ### # ####### ### # ### ### # # ####### # ### ##### ### # # ### # ### ##### # # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # ### ### ### # # # ##### # ### # ### ### # # # ####### ##### ### ### # ##### # ##### # ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # ### ### # ### # ######### # ######### # ### # # # ### ##### ### # ### # # ### # ##### ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### # ### ##### ####### ### # ##### # # # ### ### # ##### # # ### # ####### ##### # # # ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### # ### ######### # ##### ### # ### # # # ############# ### ### # ##### # ### ######### # ### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## # # # ### ##### # ##### # ### ### # # # ### # # ######### # # ##### ### ####### ### # ######### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ############### ### ####### ### # ### ####### # # # # ######### # ### # # # ##### ##### # # #####
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### # # ### # ### ######### # ######### # # ### # # ####### # ########### # # # ##### ####### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## # ####### ### # # # ############# ### ### ### ### ##### # # ### ########### ##### # ### ### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ### # # # ##### ### # # ##### ####### # # ### ### # # ##### # # ####### ##### # # # # # ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
###### ##### ### # ### ### # # ########### # # # ##### # ### ##### # # ### ######### ### ##### # ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # # # ### ####### ######### # # ######### ### # ##### ##### ##### ### # # # # # # ### ####### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
#### # ##### # # # ##### ### # ### # ##### ### # ##### ### ######### ### ### ########### # # ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
######### ##### # ####### # # # ##### # ### # # # # ####### ##### # # ### ### # # # # ### # # ### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# ### # ##### # # # ############### ### ######### ### # ##### # # ######### # ### # ### # # # # ###
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # ####### # ### # ##### ##### # # ### # ### # # ##### # ### # # # ####### # ##### # # # ### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### # ### # # # ##### ##### # # # ### ### # # # # ######### # ########### # # ##### ####### # # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
## # # # # ##### # ### ####### ########### ### # # ####### # # ##### # # # ### ##### ##### # ##### #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
### ##### ########### # ### # # ####### # # # ############# # ### ### # ### ######### # ### ### # #
|
||||||
|
# # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
##### # # # ##### ####### # ### # # ##### # ### ####### ######### # ########### ### # ######### # #
|
||||||
|
# # # # # # # # #
|
||||||
|
################################################################################################## E
|
||||||
10
MusinAA/task2/mazeExamples/maze_10x10.txt
Normal file
10
MusinAA/task2/mazeExamples/maze_10x10.txt
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
S #
|
||||||
|
### ### #
|
||||||
|
# # #
|
||||||
|
## # # ###
|
||||||
|
# # #
|
||||||
|
####### #
|
||||||
|
# #
|
||||||
|
## # #####
|
||||||
|
|
||||||
|
######## E
|
||||||
50
MusinAA/task2/mazeExamples/maze_50x50.txt
Normal file
50
MusinAA/task2/mazeExamples/maze_50x50.txt
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
S # # # #
|
||||||
|
####### ### # # ########### ##### # ##### ##### #
|
||||||
|
# # # # # # # # # #
|
||||||
|
## # # ### ####### ##### ####### # ### ######### #
|
||||||
|
# # # # # # # # # # # # #
|
||||||
|
####### # # # # ### ##### # ### ### # # # # ### #
|
||||||
|
# # # # # # # # # # # # # # # # #
|
||||||
|
# ### # ### # ### ### # # ### ### ####### # # ###
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# # ############# # ### ### # ######### # # ### #
|
||||||
|
# # # # # # # # #
|
||||||
|
########### ########### # ##### ### ### # # # ###
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# # ####### # ### # ##### ### ### ### ### # # # #
|
||||||
|
# # # # # # # # # # # # # # # #
|
||||||
|
###### ### ### # # # # # # # ### ### ##### # # # #
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
### # # ######### ### # # # # ####### ##### # # #
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
### ### # ##### # # ######### # # # # ##### # # #
|
||||||
|
# # # # # # # # # # # #
|
||||||
|
## # ######### # # ### ### # ### ######### ##### #
|
||||||
|
# # # # # # # # # # # #
|
||||||
|
##### # ### # ### ##### # # # ####### ##### # # #
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
## # ##### # # ##### ##### ### ### # ### # # # ###
|
||||||
|
# # # # # # # # # # # # #
|
||||||
|
##### # ### # # ##### ### # ### ######### # #####
|
||||||
|
# # # # # # # # # # #
|
||||||
|
# ####### ######### ### ####### # # ####### ### #
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# # ####### # # ##### # # ### ### # # # # ##### #
|
||||||
|
# # # # # # # # # # # # # # # #
|
||||||
|
# ##### # ####### # # # # # ### # ### # # # ### #
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
# ########### # ### ####### ### # ### # # # # # #
|
||||||
|
# # # # # # # # # # # # #
|
||||||
|
# # ####### ##### ########### ##### # # ##### # #
|
||||||
|
# # # # # # # # # # #
|
||||||
|
### ### ### # ############### # # # ##### ### ###
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# ### ### # ### ##### # # # # # ##### # ### # # #
|
||||||
|
# # # # # # # # # # # # # #
|
||||||
|
# # ####### # ### ######### ######### ### # # # #
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
##### # ####### # # # ### # # # # # ### ### # # #
|
||||||
|
# # # # # # # # # # # # # # #
|
||||||
|
## ### ##### ####### ### # # ### ##### # ### ### #
|
||||||
|
# # # #
|
||||||
|
################################################ E
|
||||||
|
|
@ -8,6 +8,7 @@ from task2.strategyObjects.BFS import BFS
|
||||||
import time
|
import time
|
||||||
|
|
||||||
class SearchStats:
|
class SearchStats:
|
||||||
|
maze_name:str = "None"
|
||||||
"""Время выполнения в миллисекундах, количество посещённых клеток, длина найденного пути"""
|
"""Время выполнения в миллисекундах, количество посещённых клеток, длина найденного пути"""
|
||||||
def __init__(self, path: list[Cell]|None, duration:float, visited_cells:int, path_len:int, strategy_name:str):
|
def __init__(self, path: list[Cell]|None, duration:float, visited_cells:int, path_len:int, strategy_name:str):
|
||||||
self.duration = duration
|
self.duration = duration
|
||||||
|
|
@ -15,6 +16,15 @@ class SearchStats:
|
||||||
self.path_len = path_len
|
self.path_len = path_len
|
||||||
self.path = path
|
self.path = path
|
||||||
self.strategy_name = strategy_name
|
self.strategy_name = strategy_name
|
||||||
|
|
||||||
|
def toDict(self,):
|
||||||
|
return {
|
||||||
|
"strategy_name" : self.strategy_name,
|
||||||
|
"maze_name" : self.maze_name,
|
||||||
|
"duration" : self.duration,
|
||||||
|
"visited_cells" : self.visited_cells,
|
||||||
|
"path_len" : self.path_len
|
||||||
|
}
|
||||||
|
|
||||||
class MazeSolver(Subject):
|
class MazeSolver(Subject):
|
||||||
"""
|
"""
|
||||||
|
|
@ -46,7 +56,7 @@ class MazeSolver(Subject):
|
||||||
|
|
||||||
t_start = time.perf_counter()
|
t_start = time.perf_counter()
|
||||||
path = self.strategy.findPath(self._maze, self._maze.startCell, self._maze.endCell)
|
path = self.strategy.findPath(self._maze, self._maze.startCell, self._maze.endCell)
|
||||||
duration = time.perf_counter() - t_start
|
duration = (time.perf_counter() - t_start) * 1000
|
||||||
|
|
||||||
path_len = len(path.array) if path.array else 0
|
path_len = len(path.array) if path.array else 0
|
||||||
strategy_name = self.getStrategyName()
|
strategy_name = self.getStrategyName()
|
||||||
|
|
|
||||||
83
MusinAA/task2/tester.py
Normal file
83
MusinAA/task2/tester.py
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
from task2.mazeBuilder import MazeBuilder
|
||||||
|
from task2.mazeObjects.maze import Maze
|
||||||
|
from task2.mazeSolver import MazeSolver, SearchStats
|
||||||
|
|
||||||
|
from task2.strategyObjects.BFS import BFS
|
||||||
|
from task2.strategyObjects.DFS import DFS
|
||||||
|
from task2.strategyObjects.AStar import AStar
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import os
|
||||||
|
|
||||||
|
TEST_ITERATIONS = 10
|
||||||
|
|
||||||
|
class Tester():
|
||||||
|
"""Для каждого лабиринта и каждой стратегии запустить solve() 5–10 раз,
|
||||||
|
усреднить время, количество посещённых клеток, длину пути.
|
||||||
|
Записать результаты в CSV:
|
||||||
|
лабиринт,стратегия,время_мс,посещено_клеток,длина_пути."""
|
||||||
|
result:list[SearchStats]
|
||||||
|
def __init__(self, builder:MazeBuilder, writefile:str):
|
||||||
|
self.builder = builder
|
||||||
|
self.writefile = writefile
|
||||||
|
|
||||||
|
def setTestingDirectory(self, directory:str):
|
||||||
|
if directory[-1] != "/":
|
||||||
|
directory += "/"
|
||||||
|
self._directory = directory
|
||||||
|
|
||||||
|
def _getMazes(self) -> list[Maze]:
|
||||||
|
arr = []
|
||||||
|
files = os.listdir(self._directory)
|
||||||
|
only_txt_files = [f for f in files if os.path.isfile(os.path.join(self._directory, f)) and os.path.splitext(f)[1] == ".txt"]
|
||||||
|
|
||||||
|
for f in only_txt_files:
|
||||||
|
arr.append(builder.buildFromFile(os.path.join(self._directory, f)))
|
||||||
|
return arr
|
||||||
|
|
||||||
|
def _solveAvg(self, solver: MazeSolver):
|
||||||
|
avgtime = 0
|
||||||
|
for i in range(TEST_ITERATIONS):
|
||||||
|
result = solver.solve()
|
||||||
|
# Всё кроме времени будет одинаковым
|
||||||
|
avgtime += result.duration/TEST_ITERATIONS
|
||||||
|
result.duration = avgtime
|
||||||
|
return result
|
||||||
|
|
||||||
|
def saveCSV(self):
|
||||||
|
rows = []
|
||||||
|
for r in self.result:
|
||||||
|
r = r.toDict()
|
||||||
|
row = (r["strategy_name"],
|
||||||
|
r["maze_name"],
|
||||||
|
r["duration"],
|
||||||
|
r["visited_cells"],
|
||||||
|
r["path_len"]
|
||||||
|
)
|
||||||
|
rows.append(row)
|
||||||
|
with open(self.writefile, "w", newline="") as f:
|
||||||
|
writer = csv.writer(f)
|
||||||
|
writer.writerow(["Алгоритм", "Лабиринт", "Время (мс)", "Посещённые клетки", "Длинна пути"])
|
||||||
|
writer.writerows(rows)
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
self.result = []
|
||||||
|
arr = self._getMazes()
|
||||||
|
for algoritm in (BFS, DFS, AStar):
|
||||||
|
solver = MazeSolver(algoritm()) # это прикол
|
||||||
|
for maze in arr:
|
||||||
|
solver.setMaze(maze)
|
||||||
|
self.result.append(self._solveAvg(solver))
|
||||||
|
self.result[-1].maze_name = f"{maze.height}x{maze.width}"
|
||||||
|
return self.result
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
from task2.mazeBuilder import TextFileMazeBuilder
|
||||||
|
|
||||||
|
builder = TextFileMazeBuilder()
|
||||||
|
tester = Tester(builder, "docs/data/mazeRezults.csv")
|
||||||
|
tester.setTestingDirectory("task2/mazeExamples")
|
||||||
|
tester.test()
|
||||||
|
tester.saveCSV()
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user