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