2026-rff_mp/SavelevMI/docs/data/2-nd-exersize/experiment.py

123 lines
3.9 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.

# Экспериментальное сравнение алгоритмов поиска пути
# Запуск: python3 experiment.py
import csv
import time
from maze_core import TextFileMazeBuilder
from pathfinding import BFSStrategy, DFSStrategy, AStarStrategy
class MazeSolverExperiment:
def __init__(self, maze):
self._maze = maze
self._strategy = None
def set_strategy(self, strategy):
self._strategy = strategy
def solve(self):
if self._strategy is None:
return None
start_time = time.perf_counter()
path = self._strategy.find_path(self._maze, self._maze.start, self._maze.exit)
end_time = time.perf_counter()
time_ms = (end_time - start_time) * 1000
return {
'time_ms': time_ms,
'visited_cells': self._strategy.get_visited_count(),
'path_length': len(path)
}
def run_experiment(maze_file, strategy, runs=5):
builder = TextFileMazeBuilder()
maze = builder.build_from_file(maze_file)
total_time = 0
total_visited = 0
total_length = 0
for _ in range(runs):
solver = MazeSolverExperiment(maze)
solver.set_strategy(strategy)
stats = solver.solve()
if stats:
total_time += stats['time_ms']
total_visited += stats['visited_cells']
total_length += stats['path_length']
return {
'time_ms': total_time / runs,
'visited_cells': total_visited / runs,
'path_length': total_length / runs
}
def main():
# Список лабиринтов для тестирования
mazes = [
("maze1.txt", "Small (10x6)"),
("maze10x10.txt", "Medium (10x10)"),
("maze20x20.txt", "Large (20x20)"),
("maze_empty.txt", "Empty (15x15)"),
("maze_no_exit.txt", "No exit (10x10)")
]
strategies = [
("BFS", BFSStrategy()),
("DFS", DFSStrategy()),
("AStar", AStarStrategy())
]
results = []
print("=" * 60)
print("ЭКСПЕРИМЕНТАЛЬНОЕ СРАВНЕНИЕ АЛГОРИТМОВ ПОИСКА ПУТИ")
print("=" * 60)
for maze_file, maze_name in mazes:
print(f"\nТестирование: {maze_name} ({maze_file})")
print("-" * 40)
for strat_name, strat in strategies:
try:
stats = run_experiment(maze_file, strat, runs=5)
results.append({
'maze': maze_name,
'strategy': strat_name,
'time_ms': stats['time_ms'],
'visited_cells': stats['visited_cells'],
'path_length': stats['path_length']
})
print(f" {strat_name}: время={stats['time_ms']:.3f}мс, "
f"посещено={stats['visited_cells']:.0f}, "
f"длина пути={stats['path_length']:.0f}")
except Exception as e:
print(f" {strat_name}: ОШИБКА - {e}")
results.append({
'maze': maze_name,
'strategy': strat_name,
'time_ms': -1,
'visited_cells': -1,
'path_length': -1
})
valid_results = [r for r in results if r['time_ms'] >= 0]
with open('experiment_results_2.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['maze', 'strategy', 'time_ms', 'visited_cells', 'path_length'])
writer.writeheader()
writer.writerows(valid_results)
print("\n" + "=" * 60)
print(f"Результаты сохранены в experiment_results_2.csv")
print(f"Всего успешных экспериментов: {len(valid_results)}")
print("=" * 60)
if __name__ == "__main__":
main()