2026-rff_mp/ProninVV/task-2-oop/test.py

135 lines
4.7 KiB
Python
Raw Normal View History

import csv
import time
import os
import matplotlib.pyplot as plt
import numpy as np
from MazeBuilder import TextFileMazeBuilder
from MazeSolver import MazeSolver, SearchStats
from DepthFirstSearch import DFSStrategy
from BreadthFirstSearch import BFSStrategy
from Deikstra import DeikstraFind
from AStarStrategy import AStarStrategy
from ConsoleView import ConsoleView
def run_benchmarks():
files = ["mazes/maze_small.txt", "mazes/maze_empty.txt",
"mazes/maze_no_exit.txt", "mazes/maze_medium.txt", "mazes/maze_large.txt"]
strategies = {
"BFS": BFSStrategy(),
"DFS": DFSStrategy(),
"A*": AStarStrategy(),
"Deikstra": DeikstraFind()
}
view = ConsoleView()
NUM_RUNS = 5
results = []
print("Запуск экспериментов...")
for file in files:
if not os.path.exists(file):
print(f"Файл {file} не найден. Пропуск.")
continue
for name, strategy in strategies.items():
total_time = 0.0
visited_counts = []
path_lengths = []
print(f" работает {name}")
for _ in range(NUM_RUNS):
# Пересоздаем лабиринт
builder = TextFileMazeBuilder()
builder.buildFromFile(file)
maze = builder.maze
solver = MazeSolver(maze, strategy)
solver.addObserver(view)
stats = solver.solve()
total_time += stats.execution_time
visited_counts.append(stats.visited_count)
path_lengths.append(stats.path_length)
# средние значения
avg_time = total_time / NUM_RUNS
avg_visited = int(np.mean(visited_counts))
avg_path = int(np.mean(path_lengths))
results.append({
"лабиринт": file,
"стратегия": name,
"время_мс": round(avg_time, 4),
"посещено_клеток": avg_visited,
"длина_пути": avg_path
})
# Запись в CSV
csv_file = "results/maze_benchmark_results.csv"
with open(csv_file, mode="w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=[
"лабиринт", "стратегия", "время_мс", "посещено_клеток", "длина_пути"])
writer.writeheader()
writer.writerows(results)
print(f"Результаты успешно сохранены в {csv_file}")
return results
# Построение графиков
def plot_results(results):
print("Генерация графиков...")
mazes = sorted(list(set(r["лабиринт"] for r in results)))
strategies = ["BFS", "DFS", "A*"]
# График Количество посещенных клеток
fig, ax = plt.subplots(figsize=(10, 6))
x = np.arange(len(mazes))
width = 0.25
for i, strat in enumerate(strategies):
visited = [next(r["посещено_клеток"] for r in results if r["лабиринт"]
== m and r["стратегия"] == strat) for m in mazes]
ax.bar(x + i*width, visited, width, label=strat)
ax.set_ylabel('Количество посещенных клеток')
ax.set_title('Сравнение эффективности обхода лабиринтов (меньше = лучше)')
ax.set_xticks(x + width)
ax.set_xticklabels(mazes, rotation=15)
ax.legend()
plt.tight_layout()
plt.savefig("results/benchmark_visited_cells.png", dpi=200)
plt.savefig("results/benchmark_visited_cells.eps", dpi=200)
plt.close()
# График Время выполнения
fig, ax = plt.subplots(figsize=(10, 6))
for i, strat in enumerate(strategies):
times = [next(r["время_мс"] for r in results if r["лабиринт"]
== m and r["стратегия"] == strat) for m in mazes]
ax.bar(x + i*width, times, width, label=strat)
ax.set_ylabel('Время выполнения (мс)')
ax.set_title('Сравнение времени работы алгоритмов')
ax.set_xticks(x + width)
ax.set_xticklabels(mazes, rotation=15)
ax.legend()
plt.tight_layout()
plt.savefig("results/benchmark_execution_time.png", dpi=200)
plt.savefig("results/benchmark_execution_time.eps", dpi=200)
plt.close()
print("Графики сохранены в текущую директорию.")
if __name__ == "__main__":
data = run_benchmarks()
plot_results(data)