2026-rff_mp/konnovaea/lab2/maze_experiments.py

154 lines
5.1 KiB
Python
Raw Normal View History

import time
import csv
import os
2026-05-22 14:43:21 +00:00
from lab2.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()