Java Reference

Java Reference

RoutingSolverTest.java
Go to the documentation of this file.
1 // Copyright 2010-2022 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 package com.google.ortools.constraintsolver;
15 
16 import static com.google.common.truth.Truth.assertThat;
17 import static org.junit.jupiter.api.Assertions.assertEquals;
18 import static org.junit.jupiter.api.Assertions.assertFalse;
19 import static org.junit.jupiter.api.Assertions.assertNotNull;
20 import static org.junit.jupiter.api.Assertions.assertTrue;
21 
22 import com.google.auto.value.AutoValue;
23 import com.google.ortools.Loader;
24 import com.google.ortools.constraintsolver.RoutingModelParameters;
25 import com.google.ortools.constraintsolver.RoutingSearchParameters;
26 import com.google.protobuf.Duration;
27 import java.util.ArrayList;
28 import java.util.function.LongBinaryOperator;
29 import java.util.function.LongUnaryOperator;
30 import java.util.stream.IntStream;
31 import org.junit.jupiter.api.BeforeEach;
32 import org.junit.jupiter.api.Test;
33 
35 public final class RoutingSolverTest {
36  @AutoValue
37  abstract static class Location {
38  static Location create(Integer latitude, Integer longitude) {
39  return new AutoValue_RoutingSolverTest_Location(latitude, longitude);
40  }
41  abstract Integer latitude();
42  abstract Integer longitude();
43  }
44  private ArrayList<Location> coordinates;
45 
46  @BeforeEach
47  public void setUp() {
49  coordinates = new ArrayList<>();
50  coordinates.add(Location.create(0, 0));
51  coordinates.add(Location.create(-1, 0));
52  coordinates.add(Location.create(-1, 2));
53  coordinates.add(Location.create(2, 1));
54  coordinates.add(Location.create(1, 0));
55  }
56 
57  public LongBinaryOperator createManhattanCostCallback(RoutingIndexManager manager) {
58  return (long i, long j) -> {
59  final int firstIndex = manager.indexToNode(i);
60  final int secondIndex = manager.indexToNode(j);
61  final Location firstCoordinate = coordinates.get(firstIndex);
62  final Location secondCoordinate = coordinates.get(secondIndex);
63  return (long) Math.abs(firstCoordinate.latitude() - secondCoordinate.latitude())
64  + Math.abs(firstCoordinate.longitude() - secondCoordinate.longitude());
65  };
66  }
67 
68  public LongUnaryOperator createUnaryCostCallback(RoutingIndexManager manager) {
69  return (long fromIndex) -> {
70  final int fromNode = manager.indexToNode(fromIndex);
71  final Location firstCoordinate = coordinates.get(fromNode);
72  return (long) Math.abs(firstCoordinate.latitude()) + Math.abs(firstCoordinate.longitude());
73  };
74  }
75 
76  public LongBinaryOperator createReturnOneCallback() {
77  return (long i, long j) -> 1;
78  }
79 
80  @Test
82  for (int i = 0; i < 500; ++i) {
83  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
84  assertNotNull(manager);
85  final RoutingModel model = new RoutingModel(manager);
86  assertNotNull(model);
87  LongBinaryOperator transit = (long fromIndex, long toIndex) -> {
88  final int fromNode = manager.indexToNode(fromIndex);
89  final int toNode = manager.indexToNode(toIndex);
90  return (long) Math.abs(toNode - fromNode);
91  };
92  model.registerTransitCallback(transit);
93  System.gc(); // model should keep alive the callback
94  }
95  }
96 
97  @Test
98  public void testRoutingIndexManager() {
99  final RoutingIndexManager manager = new RoutingIndexManager(42, 3, 7);
100  assertNotNull(manager);
101  assertEquals(42, manager.getNumberOfNodes());
102  assertEquals(3, manager.getNumberOfVehicles());
103  assertEquals(42 + 3 * 2 - 1, manager.getNumberOfIndices());
104  for (int i = 0; i < manager.getNumberOfVehicles(); ++i) {
105  assertEquals(7, manager.indexToNode(manager.getStartIndex(i)));
106  assertEquals(7, manager.indexToNode(manager.getEndIndex(i)));
107  }
108  }
109 
110  @Test
112  final RoutingIndexManager manager =
113  new RoutingIndexManager(42, 3, new int[] {7, 7, 7}, new int[] {7, 7, 7});
114  assertNotNull(manager);
115  assertEquals(42, manager.getNumberOfNodes());
116  assertEquals(3, manager.getNumberOfVehicles());
117  assertEquals(42 + 3 * 2 - 1, manager.getNumberOfIndices());
118  for (int i = 0; i < manager.getNumberOfVehicles(); ++i) {
119  assertEquals(7, manager.indexToNode(manager.getStartIndex(i)));
120  assertEquals(7, manager.indexToNode(manager.getEndIndex(i)));
121  }
122  }
123 
124  @Test
126  final RoutingIndexManager manager =
127  new RoutingIndexManager(42, 3, new int[] {1, 2, 3}, new int[] {4, 5, 6});
128  assertNotNull(manager);
129  assertEquals(42, manager.getNumberOfNodes());
130  assertEquals(3, manager.getNumberOfVehicles());
131  assertEquals(42, manager.getNumberOfIndices());
132  for (int i = 0; i < manager.getNumberOfVehicles(); ++i) {
133  assertEquals(i + 1, manager.indexToNode(manager.getStartIndex(i)));
134  assertEquals(i + 4, manager.indexToNode(manager.getEndIndex(i)));
135  }
136  }
137 
138  @Test
139  public void testRoutingModel() {
140  final RoutingIndexManager manager =
141  new RoutingIndexManager(42, 3, new int[] {1, 2, 3}, new int[] {4, 5, 6});
142  assertNotNull(manager);
143  final RoutingModel model = new RoutingModel(manager);
144  assertNotNull(model);
145  for (int i = 0; i < manager.getNumberOfVehicles(); ++i) {
146  assertEquals(i + 1, manager.indexToNode(model.start(i)));
147  assertEquals(i + 4, manager.indexToNode(model.end(i)));
148  }
149  }
150 
151  @Test
153  final RoutingModelParameters parameters = main.defaultRoutingModelParameters();
154  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
155  assertNotNull(manager);
156  final RoutingModel model = new RoutingModel(manager, parameters);
157  assertNotNull(model);
158  assertEquals(1, model.vehicles());
159  }
160 
161  @Test
163  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
164  assertNotNull(manager);
165  final RoutingModel model = new RoutingModel(manager);
166  assertNotNull(model);
167  final RoutingSearchParameters parameters = main.defaultRoutingSearchParameters();
168  final LongBinaryOperator callback = createManhattanCostCallback(manager);
169  final int cost = model.registerTransitCallback(callback);
170  System.gc();
171  model.setArcCostEvaluatorOfAllVehicles(cost);
172 
173  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
174  Assignment solution = model.solveWithParameters(parameters);
175  assertEquals(10, solution.objectiveValue());
176  solution = model.solveFromAssignmentWithParameters(solution, parameters);
177  assertEquals(10, solution.objectiveValue());
178  }
179 
180  @Test
182  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
183  assertNotNull(manager);
184  final RoutingModel model = new RoutingModel(manager);
185  assertNotNull(model);
186  assertEquals(5, model.nodes());
187  final LongBinaryOperator callback = createManhattanCostCallback(manager);
188  final int cost = model.registerTransitCallback(callback);
189  System.gc();
190  model.setArcCostEvaluatorOfAllVehicles(cost);
191 
192  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
193  final Assignment solution = model.solve(null);
194  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
195  assertNotNull(solution);
196  assertEquals(10, solution.objectiveValue());
197  }
198 
199  @Test
201  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
202  assertNotNull(manager);
203  final RoutingModel model = new RoutingModel(manager);
204  assertNotNull(model);
205  assertEquals(5, model.nodes());
206  final long[][] matrix = {
207  {0, 1, 3, 3, 1},
208  {1, 0, 2, 4, 2},
209  {3, 2, 0, 4, 4},
210  {3, 4, 4, 0, 2},
211  {1, 2, 4, 2, 0},
212  };
213  final int cost = model.registerTransitMatrix(matrix);
214  System.gc(); // model should keep alive the callback
215  model.setArcCostEvaluatorOfAllVehicles(cost);
216 
217  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
218  final Assignment solution = model.solve(null);
219  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
220  assertNotNull(solution);
221  assertEquals(10, solution.objectiveValue());
222  }
223 
224  @Test
226  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
227  assertNotNull(manager);
228  final RoutingModel model = new RoutingModel(manager);
229  assertNotNull(model);
230  assertEquals(5, model.nodes());
231  final int cost = model.registerTransitCallback(createManhattanCostCallback(manager));
232  System.gc(); // model should keep alive the callback
233  model.setArcCostEvaluatorOfAllVehicles(cost);
234 
235  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
236  final Assignment solution = model.solve(null);
237  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
238  assertNotNull(solution);
239  assertEquals(10, solution.objectiveValue());
240  }
241 
242  @Test
244  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
245  assertNotNull(manager);
246  final RoutingModel model = new RoutingModel(manager);
247  assertNotNull(model);
248  assertEquals(5, model.nodes());
249  final int cost = model.registerTransitCallback((long fromIndex, long toIndex) -> {
250  final int fromNode = manager.indexToNode(fromIndex);
251  final int toNode = manager.indexToNode(toIndex);
252  return (long) Math.abs(toNode - fromNode);
253  });
254  System.gc(); // model should keep alive the callback
255  model.setArcCostEvaluatorOfAllVehicles(cost);
256 
257  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
258  final Assignment solution = model.solve(null);
259  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
260  assertNotNull(solution);
261  assertEquals(8, solution.objectiveValue());
262  }
263 
264  @Test
266  final RoutingIndexManager manager = new RoutingIndexManager(10, 1, 0);
267  assertNotNull(manager);
268  final RoutingModel model = new RoutingModel(manager);
269  assertNotNull(model);
270  assertEquals(10, model.nodes());
271  final long[] vector = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
272  final int cost = model.registerUnaryTransitVector(vector);
273  System.gc(); // model should keep alive the callback
274  model.setArcCostEvaluatorOfAllVehicles(cost);
275 
276  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
277  final Assignment solution = model.solve(null);
278  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
279  assertNotNull(solution);
280  assertEquals(45, solution.objectiveValue());
281  }
282 
283  @Test
285  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
286  assertNotNull(manager);
287  final RoutingModel model = new RoutingModel(manager);
288  assertNotNull(model);
289  assertEquals(5, model.nodes());
290  final int cost = model.registerUnaryTransitCallback(createUnaryCostCallback(manager));
291  System.gc(); // model should keep alive the callback
292  model.setArcCostEvaluatorOfAllVehicles(cost);
293 
294  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
295  Assignment solution = model.solve(null);
296  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
297  assertNotNull(solution);
298  assertEquals(8, solution.objectiveValue());
299  }
300 
301  @Test
303  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
304  assertNotNull(manager);
305  final RoutingModel model = new RoutingModel(manager);
306  assertNotNull(model);
307  assertEquals(5, model.nodes());
308  final int cost = model.registerUnaryTransitCallback((long fromIndex) -> {
309  final int fromNode = manager.indexToNode(fromIndex);
310  return (long) Math.abs(fromNode);
311  });
312  System.gc(); // model should keep alive the callback
313  model.setArcCostEvaluatorOfAllVehicles(cost);
314 
315  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
316  Assignment solution = model.solve(null);
317  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
318  assertNotNull(solution);
319  assertEquals(10, solution.objectiveValue());
320  }
321 
322  @Test
324  final int vehicles = coordinates.size() - 1;
325  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), vehicles, 0);
326  assertNotNull(manager);
327  final RoutingModel model = new RoutingModel(manager);
328  assertNotNull(model);
329  model.closeModel();
330  long[][] routes = new long[vehicles][];
331  for (int i = 0; i < vehicles; ++i) {
332  // Each route has a single node
333  routes[i] = new long[1];
334  routes[i][0] = manager.nodeToIndex(i + 1);
335  }
336  Assignment assignment = new Assignment(model.solver());
337  model.routesToAssignment(routes, false, true, assignment);
338  for (int i = 0; i < vehicles; ++i) {
339  assertEquals(assignment.value(model.nextVar(model.start(i))), i + 1);
340  assertEquals(assignment.value(model.nextVar(i + 1)), model.end(i));
341  }
342  }
343 
344  @Test
346  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
347  assertNotNull(manager);
348  final RoutingModel model = new RoutingModel(manager);
349  assertNotNull(model);
350  final LongBinaryOperator callback = createManhattanCostCallback(manager);
351  final int cost = model.registerTransitCallback(callback);
352  model.setArcCostEvaluatorOfAllVehicles(cost);
353 
354  int[] a = new int[2];
355  a[0] = 2;
356  a[1] = 3;
357  int[] b = new int[1];
358  b[0] = 1;
359  int[] c = new int[1];
360  c[0] = 4;
361  model.addDisjunction(manager.nodesToIndices(a));
362  model.addDisjunction(manager.nodesToIndices(b));
363  model.addDisjunction(manager.nodesToIndices(c));
364 
365  Assignment solution = model.solve(null);
366  assertEquals(8, solution.objectiveValue());
367  }
368 
369  @Test
371  final RoutingIndexManager manager = new RoutingIndexManager(10, 1, 0);
372  assertNotNull(manager);
373  final RoutingModel model = new RoutingModel(manager);
374  assertNotNull(model);
375  assertEquals(10, model.nodes());
376  final IntBoolPair pair = model.addConstantDimension(1,
377  /*capacity=*/100,
378  /*fix_start_cumul_to_zero=*/true, "Dimension");
379  assertEquals(1, pair.getFirst());
380  assertTrue(pair.getSecond());
381  RoutingDimension dimension = model.getMutableDimension("Dimension");
382  dimension.setSpanCostCoefficientForAllVehicles(2);
383 
384  RoutingSearchParameters searchParameters =
385  main.defaultRoutingSearchParameters()
386  .toBuilder()
387  .setTimeLimit(Duration.newBuilder().setSeconds(10))
388  .build();
389 
390  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
391  final Assignment solution = model.solveWithParameters(searchParameters);
392  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
393  assertNotNull(solution);
394  assertEquals(20, solution.objectiveValue());
395  }
396 
397  @Test
399  final RoutingIndexManager manager = new RoutingIndexManager(10, 1, 0);
400  assertNotNull(manager);
401  final RoutingModel model = new RoutingModel(manager);
402  assertNotNull(model);
403  assertEquals(10, model.nodes());
404  final long[] vector = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
405  final IntBoolPair pair = model.addVectorDimension(vector,
406  /*capacity=*/100,
407  /*fix_start_cumul_to_zero=*/true, "Dimension");
408  assertEquals(1, pair.getFirst());
409  assertTrue(pair.getSecond());
410  System.gc(); // model should keep alive the callback
411  model.setArcCostEvaluatorOfAllVehicles(pair.getFirst());
412 
413  RoutingSearchParameters searchParameters =
414  main.defaultRoutingSearchParameters()
415  .toBuilder()
416  .setTimeLimit(Duration.newBuilder().setSeconds(10))
417  .build();
418 
419  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
420  final Assignment solution = model.solveWithParameters(searchParameters);
421  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
422  assertNotNull(solution);
423  assertEquals(45, solution.objectiveValue());
424  }
425 
426  @Test
428  final RoutingIndexManager manager = new RoutingIndexManager(5, 1, 0);
429  assertNotNull(manager);
430  final RoutingModel model = new RoutingModel(manager);
431  assertNotNull(model);
432  assertEquals(5, model.nodes());
433  final long[][] matrix = {
434  {0, 1, 3, 3, 1},
435  {1, 0, 2, 4, 2},
436  {3, 2, 0, 4, 4},
437  {3, 4, 4, 0, 2},
438  {1, 2, 4, 2, 0},
439  };
440  final IntBoolPair pair = model.addMatrixDimension(matrix,
441  /*capacity=*/100,
442  /*fix_start_cumul_to_zero=*/true, "Dimension");
443  assertEquals(1, pair.getFirst());
444  assertTrue(pair.getSecond());
445  System.gc(); // model should keep alive the callback
446  model.setArcCostEvaluatorOfAllVehicles(pair.getFirst());
447 
448  final RoutingSearchParameters searchParameters =
449  main.defaultRoutingSearchParameters()
450  .toBuilder()
451  .setTimeLimit(Duration.newBuilder().setSeconds(10))
452  .build();
453 
454  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
455  final Assignment solution = model.solveWithParameters(searchParameters);
456  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
457  assertNotNull(solution);
458  assertEquals(10, solution.objectiveValue());
459  }
460 
461  @Test
463  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
464  assertNotNull(manager);
465  final RoutingModel model = new RoutingModel(manager);
466  assertNotNull(model);
467  final LongBinaryOperator manhattanCostCallback = createManhattanCostCallback(manager);
468  final int cost = model.registerTransitCallback(manhattanCostCallback);
469  model.setArcCostEvaluatorOfAllVehicles(cost);
470 
471  final LongBinaryOperator transit = (long firstIndex, long secondIndex) -> {
472  int firstNode = manager.indexToNode(firstIndex);
473  int secondNode = manager.indexToNode(secondIndex);
474  if (firstNode >= coordinates.size()) {
475  firstNode = 0;
476  }
477  if (secondNode >= coordinates.size()) {
478  secondNode = 0;
479  }
480  long distanceTime = manhattanCostCallback.applyAsLong(firstIndex, secondIndex) * 10;
481  long visitingTime = 1;
482  return distanceTime + visitingTime;
483  };
484  assertTrue(
485  model.addDimension(model.registerTransitCallback(transit), 1000, 1000, true, "time"));
486  RoutingDimension dimension = model.getMutableDimension("time");
487 
488  for (int i = 1; i < coordinates.size(); i++) {
489  int[] a = new int[1];
490  a[0] = i;
491  model.addDisjunction(manager.nodesToIndices(a), 10);
492 
493  dimension.cumulVar(i).setMin(0);
494  dimension.cumulVar(i).setMax(40);
495  }
496 
497  RoutingSearchParameters searchParameters =
498  main.defaultRoutingSearchParameters()
499  .toBuilder()
500  .setTimeLimit(Duration.newBuilder().setSeconds(10))
501  .build();
502 
503  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
504  Assignment solution = model.solveWithParameters(searchParameters);
505  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
506  assertNotNull(solution);
507  solution = model.solve(solution);
508  assertNotNull(solution);
509  assertTrue(solution.objectiveValue() >= 24 && solution.objectiveValue() <= 30);
510  for (long i = 1; i < coordinates.size(); i++) {
511  assertTrue(
512  solution.min(dimension.cumulVar(i)) >= 0 && solution.max(dimension.cumulVar(i)) <= 40);
513  }
514  }
515 
516  @Test
518  final RoutingIndexManager manager = new RoutingIndexManager(2, 1, 0);
519  assertNotNull(manager);
520  final RoutingModel model = new RoutingModel(manager);
521  assertNotNull(model);
522  final LongBinaryOperator callback = createReturnOneCallback();
523  assertTrue(
524  model.addDimension(model.registerTransitCallback(callback), 1000, 1000, true, "time"));
525  RoutingDimension dimension = model.getMutableDimension("time");
526  dimension.cumulVar(1).setMin(10);
527  dimension.setSpanCostCoefficientForAllVehicles(2);
528  assertEquals(2, dimension.getSpanCostCoefficientForVehicle(0));
529 
530  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
531  final Assignment solution = model.solve(null);
532  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
533  assertNotNull(solution);
534  assertEquals(2 * (10 + 1), solution.objectiveValue());
535  }
536 
537  @Test
539  final RoutingIndexManager manager = new RoutingIndexManager(3, 2, 0);
540  assertNotNull(manager);
541  final RoutingModel model = new RoutingModel(manager);
542  assertNotNull(model);
543  final LongBinaryOperator callback = createReturnOneCallback();
544  assertTrue(
545  model.addDimension(model.registerTransitCallback(callback), 1000, 1000, false, "time"));
546  RoutingDimension timeDimension = model.getMutableDimension("time");
547  timeDimension.cumulVar(1).setMin(10);
548  model.vehicleVar(1).setValue(0);
549  timeDimension.cumulVar(2).setMax(2);
550  model.vehicleVar(2).setValue(1);
551  timeDimension.setGlobalSpanCostCoefficient(2);
552  assertEquals(2, timeDimension.getGlobalSpanCostCoefficient());
553 
554  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
555  final Assignment solution = model.solve(null);
556  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
557  assertNotNull(solution);
558  assertEquals(2 * (11 - 1), solution.objectiveValue());
559  }
560 
561  @Test
563  final RoutingIndexManager manager = new RoutingIndexManager(2, 1, 0);
564  assertNotNull(manager);
565  final RoutingModel model = new RoutingModel(manager);
566  assertNotNull(model);
567  final LongBinaryOperator callback = createReturnOneCallback();
568  assertTrue(
569  model.addDimension(model.registerTransitCallback(callback), 1000, 1000, false, "time"));
570  RoutingDimension dimension = model.getMutableDimension("time");
571  assertEquals(1000, dimension.getCumulVarSoftUpperBound(1));
572  assertEquals(0, dimension.getCumulVarSoftUpperBoundCoefficient(1));
573  dimension.setCumulVarSoftUpperBound(1, 5, 1);
574  assertEquals(5, dimension.getCumulVarSoftUpperBound(1));
575  assertEquals(1, dimension.getCumulVarSoftUpperBoundCoefficient(1));
576  }
577 
578  @Test
580  final RoutingIndexManager manager = new RoutingIndexManager(1, 3, 0);
581  assertNotNull(manager);
582  final RoutingModel model = new RoutingModel(manager);
583  assertNotNull(model);
584  final LongBinaryOperator callback = createReturnOneCallback();
585  final long[] capacity = {5, 6, 7};
586  model.addDimensionWithVehicleCapacity(
587  model.registerTransitCallback(callback), 1000, capacity, false, "dim");
588  RoutingDimension dimension = model.getMutableDimension("dim");
589 
590  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
591  final Assignment solution = model.solve(null);
592  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
593  assertNotNull(solution);
594  for (int vehicle = 0; vehicle < 3; ++vehicle) {
595  assertEquals(vehicle + 4, solution.max(dimension.cumulVar(model.start(vehicle))));
596  assertEquals(vehicle + 5, solution.max(dimension.cumulVar(model.end(vehicle))));
597  }
598  }
599 
600  @Test
602  final RoutingIndexManager manager = new RoutingIndexManager(1, 3, 0);
603  assertNotNull(manager);
604  final RoutingModel model = new RoutingModel(manager);
605  assertNotNull(model);
606  final LongBinaryOperator[] callbacks = new LongBinaryOperator[3];
607  int[] transits = new int[3];
608  for (int i = 0; i < 3; ++i) {
609  final int value = i + 1;
610  callbacks[i] = (long firstIndex, long secondIndex) -> value;
611  transits[i] = model.registerTransitCallback(callbacks[i]);
612  }
613  long capacity = 5;
614  model.addDimensionWithVehicleTransits(transits, 1000, capacity, false, "dim");
615  RoutingDimension dimension = model.getMutableDimension("dim");
616 
617  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
618  final Assignment solution = model.solve(null);
619  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
620  assertNotNull(solution);
621  for (int vehicle = 0; vehicle < 3; ++vehicle) {
622  assertEquals(
623  capacity - (vehicle + 1), solution.max(dimension.cumulVar(model.start(vehicle))));
624  assertEquals(capacity, solution.max(dimension.cumulVar(model.end(vehicle))));
625  }
626  }
627 
628  @Test
630  final RoutingIndexManager manager = new RoutingIndexManager(1, 3, 0);
631  assertNotNull(manager);
632  final RoutingModel model = new RoutingModel(manager);
633  assertNotNull(model);
634  final LongBinaryOperator[] callbacks = new LongBinaryOperator[3];
635  final int[] transits = new int[3];
636  for (int i = 0; i < 3; ++i) {
637  final int value = i + 1;
638  callbacks[i] = (long firstIndex, long secondIndex) -> value;
639  transits[i] = model.registerTransitCallback(callbacks[i]);
640  }
641  long[] capacity = new long[3];
642  for (int i = 0; i < 3; ++i) {
643  capacity[i] = i + 5L;
644  }
645  model.addDimensionWithVehicleTransitAndCapacity(transits, 1000, capacity, false, "dim");
646  final RoutingDimension dimension = model.getMutableDimension("dim");
647 
648  assertEquals(RoutingModel.ROUTING_NOT_SOLVED, model.status());
649  final Assignment solution = model.solve(null);
650  assertEquals(RoutingModel.ROUTING_SUCCESS, model.status());
651  assertNotNull(solution);
652  for (int vehicle = 0; vehicle < 3; ++vehicle) {
653  assertEquals(4, solution.max(dimension.cumulVar(model.start(vehicle))));
654  assertEquals(vehicle + 5, solution.max(dimension.cumulVar(model.end(vehicle))));
655  }
656  }
657 
658  @Test
660  final RoutingIndexManager manager = new RoutingIndexManager(coordinates.size(), 1, 0);
661  assertNotNull(manager);
662  final RoutingModel model = new RoutingModel(manager);
663  assertNotNull(model);
664  final LongBinaryOperator manhattanCostCallback = createManhattanCostCallback(manager);
665  final int cost = model.registerTransitCallback(manhattanCostCallback);
666  model.setArcCostEvaluatorOfAllVehicles(cost);
667 
668  final LongBinaryOperator transit = (long firstIndex, long secondIndex) -> {
669  int firstNode = manager.indexToNode(firstIndex);
670  int secondNode = manager.indexToNode(secondIndex);
671  if (firstNode >= coordinates.size()) {
672  firstNode = 0;
673  }
674  if (secondNode >= coordinates.size()) {
675  secondNode = 0;
676  }
677  long distanceTime = manhattanCostCallback.applyAsLong(firstIndex, secondIndex) * 10;
678  long visitingTime = 1;
679  return distanceTime + visitingTime;
680  };
681  assertTrue(
682  model.addDimension(model.registerTransitCallback(transit), 1000, 1000, true, "time"));
683  RoutingDimension timeDimension = model.getMutableDimension("time");
684  IntVar[] cumuls = timeDimension.cumuls();
685  assertThat(cumuls).isNotEmpty();
686  IntVar[] transits = timeDimension.transits();
687  assertThat(transits).isNotEmpty();
688  IntVar[] slacks = timeDimension.slacks();
689  assertThat(slacks).isNotEmpty();
690  IntVar[] nexts = model.nexts();
691  assertThat(nexts).isNotEmpty();
692  IntVar[] vehicleVars = model.vehicleVars();
693  assertThat(vehicleVars).isNotEmpty();
694  }
695 
696  @Test
697  public void testBoundCost_ctor() {
698  // Create Routing Index Manager
699  BoundCost boundCost = new BoundCost();
700  assertNotNull(boundCost);
701  assertEquals(0, boundCost.getBound());
702  assertEquals(0, boundCost.getCost());
703 
704  boundCost = new BoundCost(/*bound=*/97, /*cost=*/101);
705  assertNotNull(boundCost);
706  assertEquals(97, boundCost.getBound());
707  assertEquals(101, boundCost.getCost());
708  }
709 
710  @Test
712  final RoutingIndexManager manager = new RoutingIndexManager(31, 7, 3);
713  assertNotNull(manager);
714  final RoutingModel model = new RoutingModel(manager);
715  assertNotNull(model);
716  final int transitIndex = model.registerTransitCallback((long fromIndex, long toIndex) -> {
717  final int fromNode = manager.indexToNode(fromIndex);
718  final int toNode = manager.indexToNode(toIndex);
719  return (long) Math.abs(toNode - fromNode);
720  });
721  assertTrue(model.addDimension(transitIndex, 100, 100, true, "Dimension"));
722  final RoutingDimension dimension = model.getMutableDimension("Dimension");
723  assertNotNull(dimension);
724  }
725 
726  @Test
728  final RoutingIndexManager manager = new RoutingIndexManager(31, 7, 3);
729  assertNotNull(manager);
730  final RoutingModel model = new RoutingModel(manager);
731  assertNotNull(model);
732  final int transitIndex = model.registerTransitCallback((long fromIndex, long toIndex) -> {
733  final int fromNode = manager.indexToNode(fromIndex);
734  final int toNode = manager.indexToNode(toIndex);
735  return (long) Math.abs(toNode - fromNode);
736  });
737  assertTrue(model.addDimension(transitIndex, 100, 100, true, "Dimension"));
738  final RoutingDimension dimension = model.getMutableDimension("Dimension");
739 
740  final BoundCost boundCost = new BoundCost(/*bound=*/97, /*cost=*/101);
741  assertNotNull(boundCost);
742  assertFalse(dimension.hasSoftSpanUpperBounds());
743  for (int v : IntStream.range(0, manager.getNumberOfVehicles()).toArray()) {
744  dimension.setSoftSpanUpperBoundForVehicle(boundCost, v);
745  final BoundCost bc = dimension.getSoftSpanUpperBoundForVehicle(v);
746  assertNotNull(bc);
747  assertEquals(97, bc.getBound());
748  assertEquals(101, bc.getCost());
749  }
750  assertTrue(dimension.hasSoftSpanUpperBounds());
751  }
752 
753  @Test
755  final RoutingIndexManager manager = new RoutingIndexManager(31, 7, 3);
756  assertNotNull(manager);
757  final RoutingModel model = new RoutingModel(manager);
758  assertNotNull(model);
759  final int transitIndex = model.registerTransitCallback((long fromIndex, long toIndex) -> {
760  final int fromNode = manager.indexToNode(fromIndex);
761  final int toNode = manager.indexToNode(toIndex);
762  return (long) Math.abs(toNode - fromNode);
763  });
764  assertTrue(model.addDimension(transitIndex, 100, 100, true, "Dimension"));
765  final RoutingDimension dimension = model.getMutableDimension("Dimension");
766 
767  final BoundCost boundCost = new BoundCost(/*bound=*/97, /*cost=*/101);
768  assertNotNull(boundCost);
769  assertFalse(dimension.hasQuadraticCostSoftSpanUpperBounds());
770  for (int v : IntStream.range(0, manager.getNumberOfVehicles()).toArray()) {
771  dimension.setQuadraticCostSoftSpanUpperBoundForVehicle(boundCost, v);
772  final BoundCost bc = dimension.getQuadraticCostSoftSpanUpperBoundForVehicle(v);
773  assertNotNull(bc);
774  assertEquals(97, bc.getBound());
775  assertEquals(101, bc.getCost());
776  }
777  assertTrue(dimension.hasQuadraticCostSoftSpanUpperBounds());
778  }
779 }
Load native libraries needed for using ortools-java.
Definition: Loader.java:33
static synchronized void loadNativeLibraries()
Definition: Loader.java:104
LongBinaryOperator createManhattanCostCallback(RoutingIndexManager manager)
LongUnaryOperator createUnaryCostCallback(RoutingIndexManager manager)