Google OR-Tools v9.15
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
tsp_cities.cc

Simple TSP example.

1// Copyright 2010-2025 Google LLC
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14// [START program]
15// [START import]
16#include <cstdint>
17#include <cstdlib>
18#include <sstream>
19#include <vector>
20
27// [END import]
28
29namespace operations_research {
30// [START data_model]
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// [END data_model]
51
52// [START solution_printer]
57void PrintSolution(const RoutingIndexManager& manager,
58 const RoutingModel& routing, const Assignment& solution) {
59 // Inspect solution.
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// [END solution_printer]
78
79void Tsp() {
80 // Instantiate the data problem.
81 // [START data]
82 DataModel data;
83 // [END data]
84
85 // Create Routing Index Manager
86 // [START index_manager]
87 RoutingIndexManager manager(data.distance_matrix.size(), data.num_vehicles,
88 data.depot);
89 // [END index_manager]
90
91 // Create Routing Model.
92 // [START routing_model]
93 RoutingModel routing(manager);
94 // [END routing_model]
95
96 // [START transit_callback]
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 // Convert from routing variable Index to distance matrix NodeIndex.
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 // [END transit_callback]
106
107 // Define cost of each arc.
108 // [START arc_cost]
109 routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index);
110 // [END arc_cost]
111
112 // Setting first solution heuristic.
113 // [START parameters]
114 RoutingSearchParameters searchParameters = DefaultRoutingSearchParameters();
115 searchParameters.set_first_solution_strategy(
117 // [END parameters]
118
119 // Solve the problem.
120 // [START solve]
121 const Assignment* solution = routing.SolveWithParameters(searchParameters);
122 // [END solve]
123
124 // Print solution on console.
125 // [START print_solution]
126 PrintSolution(manager, routing, *solution);
127 // [END print_solution]
128}
129
130} // namespace operations_research
131
132int main(int /*argc*/, char* /*argv*/[]) {
133 operations_research::Tsp();
134 return EXIT_SUCCESS;
135}
136// [END program]
int main(int argc, char **argv)
Definition fz.cc:218
OR-Tools root namespace.
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...