"""Экспериментальное сравнение алгоритмов""" 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]]: """Запуск эксперимента на одном лабиринте""" try: maze = self.builder.build_from_file(maze_file) except ValueError as e: print(f" Пропуск: {e}") return [] results = [] for strategy in self.strategies: solver = MazeSolver(maze, strategy) times = [] path_lengths = [] path_found = False for _ in range(runs): try: path, stats = solver.solve() times.append(stats.time_ms) path_lengths.append(stats.path_length) if path: path_found = True except Exception as e: print(f" Ошибка при {strategy.name}: {e}") continue if times: 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, 'path_found': path_found }) return results def run_all_experiments(self, maze_files: List[str], runs: int = 5, output_file: str = "results/experiment_results.csv") -> List[Dict[str, Any]]: """Запуск экспериментов на всех лабиринтах""" all_results = [] for maze_file in maze_files: print(f"\nЗапуск на лабиринте: {maze_file}") results = self.run_experiment(maze_file, runs) for r in results: status = "✓" if r['path_found'] else "✗" print(f" {r['strategy']}: {r['avg_time_ms']:.3f} мс, путь: {r['path_length']} {status}") if results: all_results.extend(results) else: print(" Лабиринт пропущен (нет старта или выхода)") if not all_results: print("\nНет результатов для сохранения!") return [] # Сохранение в CSV 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