2026-rff_mp/SobolevNS/docs/data/task2_maze/experiment.py

83 lines
3.1 KiB
Python
Raw Normal View History

2026-05-22 10:46:32 +00:00
"""
experiment.py - экспериментальное сравнение стратегий поиска пути.
Для каждого лабиринта × стратегии:
- запускаем solve() TRIALS раз
- усредняем время в мс, фиксируем число посещённых клеток и длину пути
- сохраняем в docs/data/results.csv
"""
import csv
import os
from maze_solver import (
TextFileMazeBuilder, MazeSolver,
BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy,
)
TRIALS = 7
MAZES = [
("small_10x10", "mazes/small_10x10.txt"),
("medium_51x51", "mazes/medium_51x51.txt"),
("large_101x101", "mazes/large_101x101.txt"),
("empty_30x30", "mazes/empty_30x30.txt"),
("nopath_15x15", "mazes/nopath_15x15.txt"),
("weighted_31x31", "mazes/weighted_31x31.txt"),
("weighted_choice","mazes/weighted_choice.txt"),
]
STRATEGY_CLASSES = [BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy]
OUT_CSV = "docs/data/results.csv"
def main():
os.makedirs(os.path.dirname(OUT_CSV), exist_ok=True)
builder = TextFileMazeBuilder()
rows = [["лабиринт", "стратегия", "trial",
"время_мс", "посещено_клеток", "длина_пути", "стоимость_пути"]]
summary = []
for maze_name, maze_path in MAZES:
maze = builder.build_from_file(maze_path)
print(f"\n## {maze_name} ({maze.width}x{maze.height})")
for cls in STRATEGY_CLASSES:
times, visited_vals, path_vals, cost_vals = [], [], [], []
for trial in range(TRIALS):
solver = MazeSolver(maze, cls())
stats = solver.solve()
cost = sum(c.weight for c in stats["path"])
times.append(stats["elapsed_ms"])
visited_vals.append(stats["visited"])
path_vals.append(stats["path_length"])
cost_vals.append(cost)
rows.append([maze_name, stats["strategy"], trial + 1,
f"{stats['elapsed_ms']:.4f}",
stats["visited"], stats["path_length"], cost])
mean_t = sum(times) / TRIALS
print(f" {cls.name:9s} t_avg={mean_t:7.3f} ms "
f"visited={visited_vals[0]:5d} "
f"path={path_vals[0]:5d} cost={cost_vals[0]:5d}")
summary.append((maze_name, cls.name, mean_t,
visited_vals[0], path_vals[0], cost_vals[0]))
rows.append([])
rows.append(["--- СРЕДНИЕ ---"])
rows.append(["лабиринт", "стратегия", "среднееремя_мс",
"посещено_клеток", "длина_пути", "стоимость_пути"])
for r in summary:
rows.append([r[0], r[1], f"{r[2]:.4f}", r[3], r[4], r[5]])
with open(OUT_CSV, "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(rows)
print(f"\nГотово. Результаты записаны в {OUT_CSV}")
if __name__ == "__main__":
main()