import argparse import csv from pathlib import Path from statistics import mean from generate_mazes import generate_all from maze_app import AStarStrategy, BFSStrategy, DFSStrategy, MazeSolver, TextFileMazeBuilder STRATEGIES = (BFSStrategy, DFSStrategy, AStarStrategy) def run_experiment(repeats=7, maze_dir="mazes", output_dir="docs/data"): generate_all(maze_dir) builder = TextFileMazeBuilder() rows = [] for maze_path in sorted(Path(maze_dir).glob("*.txt")): maze = builder.build_from_file(maze_path) for strategy_type in STRATEGIES: for run in range(1, repeats + 1): stats = MazeSolver(maze, strategy_type()).solve() rows.append({ "maze": maze_path.stem, "strategy": stats.strategy, "run": run, "time_ms": stats.time_ms, "visited_cells": stats.visited_cells, "path_length": stats.path_length, "path_found": bool(stats.path), }) output = Path(output_dir) output.mkdir(parents=True, exist_ok=True) raw_path = output / "maze_results_raw.csv" with raw_path.open("w", newline="", encoding="utf-8-sig") as file: writer = csv.DictWriter(file, fieldnames=rows[0].keys()) writer.writeheader() writer.writerows(rows) groups = {} for row in rows: groups.setdefault((row["maze"], row["strategy"]), []).append(row) summary = [] for (maze_name, strategy), values in groups.items(): summary.append({ "maze": maze_name, "strategy": strategy, "mean_time_ms": mean(row["time_ms"] for row in values), "mean_visited_cells": mean(row["visited_cells"] for row in values), "path_length": values[0]["path_length"], "path_found": values[0]["path_found"], }) summary_path = output / "maze_results_summary.csv" with summary_path.open("w", newline="", encoding="utf-8-sig") as file: writer = csv.DictWriter(file, fieldnames=summary[0].keys()) writer.writeheader() writer.writerows(summary) return raw_path, summary_path if __name__ == "__main__": parser = argparse.ArgumentParser(description="Сравнение алгоритмов поиска пути") parser.add_argument("--repeats", type=int, default=7) args = parser.parse_args() print("Результаты:", *run_experiment(args.repeats), sep="\n")