OR-Tools  7.1
TspCities.java
Go to the documentation of this file.
1 // Copyright 2010-2018 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]
22 import java.util.logging.Logger;
23 
24 // [END import]
25 
27 public class TspCities {
28  static {
29  System.loadLibrary("jniortools");
30  }
31 
32  private static final Logger logger = Logger.getLogger(TspCities.class.getName());
33 
34  // [START data_model]
35  static class DataModel {
36  public final long[][] distanceMatrix = {
37  {0, 2451, 713, 1018, 1631, 1374, 2408, 213, 2571, 875, 1420, 2145, 1972},
38  {2451, 0, 1745, 1524, 831, 1240, 959, 2596, 403, 1589, 1374, 357, 579},
39  {713, 1745, 0, 355, 920, 803, 1737, 851, 1858, 262, 940, 1453, 1260},
40  {1018, 1524, 355, 0, 700, 862, 1395, 1123, 1584, 466, 1056, 1280, 987},
41  {1631, 831, 920, 700, 0, 663, 1021, 1769, 949, 796, 879, 586, 371},
42  {1374, 1240, 803, 862, 663, 0, 1681, 1551, 1765, 547, 225, 887, 999},
43  {2408, 959, 1737, 1395, 1021, 1681, 0, 2493, 678, 1724, 1891, 1114, 701},
44  {213, 2596, 851, 1123, 1769, 1551, 2493, 0, 2699, 1038, 1605, 2300, 2099},
45  {2571, 403, 1858, 1584, 949, 1765, 678, 2699, 0, 1744, 1645, 653, 600},
46  {875, 1589, 262, 466, 796, 547, 1724, 1038, 1744, 0, 679, 1272, 1162},
47  {1420, 1374, 940, 1056, 879, 225, 1891, 1605, 1645, 679, 0, 1017, 1200},
48  {2145, 357, 1453, 1280, 586, 887, 1114, 2300, 653, 1272, 1017, 0, 504},
49  {1972, 579, 1260, 987, 371, 999, 701, 2099, 600, 1162, 1200, 504, 0},
50  };
51  public final int vehicleNumber = 1;
52  public final int depot = 0;
53  }
54  // [END data_model]
55 
56  // [START solution_printer]
58  static void printSolution(
59  RoutingModel routing, RoutingIndexManager manager, Assignment solution) {
60  // Solution cost.
61  logger.info("Objective: " + solution.objectiveValue() + "miles");
62  // Inspect solution.
63  logger.info("Route:");
64  long routeDistance = 0;
65  String route = "";
66  long index = routing.start(0);
67  while (!routing.isEnd(index)) {
68  route += manager.indexToNode(index) + " -> ";
69  long previousIndex = index;
70  index = solution.value(routing.nextVar(index));
71  routeDistance += routing.getArcCostForVehicle(previousIndex, index, 0);
72  }
73  route += manager.indexToNode(routing.end(0));
74  logger.info(route);
75  logger.info("Route distance: " + routeDistance + "miles");
76  }
77  // [END solution_printer]
78 
79  public static void main(String[] args) throws Exception {
80  // Instantiate the data problem.
81  // [START data]
82  final DataModel data = new DataModel();
83  // [END data]
84 
85  // Create Routing Index Manager
86  // [START index_manager]
87  RoutingIndexManager manager =
88  new RoutingIndexManager(data.distanceMatrix.length, data.vehicleNumber, data.depot);
89  // [END index_manager]
90 
91  // Create Routing Model.
92  // [START routing_model]
93  RoutingModel routing = new RoutingModel(manager);
94  // [END routing_model]
95 
96  // Create and register a transit callback.
97  // [START transit_callback]
98  final int transitCallbackIndex =
99  routing.registerTransitCallback((long fromIndex, long toIndex) -> {
100  // Convert from routing variable Index to user NodeIndex.
101  int fromNode = manager.indexToNode(fromIndex);
102  int toNode = manager.indexToNode(toIndex);
103  return data.distanceMatrix[fromNode][toNode];
104  });
105  // [END transit_callback]
106 
107  // Define cost of each arc.
108  // [START arc_cost]
109  routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex);
110  // [END arc_cost]
111 
112  // Setting first solution heuristic.
113  // [START parameters]
114  RoutingSearchParameters searchParameters =
116  .toBuilder()
118  .build();
119  // [END parameters]
120 
121  // Solve the problem.
122  // [START solve]
123  Assignment solution = routing.solveWithParameters(searchParameters);
124  // [END solve]
125 
126  // Print solution on console.
127  // [START print_solution]
128  printSolution(routing, manager, solution);
129  // [END print_solution]
130  }
131 }
132 // [END program]
static com.google.ortools.constraintsolver.RoutingSearchParameters defaultRoutingSearchParameters()
int registerTransitCallback(LongBinaryOperator callback)
static void main(String[] args)
Definition: TspCities.java:79
long getArcCostForVehicle(long from_index, long to_index, long vehicle)
.lang.Override com.google.ortools.constraintsolver.RoutingSearchParameters build()
Builder setFirstSolutionStrategy(com.google.ortools.constraintsolver.FirstSolutionStrategy.Value value)
Minimal TSP using distance matrix.
Definition: TspCities.java:27
Assignment solveWithParameters(com.google.ortools.constraintsolver.RoutingSearchParameters search_parameters)
void setArcCostEvaluatorOfAllVehicles(int evaluator_index)