Google OR-Tools: tsp_cities.cc

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...