2026-rff_mp/komissarovgo/docs2/data2/maze_lab/experiments.py

65 lines
2.2 KiB
Python

import csv
from pathlib import Path
from typing import List, Dict, Any
from builders import TextFileMazeBuilder
from solver import MazeSolver
from strategies import BFSStrategy, DFSStrategy, AStarStrategy
class ExperimentRunner:
def __init__(self):
self.builder = TextFileMazeBuilder()
self.strategies = [
BFSStrategy(),
DFSStrategy(),
AStarStrategy()
]
def run_experiment(self, maze_file: str, runs: int = 5) -> List[Dict[str, Any]]:
maze = self.builder.build_from_file(maze_file)
results = []
for strategy in self.strategies:
solver = MazeSolver(maze, strategy)
times = []
path_lengths = []
for _ in range(runs):
path, stats = solver.solve()
times.append(stats.time_ms)
path_lengths.append(stats.path_length)
results.append({
'maze': Path(maze_file).stem,
'strategy': strategy.name,
'avg_time_ms': sum(times) / runs,
'min_time_ms': min(times),
'max_time_ms': max(times),
'path_length': path_lengths[0] if path_lengths else 0
})
return results
def run_all_experiments(self, maze_files: List[str], runs: int = 5,
output_file: str = "results/experiment_results.csv"):
all_results = []
for maze_file in maze_files:
print(f"Запуск на лабиринте: {maze_file}")
results = self.run_experiment(maze_file, runs)
all_results.extend(results)
for r in results:
print(f" {r['strategy']}: {r['avg_time_ms']:.3f} мс, путь: {r['path_length']}")
Path("results").mkdir(exist_ok=True)
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=all_results[0].keys())
writer.writeheader()
writer.writerows(all_results)
print(f"\nРезультаты сохранены в {output_file}")
return all_results