[2] 2-nd-exersize #246

Merged
kit8nino merged 7 commits from SavelevMI/2026-rff_mp:2-nd-exersize into develop 2026-05-30 11:54:54 +00:00
Showing only changes of commit e12d37f94b - Show all commits

View File

@ -0,0 +1,123 @@
# Экспериментальное сравнение алгоритмов поиска пути
# Запуск: 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()