Locus No Pilotus
Project of four first grade MIPT DAFE/RSE students (for engineering practical work in the second semester) in Qt C++
Loading...
Searching...
No Matches
travelling_salesmans_problem.h
Go to the documentation of this file.
1#pragma once
2
3// our code libs:
4#include "adjacency_matrix.h"
5#include "tspgraph.h"
6
7namespace math {
8
9/// @brief Решение задачи коммивояжера
11 public:
12 /**
13 * @brief Инициализирует новый экземпляр TravellingSalesmansProblem для
14 * нескольких коммивояжеров
15 * @param matrix: матрица смежности графа
16 * @param num_of_flyers: количество коммивояжеров
17 */
19 std::size_t num_of_flyers = 1);
20
21 // Возвращает длину оптимального маршрута
22 double GetTrajLength() const { return paths_len_; }
23
24 // Возвращает оптимальный маршрут для данной задачи
25 inline std::vector<std::size_t> GetTrajectory() {
26 return CalculateTrajectory();
27 }
28
29 private:
30 // Количество коммивояжеров
31 std::size_t num_of_flyers_{1};
32
33 // Вектор с указателями на вершины графа
34 // Отсортирован в порядке возрастания нижней оценки
35 std::vector<std::shared_ptr<TSPNode>> paths_stack_;
36
37 // Длина получившегося маршрута
38 double paths_len_;
39
40 // Ребра получившегося маршрута
41 std::vector<Edge> edge_path_;
42
43 // Вспомогательные методы для работы с paths_stack_
44 /**
45 * @brief Заменяет вершину графа в path_stack_ на её детей,
46 * без нарушения порядка
47 */
48 void ExpandStack();
49
50 /**
51 * @brief Удаляет ребро из матрицы смежности
52 * @param matrix: матрица смежности
53 * @param start_num: начало ребра
54 * @param end_num: конец ребра
55 * @return AdjacencyMatrix: матрица с удалённым ребром
56 */
57 AdjacencyMatrix& DeleteEdge(AdjacencyMatrix& matrix, std::size_t start_num,
58 std::size_t end_num);
59
60 /**
61 * @brief Находит место для вставки вершины для соблюдения порядка
62 * @param eval: нижняя оценка матрицы
63 * @return std::size_t: индекс вставки вершины
64 */
65 std::size_t FindIndex(double eval) const;
66
67 /**
68 * @brief Замыкает Гамильтонов цикл обхода контрольных точек
69 * @param node: вершина графа поиска оптимального пути
70 */
71 void CompleteEdgePath(std::shared_ptr<TSPNode> node);
72
73 /**
74 * @brief Переводит ребра, содержащихся в пути
75 * в последовательность обхода контрольных точек
76 * @return std::vector<std::size_t>: последовательность
77 * обхода контрольных точек
78 */
79 std::vector<std::size_t> ConvertToVertexPath();
80
81 /**
82 * @brief Просчитывает оптимальную маршрут
83 * @return std::vector<std::size_t>: порядок следования вершин
84 */
85 std::vector<std::size_t> CalculateTrajectory();
86};
87
88} // namespace math
Матрица смежности для алгоритма Литтла
Definition adjacency_matrix.h:23
Решение задачи коммивояжера
Definition travelling_salesmans_problem.h:10
std::size_t num_of_flyers_
Definition travelling_salesmans_problem.h:31
std::vector< Edge > edge_path_
Definition travelling_salesmans_problem.h:41
std::vector< std::shared_ptr< TSPNode > > paths_stack_
Definition travelling_salesmans_problem.h:35
std::vector< std::size_t > CalculateTrajectory()
Просчитывает оптимальную маршрут
Definition travelling_salesmans_problem.cpp:174
void CompleteEdgePath(std::shared_ptr< TSPNode > node)
Замыкает Гамильтонов цикл обхода контрольных точек
Definition travelling_salesmans_problem.cpp:134
void ExpandStack()
Заменяет вершину графа в path_stack_ на её детей, без нарушения порядка
Definition travelling_salesmans_problem.cpp:17
std::vector< std::size_t > GetTrajectory()
Definition travelling_salesmans_problem.h:25
std::size_t FindIndex(double eval) const
Находит место для вставки вершины для соблюдения порядка
Definition travelling_salesmans_problem.cpp:110
double paths_len_
Definition travelling_salesmans_problem.h:38
double GetTrajLength() const
Definition travelling_salesmans_problem.h:22
AdjacencyMatrix & DeleteEdge(AdjacencyMatrix &matrix, std::size_t start_num, std::size_t end_num)
Удаляет ребро из матрицы смежности
Definition travelling_salesmans_problem.cpp:93
std::vector< std::size_t > ConvertToVertexPath()
Переводит ребра, содержащихся в пути в последовательность обхода контрольных точек
Definition travelling_salesmans_problem.cpp:157
TravellingSalesmansProblem(AdjacencyMatrix &matrix, std::size_t num_of_flyers=1)
Инициализирует новый экземпляр TravellingSalesmansProblem для нескольких коммивояжеров
Definition travelling_salesmans_problem.cpp:9
Definition adjacency_matrix.cpp:7