2026-rff_mp/MusinAA/task2/tester.py

84 lines
3.0 KiB
Python
Raw Normal View History

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() 510 раз,
усреднить время, количество посещённых клеток, длину пути.
Записать результаты в 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(self._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 = maze.name
return self.result
if __name__ == "__main__":
exit()
from task2.mazeBuilder import TextFileMazeBuilder
builder = TextFileMazeBuilder()
tester = Tester(builder, "docs/data/task2/results.csv")
tester.setTestingDirectory("task2/mazeExamples")
tester.test()
tester.saveCSV()