24 import java.util.logging.Logger;
30 System.loadLibrary(
"jniortools");
33 private static final Logger logger = Logger.getLogger(
VrpTimeWindows.class.getName());
36 static class DataModel {
37 public final long[][] timeMatrix = {
38 {0, 6, 9, 8, 7, 3, 6, 2, 3, 2, 6, 6, 4, 4, 5, 9, 7},
39 {6, 0, 8, 3, 2, 6, 8, 4, 8, 8, 13, 7, 5, 8, 12, 10, 14},
40 {9, 8, 0, 11, 10, 6, 3, 9, 5, 8, 4, 15, 14, 13, 9, 18, 9},
41 {8, 3, 11, 0, 1, 7, 10, 6, 10, 10, 14, 6, 7, 9, 14, 6, 16},
42 {7, 2, 10, 1, 0, 6, 9, 4, 8, 9, 13, 4, 6, 8, 12, 8, 14},
43 {3, 6, 6, 7, 6, 0, 2, 3, 2, 2, 7, 9, 7, 7, 6, 12, 8},
44 {6, 8, 3, 10, 9, 2, 0, 6, 2, 5, 4, 12, 10, 10, 6, 15, 5},
45 {2, 4, 9, 6, 4, 3, 6, 0, 4, 4, 8, 5, 4, 3, 7, 8, 10},
46 {3, 8, 5, 10, 8, 2, 2, 4, 0, 3, 4, 9, 8, 7, 3, 13, 6},
47 {2, 8, 8, 10, 9, 2, 5, 4, 3, 0, 4, 6, 5, 4, 3, 9, 5},
48 {6, 13, 4, 14, 13, 7, 4, 8, 4, 4, 0, 10, 9, 8, 4, 13, 4},
49 {6, 7, 15, 6, 4, 9, 12, 5, 9, 6, 10, 0, 1, 3, 7, 3, 10},
50 {4, 5, 14, 7, 6, 7, 10, 4, 8, 5, 9, 1, 0, 2, 6, 4, 8},
51 {4, 8, 13, 9, 8, 7, 10, 3, 7, 4, 8, 3, 2, 0, 4, 5, 6},
52 {5, 12, 9, 14, 12, 6, 6, 7, 3, 3, 4, 7, 6, 4, 0, 9, 2},
53 {9, 10, 18, 6, 8, 12, 15, 8, 13, 9, 13, 3, 4, 5, 9, 0, 9},
54 {7, 14, 9, 16, 14, 8, 5, 10, 6, 5, 4, 10, 8, 6, 2, 9, 0},
56 public final long[][] timeWindows = {
75 public final int vehicleNumber = 4;
76 public final int depot = 0;
82 static void printSolution(
86 for (
int i = 0; i < data.vehicleNumber; ++i) {
87 long index = routing.
start(i);
88 logger.info(
"Route for Vehicle " + i +
":");
90 while (!routing.
isEnd(index)) {
92 route += manager.
indexToNode(index) +
" Time(" + solution.
min(timeVar) +
"," 93 + solution.
max(timeVar) +
") -> ";
97 route += manager.
indexToNode(index) +
" Time(" + solution.
min(timeVar) +
"," 98 + solution.
max(timeVar) +
")";
100 logger.info(
"Time of the route: " + solution.
min(timeVar) +
"min");
101 totalTime += solution.
min(timeVar);
103 logger.info(
"Total time of all routes: " + totalTime +
"min");
107 public static void main(String[] args)
throws Exception {
110 final DataModel data =
new DataModel();
126 final int transitCallbackIndex =
131 return data.timeMatrix[fromNode][toNode];
149 for (
int i = 1; i < data.timeWindows.length; ++i) {
151 timeDimension.
cumulVar(index).
setRange(data.timeWindows[i][0], data.timeWindows[i][1]);
154 for (
int i = 0; i < data.vehicleNumber; ++i) {
155 long index = routing.
start(i);
156 timeDimension.
cumulVar(index).
setRange(data.timeWindows[0][0], data.timeWindows[0][1]);
162 for (
int i = 0; i < data.vehicleNumber; ++i) {
184 printSolution(data, routing, manager, solution);
static com.google.ortools.constraintsolver.RoutingSearchParameters defaultRoutingSearchParameters()
static void main(String[] args)