65 lines
2.5 KiB
Python
65 lines
2.5 KiB
Python
|
|
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")
|