diff --git a/SolovevDS/docs/data/data_for_task2/diagrams.py b/SolovevDS/docs/data/data_for_task2/diagrams.py
new file mode 100644
index 0000000..7ff2bde
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/diagrams.py
@@ -0,0 +1,76 @@
+import pandas as pd
+import matplotlib.pyplot as plt
+import numpy as np
+
+df = pd.read_csv("results.csv")
+
+maze_order = ["small_10", "medium_50", "large_100", "empty", "no_path"]
+strategy_order = ["BFS", "DFS", "AStar"]
+
+maze_labels = {
+ "small_10": "10×10",
+ "medium_50": "50×50",
+ "large_100": "100×100",
+ "empty": "Пустой",
+ "no_path": "Без выхода"
+}
+
+df["maze"] = pd.Categorical(df["maze"], categories=maze_order, ordered=True)
+df["strategy"] = pd.Categorical(df["strategy"], categories=strategy_order, ordered=True)
+df = df.sort_values(["maze", "strategy"])
+
+
+def plot_grouped_bar(df, value_col, ylabel, title, filename):
+ mazes = maze_order
+ strategies = strategy_order
+
+ x = np.arange(len(mazes))
+ width = 0.25
+
+ plt.figure(figsize=(11, 6))
+
+ for i, strategy in enumerate(strategies):
+ values = []
+
+ for maze in mazes:
+ row = df[(df["maze"] == maze) & (df["strategy"] == strategy)]
+ values.append(row[value_col].values[0])
+
+ plt.bar(x + (i - 1) * width, values, width, label=strategy)
+
+ plt.xlabel("Лабиринт")
+ plt.ylabel(ylabel)
+ plt.title(title)
+
+ plt.xticks(x, [maze_labels[m] for m in mazes], rotation=20)
+ plt.legend(title="Стратегия")
+ plt.grid(axis="y", alpha=0.3)
+
+ plt.tight_layout()
+ plt.savefig(filename, format="svg")
+ plt.show()
+
+
+plot_grouped_bar(
+ df,
+ value_col="time_ms",
+ ylabel="Время, мс",
+ title="Сравнение времени выполнения BFS, DFS и A*",
+ filename="time_comparison.svg"
+)
+
+plot_grouped_bar(
+ df,
+ value_col="cells_visited",
+ ylabel="Количество посещённых клеток",
+ title="Сравнение количества посещённых клеток",
+ filename="visited_cells_comparison.svg"
+)
+
+plot_grouped_bar(
+ df,
+ value_col="way_len",
+ ylabel="Длина пути, клеток",
+ title="Сравнение длины найденного пути",
+ filename="path_length_comparison.svg"
+)
\ No newline at end of file
diff --git a/SolovevDS/docs/data/data_for_task2/maze10.txt b/SolovevDS/docs/data/data_for_task2/maze10.txt
new file mode 100644
index 0000000..8ffe41a
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/maze10.txt
@@ -0,0 +1,10 @@
+##########
+#S ###
+###### ###
+# ###
+# #### ###
+# # ###
+# # ######
+# # #
+# ######E#
+##########
diff --git a/SolovevDS/docs/data/data_for_task2/maze100.txt b/SolovevDS/docs/data/data_for_task2/maze100.txt
new file mode 100644
index 0000000..2bd6ce0
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/maze100.txt
@@ -0,0 +1,100 @@
+####################################################################################################
+#S # # # # # # # # # ##
+## ############### # ## ## ###### # ### ### ### ########### ### # ## # ####### # ### # # # ##
+# # # # # # # # # # # # # # # # # # # ##
+# ### # ##### # #### ##### ######### # ##### # ##### # ### ##### ### # # ### # ####### ##### # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ##### ### ##### ##### # # ### # ##### # ##### # ####### ######### ##### # # # # ### ### # # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # # ### # # # ### # ##### ### ### # # ##### # # # ### # # ##### ### ##### ### ########### ### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # ### ########### # # ### # ### # # ### # ### # ##### # ####### #### ## # ### ######### ####### ##
+# # # # # # # # # # # # # # # # # # ##
+# ####### ### # # # ### # ### ################# ############# # ### ## ### ## # ### ### # # # # ####
+# # # # # # # # # # # # # # # # # # # # # # ##
+####### ### ### ##### ### # # ########### # ####### ### # ### # ##### # # ##### ### # ### ##### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ### # # ### ####### # # ##### ### # ### ### # ### # # # # ##### # # ########### # ##### # # ######
+# # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # ##### #### # # # # # # ## ## # # ### ##### ### # ####### ### ####### # # # # ### # # ##### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # ## # # # ### ####### # # # ##### # # ## # # # ######### ### ####### # ### ### # # # ### # # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ##### ### # # ##### # ### ##### # ### ### ### ##### # # # ### ###### ##### # # # # ##### ### # ##
+# # # # # # # # # # # # # # # # # # # # # ##
+# ##### # ######### # ######### ### # ## #### ### ############### # ########### ######### ## # # ##
+# # # # # # # # # # # # # # # # ##
+# ####### # # ##### ### # #### # ### # ### # # # ############# # # # # # # # ####### ### # # ### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+####### ### ### # # ##### # # ### # # ### ##### ########### # ### ####### ####### # # ### # # # ##
+# # # # # # # # # # # # # # # # # # # # # ##
+# ### ## ##### ###### ## # ##### ### ### ##### ### ############# # ### # ##### ####### ### ##### ##
+# # # # # # # # # # # # # # # # # # # # # ##
+# # ### ## ###### # # # #### ### ### # # # ####### # ##### # ### # ####### ### ### ### ### ######
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ### # # ##### # ###### #### # # ### # # # # ### # # # ######### # ### ### # # ## ## # ### # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # ### ### # ##### # ## # # # ### ##### # # # # # # # ### #### # ### # # ####### # # # ### # ####
+# # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ### ### ### # ### # ####### # ### # # ##### # ### # ### # ##### ### ### # ##### # ### # ### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ##### ### # # ### # # # #### ## # # # ### # # ### # ### ### ### # # # # # ####### ######### # ####
+# # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # # # # ##### # # ### # ### # # ### # ### # # # ### ### ############# # ### # ######### # ### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ### # # # # # ##### ### # # # # # # ##### # # # ##### # ##### # # ## # ### # # # ### ##### ####
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+### ##### ### ### # # # ### # ### # # ### # ### # # # # ### ### # # # ### ####### ## ## ### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # # # ## ### # ##### # # ### # # ##### # ### ### # # ### ### ##### ### # ##### ## ### ####### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ####### ### ### # ####### ####### # # ### # # ####### ### ### # # # ##### ##### ### ### # # ####
+# # # # # # # # # # # # # # # # # # # # # ##
+# # ####### ####### ### # ### ### # # # ##### ########## # # # ####### # # ######### # # ### # # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # # # # ##### # ### ##### ### ##### # ##### ### # # # ### # ### # ### # # #### ## ### ### # # # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # # ##### ### ####### ##### ### # ### ## ### # # # ####### # # # # # ##### ##### # ### # ##### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+##### # # ### ### # # # ##### # # # ### # # # # ##### ### # ### # # # # ##### # ### # ### # # # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # ### # # ##### # ############ # ##### # #### ## # ##### # # ######### # ####### ## # # # # # ##
+# # # # # # # # # # # # # # # # # # # ##
+# ##### # ##### # ### ### # # ##### # ############### # # ### ######### # ### # ##### ### # ##### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # # # ### # # # # ## ### ##### # ### ## ######## ### ########## # # ### # # ####### ### ##### ##
+# # # # # # # # # # # # # # # # # # # ##
+# ### # # # ### ##### ##### # # # ############### ######### ### # # ################ # # ### ######
+# # # # # # # # # # # # # # # # # # # ##
+# # # ### ### ######### # # # ####### ### #### # ### ##### ######### # # # ##### # ##### # ########
+# # # # # # # # # # # # # # # # # # # # # # # # # # ##
+### # # # ##### # # # # # # # ### # # ### # ### # ## # ## # ####### ######### ##### # # # ### ##
+# # # # # # # # # # # # # # # # # # # # # # # ##
+# ##### ##### # # ### ### ### # ##### # # # ### # ############ ## ######### ### # ### ### # # # # ##
+# # # # # # # # # # # # # # # # # # # # # # # # ##
+# # ##### # # ##### # ### # #### ### # ######### ### # # ##### # ### ### # ### ### #### ## # ##
+# # # # # # # # # # # # # # # # # # # # # # # # ##
+# ##### ### #### # # ########### ### # # # # # # # ### # # # # # # ### # ### ##### ### # ### # # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # ##
+# # # # # ### # ### # # ####### #### ######### ####### ### ####### # # ####### ### ### # ##### ##
+# # # # # # # # # # # # # # # # # # # # # # # ##
+# # ##### ##### # ####### ### ################# # # ### # # ### # # ### # # ### # ######### ##### ##
+# # # # # # # # # # # # # # # # # # # # # # # # ##
+### # ### # # ##### # # # # ### ### # ##### ####### ### ### # # ### ####### ####### ### ##########
+# # # # # # # # # # # # # # # # # # # # # ##
+# ######### # ##### ### ############# # ####### ##### ### ### # # ### # ### ##### # # ### ### # ##
+# # # # # # # # # # # # # # # # # # # # # ##
+# # # # # # ##### ##### # ######### # ### ### ### # ####### # # ### # ####### ##### ### # ### ##
+# # # # # # # # # # # # # # # # # # # # ##
+# ### # # # ##### # ###### #### # ##### # ### # # ### ######### ### ####### # ### ### ### ####### ##
+# # # # # # # # # # # # # # # # # # # # # # # ##
+# # ########### ### # ##### # # # # # ### # ### ### ### ##### ### ##### # ####### # ###### # # ####
+# # # # # # # # # # # # # # # # # # # # # # # ##
+# # # ###### # ### # # ########### ## ### ##### # # # # # # # # # ########### ### ######### ### ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+# ### ### # ### # ### # # ### # # ### # ### # ### # ##### # # # # ### # # ###### # ### # # ### # ##
+# # # # # # # # # # # # # # # # # # # # # # # # # # # ##
+### # # ##### ##### ### # # ####### ##### # # # ########### ######### ### # # ### ##### # # # # ##
+# # # # # # # # E##
+####################################################################################################
+####################################################################################################
diff --git a/SolovevDS/docs/data/data_for_task2/maze50.txt b/SolovevDS/docs/data/data_for_task2/maze50.txt
new file mode 100644
index 0000000..b574296
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/maze50.txt
@@ -0,0 +1,50 @@
+##################################################
+#S # # # # # ##
+##### ##### ### ######### ### ### # ### # ### # ##
+# # # # # # # # # # # # ##
+### ######### ############# ### # # # ##### ### ##
+# # # # # # # # # # ##
+# ########### # ### # # ##### # ##### # ### # ##
+# # # # # # # # # # # ##
+### # # ### ### # ### # ######### # ####### ### ##
+# # # # # # # # # # ##
+# ##### # ### ##### # ##### ##### ########### ####
+# # # # # # # # # # ##
+##### # ### ##### # ########### ##### ##### ### ##
+# # # # # # # # # # ##
+# ####### # ####### # ####### ### # ### # ### # ##
+# # # # # # # # # # # # ##
+# # # # ################### # # ### # # # ### # ##
+# # # # # # # # # # # # # ##
+### # ### ### # # ########### ### # # # ### ### ##
+# # # # # # # # # # # # # # ##
+# ##### ### ######### ##### ### # ### # # ### # ##
+# # # # # # # # # # # # # ##
+# # # ####### ### ### # ### # # ### # # # # # ####
+# # # # # # # # # # # # # # ##
+# # ########### ####### # ### # # ######### ### ##
+# # # # # # # # ##
+# ### ####### # ##### ##### # ####### ### ### ####
+# # # # # # # # # # # # ##
+# ######### ####### # # # # ### # ####### # ### ##
+# # # # # # # # # # # # ##
+### # ### ##### ####### # # # # ### # # ####### ##
+# # # # # # # # # # # # # # ##
+# # # # ### # ####### # # # ##### # # ### ### # ##
+# # # # # # # # # # # # # # # # ##
+# # # ######### # # # ### ### ### ### # ### # # ##
+# # # # # # # # # # # # # ##
+# ### # ####### # ######### # ####### ### # ### ##
+# # # # # # # # # # # # # ##
+# ##### # # # ##### # # ####### ### # # ### # ####
+# # # # # # # # # # # # # # ##
+##### ### # # # ##### ########### # # # # # ### ##
+# # # # # # # # # # # ##
+# ############# # ### ##### ##### # ### # ##### ##
+# # # # # # # # # # # ##
+# # ####### ### # # ### # ### ### ### # ##### # ##
+# # # # # # # # # # # # # ##
+# ##### ##### ### # # ##### ### ### ##### ##### ##
+# # # # # # E##
+##################################################
+##################################################
diff --git a/SolovevDS/docs/data/data_for_task2/maze_empty.txt b/SolovevDS/docs/data/data_for_task2/maze_empty.txt
new file mode 100644
index 0000000..a92cf1d
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/maze_empty.txt
@@ -0,0 +1,50 @@
+S
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ E
diff --git a/SolovevDS/docs/data/data_for_task2/maze_no_path.txt b/SolovevDS/docs/data/data_for_task2/maze_no_path.txt
new file mode 100644
index 0000000..03906b4
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/maze_no_path.txt
@@ -0,0 +1,10 @@
+##########
+#S #
+# ###### #
+# # # #
+# # ## # #
+# # ## # #
+# # # #
+# ########
+# #E#
+##########
diff --git a/SolovevDS/docs/data/data_for_task2/path_length_comparison.svg b/SolovevDS/docs/data/data_for_task2/path_length_comparison.svg
new file mode 100644
index 0000000..f3af08a
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/path_length_comparison.svg
@@ -0,0 +1,1536 @@
+
+
+
diff --git a/SolovevDS/docs/data/data_for_task2/results.csv b/SolovevDS/docs/data/data_for_task2/results.csv
new file mode 100644
index 0000000..8bc14f3
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/results.csv
@@ -0,0 +1,16 @@
+maze,strategy,time_ms,cells_visited,way_len
+small_10,BFS,0.00724,31.00000,21.00000
+small_10,DFS,0.00360,31.00000,21.00000
+small_10,AStar,0.00519,24.00000,21.00000
+medium_50,BFS,0.04465,505.00000,145.00000
+medium_50,DFS,0.03666,385.00000,361.00000
+medium_50,AStar,0.05370,319.00000,145.00000
+large_100,BFS,0.44010,4534.00000,245.00000
+large_100,DFS,0.09760,816.00000,703.00000
+large_100,AStar,0.37331,1298.00000,245.00000
+empty,BFS,0.15303,2500.00000,99.00000
+empty,DFS,0.09335,1275.00000,1275.00000
+empty,AStar,0.17047,341.00000,99.00000
+no_path,BFS,0.00259,25.00000,0.00000
+no_path,DFS,0.00244,25.00000,0.00000
+no_path,AStar,0.00494,25.00000,0.00000
diff --git a/SolovevDS/docs/data/data_for_task2/task2.cpp b/SolovevDS/docs/data/data_for_task2/task2.cpp
index a9df53d..07f957c 100644
--- a/SolovevDS/docs/data/data_for_task2/task2.cpp
+++ b/SolovevDS/docs/data/data_for_task2/task2.cpp
@@ -5,6 +5,9 @@
#include
#include /*мерит время*/
#include /*волшебная отрисовка*/
+#include
+#include
+#include
class cell{
private:
@@ -41,7 +44,6 @@ class cell{
};
-
class maze{
private:
int width;
@@ -174,8 +176,6 @@ class TextFileMazeBuilder : public MazeBuilder {
int width = 0;
int height = 0;
- // ДОБАВИЛ: первый проход по файлу.
- // Здесь узнаём ширину и высоту лабиринта.
while (std::getline(file, line)) {
if (height == 0) {
width = line.length();
@@ -248,13 +248,7 @@ class TextFileMazeBuilder : public MazeBuilder {
if (!hasExit)
throw std::runtime_error("Ошибка: в лабиринте нет выхода!");
return labirint;
-
}
-
- // прочитать символы
- // создать клетки
- // вернуть готовый Maze
- }
};
@@ -640,7 +634,6 @@ class MazeSolver{
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration duration = end - start;
-
int pathLength = 0;
if (path[0] != nullptr)
@@ -847,9 +840,95 @@ class ConsolController{
}
};
+class Benchmark {
+ private:
+ int RUNS = 10;
+ public:
+ Benchmark(int runs) {this->RUNS = runs;}
+ void benchmark(){
+ std::string mazeFiles[] = {
+ "SolovevDS/docs/data/data_for_task2/maze10.txt",
+ "SolovevDS/docs/data/data_for_task2/maze50.txt",
+ "SolovevDS/docs/data/data_for_task2/maze100.txt",
+ "SolovevDS/docs/data/data_for_task2/maze_empty.txt",
+ "SolovevDS/docs/data/data_for_task2/maze_no_path.txt"
+ };
+ std::string mazeNames[] = {
+ "small_10",
+ "medium_50",
+ "large_100",
+ "empty",
+ "no_path"
+ };
+
+ std::ofstream csv("SolovevDS/docs/data/data_for_task2/results.csv");
+
+ if (!csv.is_open())
+ throw std::runtime_error("Ошибка: не удалось создать results.csv!");
+
+ csv << "maze,strategy,time_ms,cells_visited,way_len\n";
+
+ TextFileMazeBuilder builder;
+
+ for (int i = 0; i < 5; i++) {
+ maze* labirint = builder.buildFromFile(mazeFiles[i]);
+
+ MazeSolver solver(labirint);
+
+ BFSStrategy bfs;
+ DFSStrategy dfs;
+ AStarStrategy astar;
+
+ PathFindingStrategy* strategies[] = {&bfs, &dfs, &astar};
+ std::string strategyNames[] = {"BFS", "DFS", "AStar"};
+
+ for (int s = 0; s < 3; s++) {
+ double sumTime = 0;
+ double sumVisited = 0;
+ double sumPathLength = 0;
+
+ for (int run = 0; run < RUNS; run++) {
+ solver.setStrategy(strategies[s]);
+
+ SearchStats stats = solver.solve();
+
+ sumTime += stats.timeMs;
+ sumVisited += stats.visitedCells;
+ sumPathLength += stats.pathLength;
+ }
+
+ double avgTime = sumTime / RUNS;
+ double avgVisited = sumVisited / RUNS;
+ double avgPathLength = sumPathLength / RUNS;
+
+ csv << mazeNames[i] << ","
+ << strategyNames[s] << ","
+ << std::fixed << std::setprecision(5) << avgTime << ","
+ << avgVisited << ","
+ << avgPathLength << "\n";
+ }
+ delete labirint;
+ }
+
+ csv.close();
+ }
+};
int main(){
+ SetConsoleCP(CP_UTF8);
+ SetConsoleOutputCP(CP_UTF8);
+ setlocale(LC_ALL, ".UTF-8");
+ Benchmark ben(10);
+ ben.benchmark();
-}
\ No newline at end of file
+ TextFileMazeBuilder builder;
+ maze* labirint = builder.buildFromFile("SolovevDS/docs/data/data_for_task2/maze10.txt");
+ Player player(labirint->getStart());
+ ConsolController controller(labirint, &player);
+ controller.run();
+ delete labirint;
+
+ return 0;
+}
diff --git a/SolovevDS/docs/data/data_for_task2/time_comparison.svg b/SolovevDS/docs/data/data_for_task2/time_comparison.svg
new file mode 100644
index 0000000..d50a3e3
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/time_comparison.svg
@@ -0,0 +1,1582 @@
+
+
+
diff --git a/SolovevDS/docs/data/data_for_task2/visited_cells_comparison.svg b/SolovevDS/docs/data/data_for_task2/visited_cells_comparison.svg
new file mode 100644
index 0000000..05def5c
--- /dev/null
+++ b/SolovevDS/docs/data/data_for_task2/visited_cells_comparison.svg
@@ -0,0 +1,1530 @@
+
+
+
diff --git a/SolovevDS/docs/laba_2_report.pdf b/SolovevDS/docs/laba_2_report.pdf
new file mode 100644
index 0000000..005e523
Binary files /dev/null and b/SolovevDS/docs/laba_2_report.pdf differ