2026-rff_mp/konnovaea/lab2/maze_experiments.py

154 lines
5.1 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 time
import csv
import os
from maze_solver import TextFileMazeBuilder, BFSStrategy, DFSStrategy, AStarStrategy, MazeSolver
def save_maze_to_file(maze, filename):
with open(filename, 'w') as f:
for row in maze:
f.write(''.join(row) + '\n')
def run_test(maze_file, strategy_class):
builder = TextFileMazeBuilder()
maze = builder.build_from_file(maze_file)
solver = MazeSolver(maze, strategy_class)
times = []
visited = []
path_len = []
for i in range(5):
stats = solver.solve()
times.append(stats.time_ms)
visited.append(stats.visited_count)
path_len.append(stats.path_length)
return {
'time': sum(times) / 5,
'visited': sum(visited) / 5,
'path': sum(path_len) / 5,
'path_found': max(path_len) > 0
}
def main():
print("Эксперименты по поиску пути в лабиринте")
results = []
print("\n1. Простой лабиринт (10x10)")
simple = [
"#######",
"#S #",
"# ### #",
"# E #",
"#######"
]
with open('simple.txt', 'w') as f:
for line in simple:
f.write(line + '\n')
for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]:
res = run_test('simple.txt', strategy)
print(f"{name}: время={res['time']:.3f}мс, посещено={res['visited']:.0f}, путь={res['path']:.0f}")
results.append(['Простой', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)])
print("\n2. Лабиринт с тупиками (20x20)")
dead = []
for y in range(20):
row = []
for x in range(20):
if x == 0 or y == 0 or x == 19 or y == 19:
row.append('#')
elif (x == 5 and y > 5 and y < 15) or (y == 5 and x > 5 and x < 15):
row.append('#')
else:
row.append(' ')
dead.append(row)
dead[1][1] = 'S'
dead[18][18] = 'E'
with open('dead.txt', 'w') as f:
for row in dead:
f.write(''.join(row) + '\n')
for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]:
res = run_test('dead.txt', strategy)
print(f"{name}: время={res['time']:.3f}мс, посещено={res['visited']:.0f}, путь={res['path']:.0f}")
results.append(['С тупиками', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)])
print("\n3. Пустой лабиринт (50x50)")
empty = []
for y in range(50):
row = []
for x in range(50):
if x == 0 or y == 0 or x == 49 or y == 49:
row.append('#')
else:
row.append(' ')
empty.append(row)
empty[1][1] = 'S'
empty[48][48] = 'E'
with open('empty.txt', 'w') as f:
for row in empty:
f.write(''.join(row) + '\n')
for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]:
res = run_test('empty.txt', strategy)
print(f"{name}: время={res['time']:.3f}мс, посещено={res['visited']:.0f}, путь={res['path']:.0f}")
results.append(['Пустой', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)])
print("\n4. Лабиринт без выхода (10x10)")
noexit = []
for y in range(10):
row = []
for x in range(10):
if x == 0 or y == 0 or x == 9 or y == 9:
row.append('#')
else:
row.append('#')
noexit.append(row)
noexit[1][1] = 'S'
noexit[8][8] = 'E'
with open('noexit.txt', 'w') as f:
for row in noexit:
f.write(''.join(row) + '\n')
for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]:
try:
res = run_test('noexit.txt', strategy)
if res['path_found']:
print(f"{name}: путь найден! длина={res['path']:.0f}")
results.append(['Без выхода', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)])
else:
print(f"{name}: путь не найден (корректно)")
results.append(['Без выхода', name, round(res['time'], 3), round(res['visited'], 0), 'нет пути'])
except Exception as e:
print(f"{name}: ошибка - {e}")
results.append(['Без выхода', name, 0, 0, 'ошибка'])
os.makedirs('docs/data', exist_ok=True)
with open('docs/data/maze_experiments.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Лабиринт', 'Стратегия', 'Время(мс)', 'Посещено клеток', 'Длина пути'])
writer.writerows(results)
if __name__ == "__main__":
main()