2026-rff_mp/SobolevNS/docs/data/task2_maze/experiment.py
2026-05-22 13:46:32 +03:00

83 lines
3.1 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.

"""
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()