123 lines
3.9 KiB
Python
123 lines
3.9 KiB
Python
|
|
# Экспериментальное сравнение алгоритмов поиска пути
|
|||
|
|
# Запуск: 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()
|