2026-rff_mp/MashinDD/lab2/docs/data/plot_results.py

104 lines
3.5 KiB
Python
Raw Normal View History

2026-05-17 13:50:48 +00:00
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")