2026-rff_mp/MashinDD/lab2/docs/data/plot_results.py
2026-05-17 16:50:48 +03:00

104 lines
3.5 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.

import csv
import os
try:
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
HAS_MPL = True
except ImportError:
HAS_MPL = False
print("⚠️ matplotlib не установлен: pip install matplotlib\n")
CSV_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'results.csv')
OUT_DIR = os.path.dirname(os.path.abspath(__file__))
COLORS = {'BFS': '#4E9AF1', 'DFS': '#F4845F', 'A*': '#6BCB77'}
STRATEGIES = ['BFS', 'DFS', 'A*']
METRICS = [
('время_мс', 'Среднее время (мс)'),
('посещено_клеток', 'Посещено клеток'),
('длина_пути', 'Длина пути (шагов)'),
]
def load_csv(path):
data = {}
with open(path, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
key = (row['лабиринт'], row['стратегия'])
data[key] = {
'время_мс': float(row['время_мс']),
'посещено_клеток': float(row['посещено_клеток']),
'длина_пути': float(row['длина_пути']),
}
return data
def get_mazes(data):
seen = []
for (maze, _) in data:
if maze not in seen:
seen.append(maze)
return seen
def plot_by_metric(data):
mazes = get_mazes(data)
x = range(len(mazes))
w = 0.25
for metric_key, metric_label in METRICS:
fig, ax = plt.subplots(figsize=(12, 5))
fig.suptitle(f'{metric_label} по лабиринтам', fontweight='bold')
for i, strat in enumerate(STRATEGIES):
vals = [data.get((m, strat), {}).get(metric_key, 0) for m in mazes]
offset = [xi + (i - 1) * w for xi in x]
bars = ax.bar(offset, vals, width=w,
label=strat, color=COLORS[strat], edgecolor='white')
for bar, val in zip(bars, vals):
if val > 0:
ax.text(bar.get_x() + bar.get_width() / 2,
bar.get_height() + max(vals) * 0.01,
f'{val:.1f}', ha='center', va='bottom', fontsize=7)
ax.set_xticks(list(x))
ax.set_xticklabels(mazes, rotation=15, ha='right', fontsize=9)
ax.set_ylabel(metric_label)
ax.legend()
ax.grid(axis='y', alpha=0.3)
safe = metric_key.replace('_', '-')
out = os.path.join(OUT_DIR, f'chart_{safe}.png')
plt.tight_layout()
plt.savefig(out, dpi=150, bbox_inches='tight')
print(f"✅ График сохранён: {out}")
plt.show()
def print_table(data):
print(f"\n{'Лабиринт':<20} {'Алгоритм':<6} "
f"{'Время мс':>10} {'Посещено':>10} {'Путь':>6}")
print('-' * 56)
for (maze, strat), vals in sorted(data.items()):
print(f"{maze:<20} {strat:<6} "
f"{vals['время_мс']:>10.3f} "
f"{vals['посещено_клеток']:>10.0f} "
f"{vals['длина_пути']:>6.0f}")
if __name__ == '__main__':
if not os.path.exists(CSV_PATH):
print(f"❌ Файл не найден: {CSV_PATH}")
print(" Сначала запустите: python benchmark.py")
exit(1)
data = load_csv(CSV_PATH)
print_table(data)
if HAS_MPL:
plot_by_metric(data)
else:
print("\n💡 Установите matplotlib: pip install matplotlib")