2026-rff_mp/smirnovad/lab2/docs/data/experiment.py
2026-05-17 16:50:47 +03:00

75 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import csv
import os
import statistics
from maze_builder import TextFileMazeBuilder
from maze_solver import MazeSolver
from strategies import BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy
MAZES_DIR = "mazes"
OUTPUT_CSV = "results.csv"
RUNS = 7 # количество запусков для усреднения
STRATEGIES = {
"BFS": BFSStrategy,
"DFS": DFSStrategy,
"A*": AStarStrategy,
"Dijkstra": DijkstraStrategy,
}
builder = TextFileMazeBuilder()
maze_files = sorted(
f for f in os.listdir(MAZES_DIR) if f.endswith(".txt")
)
rows = []
for maze_file in maze_files:
maze_name = maze_file.replace(".txt", "")
filepath = os.path.join(MAZES_DIR, maze_file)
try:
maze = builder.build_from_file(filepath)
except ValueError as e:
print(f" [!] Пропуск {maze_file}: {e}")
continue
print(f"\n{'='*50}")
print(f"Лабиринт: {maze_name} ({maze.width}×{maze.height})")
for strat_name, StratClass in STRATEGIES.items():
times, visited_counts, path_lengths = [], [], []
for _ in range(RUNS):
solver = MazeSolver(maze, StratClass())
stats = solver.solve()
times.append(stats.time_ms)
visited_counts.append(stats.visited_cells)
path_lengths.append(stats.path_length)
avg_time = statistics.mean(times)
avg_visited = statistics.mean(visited_counts)
avg_path = statistics.mean(path_lengths)
print(f" {strat_name:10s} | время: {avg_time:.4f} мс | "
f"посещено: {avg_visited:.1f} | длина пути: {avg_path:.1f}")
rows.append({
"лабиринт": maze_name,
"стратегия": strat_name,
"время_мс": round(avg_time, 6),
"посещено_клеток": round(avg_visited, 1),
"длина_пути": round(avg_path, 1),
})
# Сохраняем CSV
with open(OUTPUT_CSV, "w", newline="", encoding="utf-8") as csvfile:
fieldnames = ["лабиринт", "стратегия", "время_мс", "посещено_клеток", "длина_пути"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(rows)
print(f"\n✓ Результаты сохранены в {OUTPUT_CSV}")