14 package com.google.ortools.constraintsolver;
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;
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;
37 abstract static class Location {
38 static Location create(Integer latitude, Integer longitude) {
39 return new AutoValue_RoutingSolverTest_Location(latitude, longitude);
41 abstract Integer latitude();
42 abstract Integer longitude();
44 private ArrayList<Location> coordinates;
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));
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());
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());
77 return (
long i,
long j) -> 1;
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);
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);
92 model.registerTransitCallback(transit);
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)));
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)));
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)));
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)));
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());
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();
169 final int cost = model.registerTransitCallback(callback);
171 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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());
188 final int cost = model.registerTransitCallback(callback);
190 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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 = {
213 final int cost = model.registerTransitMatrix(matrix);
215 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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());
233 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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);
255 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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);
274 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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());
292 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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);
313 model.setArcCostEvaluatorOfAllVehicles(cost);
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());
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);
330 long[][] routes =
new long[vehicles][];
331 for (
int i = 0; i < vehicles; ++i) {
333 routes[i] =
new long[1];
334 routes[i][0] = manager.nodeToIndex(i + 1);
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));
346 final RoutingIndexManager manager =
new RoutingIndexManager(coordinates.size(), 1, 0);
347 assertNotNull(manager);
348 final RoutingModel model =
new RoutingModel(manager);
349 assertNotNull(model);
351 final int cost = model.registerTransitCallback(callback);
352 model.setArcCostEvaluatorOfAllVehicles(cost);
354 int[] a =
new int[2];
357 int[] b =
new int[1];
359 int[] c =
new int[1];
361 model.addDisjunction(manager.nodesToIndices(a));
362 model.addDisjunction(manager.nodesToIndices(b));
363 model.addDisjunction(manager.nodesToIndices(c));
365 Assignment solution = model.solve(
null);
366 assertEquals(8, solution.objectiveValue());
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,
379 assertEquals(1, pair.getFirst());
380 assertTrue(pair.getSecond());
381 RoutingDimension dimension = model.getMutableDimension(
"Dimension");
382 dimension.setSpanCostCoefficientForAllVehicles(2);
384 RoutingSearchParameters searchParameters =
385 main.defaultRoutingSearchParameters()
387 .setTimeLimit(Duration.newBuilder().setSeconds(10))
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());
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,
408 assertEquals(1, pair.getFirst());
409 assertTrue(pair.getSecond());
411 model.setArcCostEvaluatorOfAllVehicles(pair.getFirst());
413 RoutingSearchParameters searchParameters =
414 main.defaultRoutingSearchParameters()
416 .setTimeLimit(Duration.newBuilder().setSeconds(10))
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());
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 = {
440 final IntBoolPair pair = model.addMatrixDimension(matrix,
443 assertEquals(1, pair.getFirst());
444 assertTrue(pair.getSecond());
446 model.setArcCostEvaluatorOfAllVehicles(pair.getFirst());
448 final RoutingSearchParameters searchParameters =
449 main.defaultRoutingSearchParameters()
451 .setTimeLimit(Duration.newBuilder().setSeconds(10))
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());
463 final RoutingIndexManager manager =
new RoutingIndexManager(coordinates.size(), 1, 0);
464 assertNotNull(manager);
465 final RoutingModel model =
new RoutingModel(manager);
466 assertNotNull(model);
468 final int cost = model.registerTransitCallback(manhattanCostCallback);
469 model.setArcCostEvaluatorOfAllVehicles(cost);
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()) {
477 if (secondNode >= coordinates.size()) {
480 long distanceTime = manhattanCostCallback.applyAsLong(firstIndex, secondIndex) * 10;
481 long visitingTime = 1;
482 return distanceTime + visitingTime;
485 model.addDimension(model.registerTransitCallback(transit), 1000, 1000,
true,
"time"));
486 RoutingDimension dimension = model.getMutableDimension(
"time");
488 for (
int i = 1; i < coordinates.size(); i++) {
489 int[] a =
new int[1];
491 model.addDisjunction(manager.nodesToIndices(a), 10);
493 dimension.cumulVar(i).setMin(0);
494 dimension.cumulVar(i).setMax(40);
497 RoutingSearchParameters searchParameters =
498 main.defaultRoutingSearchParameters()
500 .setTimeLimit(Duration.newBuilder().setSeconds(10))
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++) {
512 solution.min(dimension.cumulVar(i)) >= 0 && solution.max(dimension.cumulVar(i)) <= 40);
518 final RoutingIndexManager manager =
new RoutingIndexManager(2, 1, 0);
519 assertNotNull(manager);
520 final RoutingModel model =
new RoutingModel(manager);
521 assertNotNull(model);
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));
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());
539 final RoutingIndexManager manager =
new RoutingIndexManager(3, 2, 0);
540 assertNotNull(manager);
541 final RoutingModel model =
new RoutingModel(manager);
542 assertNotNull(model);
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());
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());
563 final RoutingIndexManager manager =
new RoutingIndexManager(2, 1, 0);
564 assertNotNull(manager);
565 final RoutingModel model =
new RoutingModel(manager);
566 assertNotNull(model);
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));
580 final RoutingIndexManager manager =
new RoutingIndexManager(1, 3, 0);
581 assertNotNull(manager);
582 final RoutingModel model =
new RoutingModel(manager);
583 assertNotNull(model);
585 final long[] capacity = {5, 6, 7};
586 model.addDimensionWithVehicleCapacity(
587 model.registerTransitCallback(callback), 1000, capacity,
false,
"dim");
588 RoutingDimension dimension = model.getMutableDimension(
"dim");
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))));
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]);
614 model.addDimensionWithVehicleTransits(transits, 1000, capacity,
false,
"dim");
615 RoutingDimension dimension = model.getMutableDimension(
"dim");
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) {
623 capacity - (vehicle + 1), solution.max(dimension.cumulVar(model.start(vehicle))));
624 assertEquals(capacity, solution.max(dimension.cumulVar(model.end(vehicle))));
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]);
641 long[] capacity =
new long[3];
642 for (
int i = 0; i < 3; ++i) {
643 capacity[i] = i + 5L;
645 model.addDimensionWithVehicleTransitAndCapacity(transits, 1000, capacity,
false,
"dim");
646 final RoutingDimension dimension = model.getMutableDimension(
"dim");
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))));
660 final RoutingIndexManager manager =
new RoutingIndexManager(coordinates.size(), 1, 0);
661 assertNotNull(manager);
662 final RoutingModel model =
new RoutingModel(manager);
663 assertNotNull(model);
665 final int cost = model.registerTransitCallback(manhattanCostCallback);
666 model.setArcCostEvaluatorOfAllVehicles(cost);
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()) {
674 if (secondNode >= coordinates.size()) {
677 long distanceTime = manhattanCostCallback.applyAsLong(firstIndex, secondIndex) * 10;
678 long visitingTime = 1;
679 return distanceTime + visitingTime;
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();
699 BoundCost boundCost =
new BoundCost();
700 assertNotNull(boundCost);
701 assertEquals(0, boundCost.getBound());
702 assertEquals(0, boundCost.getCost());
704 boundCost =
new BoundCost(97, 101);
705 assertNotNull(boundCost);
706 assertEquals(97, boundCost.getBound());
707 assertEquals(101, boundCost.getCost());
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);
721 assertTrue(model.addDimension(transitIndex, 100, 100,
true,
"Dimension"));
722 final RoutingDimension dimension = model.getMutableDimension(
"Dimension");
723 assertNotNull(dimension);
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);
737 assertTrue(model.addDimension(transitIndex, 100, 100,
true,
"Dimension"));
738 final RoutingDimension dimension = model.getMutableDimension(
"Dimension");
740 final BoundCost boundCost =
new BoundCost(97, 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);
747 assertEquals(97, bc.getBound());
748 assertEquals(101, bc.getCost());
750 assertTrue(dimension.hasSoftSpanUpperBounds());
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);
764 assertTrue(model.addDimension(transitIndex, 100, 100,
true,
"Dimension"));
765 final RoutingDimension dimension = model.getMutableDimension(
"Dimension");
767 final BoundCost boundCost =
new BoundCost(97, 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);
774 assertEquals(97, bc.getBound());
775 assertEquals(101, bc.getCost());
777 assertTrue(dimension.hasQuadraticCostSoftSpanUpperBounds());