forked from UNN/2026-rff_mp
154 lines
5.1 KiB
Python
154 lines
5.1 KiB
Python
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() |