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