Simple TSP example.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <cstdint>
17#include <cstdlib>
18#include <sstream>
19#include <vector>
20
27
28
30
31struct DataModel {
32 const std::vector<std::vector<int64_t>> distance_matrix{
33 {0, 2451, 713, 1018, 1631, 1374, 2408, 213, 2571, 875, 1420, 2145, 1972},
34 {2451, 0, 1745, 1524, 831, 1240, 959, 2596, 403, 1589, 1374, 357, 579},
35 {713, 1745, 0, 355, 920, 803, 1737, 851, 1858, 262, 940, 1453, 1260},
36 {1018, 1524, 355, 0, 700, 862, 1395, 1123, 1584, 466, 1056, 1280, 987},
37 {1631, 831, 920, 700, 0, 663, 1021, 1769, 949, 796, 879, 586, 371},
38 {1374, 1240, 803, 862, 663, 0, 1681, 1551, 1765, 547, 225, 887, 999},
39 {2408, 959, 1737, 1395, 1021, 1681, 0, 2493, 678, 1724, 1891, 1114, 701},
40 {213, 2596, 851, 1123, 1769, 1551, 2493, 0, 2699, 1038, 1605, 2300, 2099},
41 {2571, 403, 1858, 1584, 949, 1765, 678, 2699, 0, 1744, 1645, 653, 600},
42 {875, 1589, 262, 466, 796, 547, 1724, 1038, 1744, 0, 679, 1272, 1162},
43 {1420, 1374, 940, 1056, 879, 225, 1891, 1605, 1645, 679, 0, 1017, 1200},
44 {2145, 357, 1453, 1280, 586, 887, 1114, 2300, 653, 1272, 1017, 0, 504},
45 {1972, 579, 1260, 987, 371, 999, 701, 2099, 600, 1162, 1200, 504, 0},
46 };
47 const int num_vehicles = 1;
48 const RoutingIndexManager::NodeIndex depot{0};
49};
50
51
52
57void PrintSolution(const RoutingIndexManager& manager,
58 const RoutingModel& routing,
const Assignment&
solution) {
59
60 LOG(INFO) <<
"Objective: " <<
solution.ObjectiveValue() <<
" miles";
61 int64_t index = routing.Start(0);
62 LOG(INFO) << "Route:";
63 int64_t distance{0};
64 std::stringstream route;
65 while (!routing.IsEnd(index)) {
66 route << manager.IndexToNode(index).value() << " -> ";
67 const int64_t previous_index = index;
68 index =
solution.Value(routing.NextVar(index));
69 distance += routing.GetArcCostForVehicle(previous_index, index, int64_t{0});
70 }
71 LOG(INFO) << route.str() << manager.IndexToNode(index).value();
72 LOG(INFO) << "Route distance: " << distance << "miles";
73 LOG(INFO) << "";
74 LOG(INFO) << "Advanced usage:";
75 LOG(INFO) << "Problem solved in " << routing.solver()->wall_time() << "ms";
76}
77
78
79void Tsp() {
80
81
82 DataModel data;
83
84
85
86
87 RoutingIndexManager manager(data.distance_matrix.size(), data.num_vehicles,
88 data.depot);
89
90
91
92
93 RoutingModel routing(manager);
94
95
96
97 const int transit_callback_index = routing.RegisterTransitCallback(
98 [&data, &manager](const int64_t from_index,
99 const int64_t to_index) -> int64_t {
100
101 const int from_node = manager.IndexToNode(from_index).value();
102 const int to_node = manager.IndexToNode(to_index).value();
103 return data.distance_matrix[from_node][to_node];
104 });
105
106
107
108
109 routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index);
110
111
112
113
115 searchParameters.set_first_solution_strategy(
117
118
119
120
121 const Assignment*
solution = routing.SolveWithParameters(searchParameters);
122
123
124
125
126 PrintSolution(manager, routing, *
solution);
127
128}
129
130}
131
132int main(
int ,
char* []) {
133 operations_research::Tsp();
134 return EXIT_SUCCESS;
135}
136
static constexpr Value PATH_CHEAPEST_ARC
int main(int argc, char **argv)
Select next search node to expand Select next item_i to add this new search node to the search Generate a new search node where item_i is not in the knapsack Check validity of this new partial solution(using propagators) - If valid
RoutingSearchParameters DefaultRoutingSearchParameters()
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...