2026-rff_mp/SmirnovVS/docs/data/2-nd-exercize/experiment.py

65 lines
2.5 KiB
Python
Raw Normal View History

2026-09-04 17:37:01 +00:00
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")