This repository has been archived on 2026-10-01. You can view files and clone it, but cannot push or open issues or pull requests.
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 Permalink 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()