forked from UNN/2026-rff_mp
83 lines
3.1 KiB
Python
83 lines
3.1 KiB
Python
"""
|
||
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()
|