From e2c95c60968985783980818c2102067573ca471c Mon Sep 17 00:00:00 2001 From: komissarovgo Date: Sun, 17 May 2026 16:52:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs2/data2/maze_lab/experiments.py | 53 +++++++++++++------ komissarovgo/docs2/data2/maze_lab/main.py | 19 +++++++ .../data2/maze_lab/mazes/blocked_maze.txt | 10 ++++ .../data2/maze_lab/mazes/no_exit_maze.txt | 10 ++++ .../data2/maze_lab/mazes/simple_maze.txt | 10 ++++ .../docs2/data2/maze_lab/mazes/small_maze.txt | 10 ++++ .../maze_lab/results/experiment_results.csv | 7 +++ 7 files changed, 104 insertions(+), 15 deletions(-) create mode 100644 komissarovgo/docs2/data2/maze_lab/mazes/blocked_maze.txt create mode 100644 komissarovgo/docs2/data2/maze_lab/mazes/no_exit_maze.txt create mode 100644 komissarovgo/docs2/data2/maze_lab/mazes/simple_maze.txt create mode 100644 komissarovgo/docs2/data2/maze_lab/mazes/small_maze.txt create mode 100644 komissarovgo/docs2/data2/maze_lab/results/experiment_results.csv diff --git a/komissarovgo/docs2/data2/maze_lab/experiments.py b/komissarovgo/docs2/data2/maze_lab/experiments.py index 8abcfc8..1f79796 100644 --- a/komissarovgo/docs2/data2/maze_lab/experiments.py +++ b/komissarovgo/docs2/data2/maze_lab/experiments.py @@ -18,7 +18,14 @@ class ExperimentRunner: ] def run_experiment(self, maze_file: str, runs: int = 5) -> List[Dict[str, Any]]: - maze = self.builder.build_from_file(maze_file) + + try: + maze = self.builder.build_from_file(maze_file) + except ValueError as e: + # Если лабиринт некорректный (нет старта или выхода) + print(f" Пропуск: {e}") + return [] + results = [] for strategy in self.strategies: @@ -28,33 +35,49 @@ class ExperimentRunner: path_lengths = [] for _ in range(runs): - path, stats = solver.solve() - times.append(stats.time_ms) - path_lengths.append(stats.path_length) + try: + path, stats = solver.solve() + times.append(stats.time_ms) + path_lengths.append(stats.path_length) + except Exception as e: + print(f" Ошибка при {strategy.name}: {e}") + continue - results.append({ - 'maze': Path(maze_file).stem, - 'strategy': strategy.name, - 'avg_time_ms': sum(times) / runs, - 'min_time_ms': min(times), - 'max_time_ms': max(times), - 'path_length': path_lengths[0] if path_lengths else 0 - }) + if times: + results.append({ + 'maze': Path(maze_file).stem, + 'strategy': strategy.name, + 'avg_time_ms': sum(times) / runs, + 'min_time_ms': min(times), + 'max_time_ms': max(times), + 'path_length': path_lengths[0] if path_lengths else 0, + 'path_found': path_lengths[0] > 0 if path_lengths else False + }) return results def run_all_experiments(self, maze_files: List[str], runs: int = 5, output_file: str = "results/experiment_results.csv"): + all_results = [] for maze_file in maze_files: print(f"Запуск на лабиринте: {maze_file}") results = self.run_experiment(maze_file, runs) - all_results.extend(results) - for r in results: - print(f" {r['strategy']}: {r['avg_time_ms']:.3f} мс, путь: {r['path_length']}") + if results: + all_results.extend(results) + for r in results: + status = "✓" if r['path_found'] else "✗ (нет пути)" + print(f" {r['strategy']}: {r['avg_time_ms']:.3f} мс, путь: {r['path_length']} {status}") + else: + print(f" Лабиринт пропущен (нет старта или выхода)") + if not all_results: + print("Нет результатов для сохранения!") + return + + # Сохранение в CSV Path("results").mkdir(exist_ok=True) with open(output_file, 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=all_results[0].keys()) diff --git a/komissarovgo/docs2/data2/maze_lab/main.py b/komissarovgo/docs2/data2/maze_lab/main.py index 6ff1604..3edcd6a 100644 --- a/komissarovgo/docs2/data2/maze_lab/main.py +++ b/komissarovgo/docs2/data2/maze_lab/main.py @@ -16,6 +16,7 @@ def create_test_maze_file(filename: str, maze_data: list): def setup_test_mazes(): + small_maze = [ "##########", "#S #", @@ -30,6 +31,7 @@ def setup_test_mazes(): ] create_test_maze_file("small_maze.txt", small_maze) + simple_maze = [ "##########", "#S #", @@ -44,6 +46,7 @@ def setup_test_mazes(): ] create_test_maze_file("simple_maze.txt", simple_maze) + no_exit_maze = [ "##########", "#S #", @@ -56,7 +59,23 @@ def setup_test_mazes(): "# #######", "##########" ] + create_test_maze_file("no_exit_maze.txt", no_exit_maze) + + + blocked_maze = [ + "##########", + "#S# #", + "# # #", + "# # #", + "# # #", + "# # #", + "# # #", + "# # #", + "# #######E", + "##########" + ] + create_test_maze_file("blocked_maze.txt", blocked_maze) def interactive_mode(): diff --git a/komissarovgo/docs2/data2/maze_lab/mazes/blocked_maze.txt b/komissarovgo/docs2/data2/maze_lab/mazes/blocked_maze.txt new file mode 100644 index 0000000..f498f10 --- /dev/null +++ b/komissarovgo/docs2/data2/maze_lab/mazes/blocked_maze.txt @@ -0,0 +1,10 @@ +########## +#S# # +# # # +# # # +# # # +# # # +# # # +# # # +# #######E +########## \ No newline at end of file diff --git a/komissarovgo/docs2/data2/maze_lab/mazes/no_exit_maze.txt b/komissarovgo/docs2/data2/maze_lab/mazes/no_exit_maze.txt new file mode 100644 index 0000000..f344b4a --- /dev/null +++ b/komissarovgo/docs2/data2/maze_lab/mazes/no_exit_maze.txt @@ -0,0 +1,10 @@ +########## +#S # +# ####### # +# # # +##### # # # +# # # +# ### ### # +# # # +# ####### +########## \ No newline at end of file diff --git a/komissarovgo/docs2/data2/maze_lab/mazes/simple_maze.txt b/komissarovgo/docs2/data2/maze_lab/mazes/simple_maze.txt new file mode 100644 index 0000000..db91695 --- /dev/null +++ b/komissarovgo/docs2/data2/maze_lab/mazes/simple_maze.txt @@ -0,0 +1,10 @@ +########## +#S # +# # +# # +# # +# # +# # +# # +# E# +########## \ No newline at end of file diff --git a/komissarovgo/docs2/data2/maze_lab/mazes/small_maze.txt b/komissarovgo/docs2/data2/maze_lab/mazes/small_maze.txt new file mode 100644 index 0000000..26a4765 --- /dev/null +++ b/komissarovgo/docs2/data2/maze_lab/mazes/small_maze.txt @@ -0,0 +1,10 @@ +########## +#S # +# ####### # +# # # +##### # # # +# # # +# ### ### # +# # # +# #### E# +########## \ No newline at end of file diff --git a/komissarovgo/docs2/data2/maze_lab/results/experiment_results.csv b/komissarovgo/docs2/data2/maze_lab/results/experiment_results.csv new file mode 100644 index 0000000..407de18 --- /dev/null +++ b/komissarovgo/docs2/data2/maze_lab/results/experiment_results.csv @@ -0,0 +1,7 @@ +maze,strategy,avg_time_ms,min_time_ms,max_time_ms,path_length,path_found +small_maze,BFS,0.09410000002390007,0.06260000009206124,0.17690000004222384,16,True +small_maze,DFS,0.0747799999317067,0.061499999901570845,0.12589999960255227,16,True +small_maze,A*,0.10337000007893948,0.07970000024215551,0.1430000002073939,16,True +simple_maze,BFS,0.14079999996283732,0.1119000003200199,0.18079999972542282,15,True +simple_maze,DFS,0.07789999999658903,0.07430000005115289,0.0957000002017594,29,True +simple_maze,A*,0.21409000005405687,0.18180000006395858,0.2953999996861967,15,True