forked from UNN/2026-rff_mp
83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
|
|
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()
|
|||
|
|
|