diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/MeetTimeWindowConstraint_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/MeetTimeWindowConstraint_IT.java index 229687e0..c26301c2 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/MeetTimeWindowConstraint_IT.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/MeetTimeWindowConstraint_IT.java @@ -29,9 +29,14 @@ import jsprit.core.problem.job.Job; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.vehicle.Vehicle; +import jsprit.core.util.FastVehicleRoutingTransportCostsMatrix; import jsprit.core.util.Solutions; import org.junit.Test; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -544,6 +549,34 @@ public class MeetTimeWindowConstraint_IT { assertTrue(containsJob(vrp.getJobs().get("2"), getRoute("19", Solutions.bestOf(solutions)))); } + @Test + public void driverTimesShouldBeMet() throws IOException { + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpBuilder).read("src/test/resources/twbug.xml"); + final FastVehicleRoutingTransportCostsMatrix matrix = createMatrix(); + vrpBuilder.setRoutingCost(matrix); + VehicleRoutingProblem vrp = vrpBuilder.build(); + VehicleRoutingAlgorithm algorithm = Jsprit.Builder.newInstance(vrp).buildAlgorithm(); + algorithm.setMaxIterations(1000); + VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions()); + for(VehicleRoute r : solution.getRoutes()){ + assertTrue(r.getVehicle().getEarliestDeparture() <= r.getDepartureTime()); + assertTrue(r.getVehicle().getLatestArrival() >= r.getEnd().getArrTime()); + } + } + + private FastVehicleRoutingTransportCostsMatrix createMatrix() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/matrix.txt"))); + String line; + FastVehicleRoutingTransportCostsMatrix.Builder builder = FastVehicleRoutingTransportCostsMatrix.Builder.newInstance(11,false); + while((line = reader.readLine()) != null){ + String[] split = line.split("\t"); + builder.addTransportDistance(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Double.parseDouble(split[2])); + builder.addTransportTime(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Double.parseDouble(split[3])); + } + return builder.build(); + } + private boolean containsJob(Job job, VehicleRoute route) { if (route == null) return false; diff --git a/jsprit-core/src/test/resources/matrix.txt b/jsprit-core/src/test/resources/matrix.txt new file mode 100644 index 00000000..b531634c --- /dev/null +++ b/jsprit-core/src/test/resources/matrix.txt @@ -0,0 +1,121 @@ +0 0 0.0 0.0 +0 1 7641.0 394.0 +0 2 7244.0 370.0 +0 3 15236.0 747.0 +0 4 7841.0 452.0 +0 5 7013.0 388.0 +0 6 3336.0 232.0 +0 7 6729.0 364.0 +0 8 22401.0 918.0 +0 9 16830.0 772.0 +0 10 8311.0 434.0 +1 0 7463.0 381.0 +1 1 0.0 0.0 +1 2 1605.0 90.0 +1 3 8336.0 380.0 +1 4 4949.0 304.0 +1 5 3632.0 221.0 +1 6 5611.0 324.0 +1 7 3407.0 212.0 +1 8 29674.0 1216.0 +1 9 9378.0 513.0 +1 10 633.0 42.0 +2 0 5857.0 291.0 +2 1 1366.0 78.0 +2 2 0.0 0.0 +2 3 8961.0 431.0 +2 4 5346.0 325.0 +2 5 1994.0 144.0 +2 6 4006.0 234.0 +2 7 1802.0 122.0 +2 8 28069.0 1126.0 +2 9 9809.0 536.0 +2 10 2035.0 118.0 +3 0 15179.0 645.0 +3 1 7322.0 329.0 +3 2 7534.0 364.0 +3 3 0.0 0.0 +3 4 10908.0 483.0 +3 5 9605.0 470.0 +3 6 13327.0 588.0 +3 7 9336.0 486.0 +3 8 36409.0 1438.0 +3 9 4130.0 236.0 +3 10 6404.0 321.0 +4 0 7652.0 457.0 +4 1 4611.0 288.0 +4 2 4948.0 303.0 +4 3 10982.0 539.0 +4 4 0.0 0.0 +4 5 6942.0 447.0 +4 6 6199.0 415.0 +4 7 6750.0 425.0 +4 8 29970.0 1270.0 +4 9 10932.0 566.0 +4 10 4384.0 277.0 +5 0 4845.0 284.0 +5 1 3010.0 187.0 +5 2 2612.0 163.0 +5 3 10784.0 530.0 +5 4 6990.0 435.0 +5 5 0.0 0.0 +5 6 2964.0 219.0 +5 7 819.0 68.0 +5 8 27332.0 1124.0 +5 9 13064.0 615.0 +5 10 3679.0 227.0 +6 0 2952.0 209.0 +6 1 5089.0 297.0 +6 2 4691.0 273.0 +6 3 12684.0 650.0 +6 4 6489.0 430.0 +6 5 4460.0 291.0 +6 6 0.0 0.0 +6 7 4176.0 267.0 +6 8 25472.0 1083.0 +6 9 14278.0 675.0 +6 10 5758.0 337.0 +7 0 4334.0 253.0 +7 1 2956.0 182.0 +7 2 2559.0 158.0 +7 3 10551.0 535.0 +7 4 6936.0 429.0 +7 5 2081.0 162.0 +7 6 2453.0 188.0 +7 7 0.0 0.0 +7 8 26821.0 1092.0 +7 9 13010.0 610.0 +7 10 3625.0 222.0 +8 0 22667.0 926.0 +8 1 29281.0 1189.0 +8 2 28884.0 1165.0 +8 3 37504.0 1484.0 +8 4 29608.0 1240.0 +8 5 28008.0 1174.0 +8 6 25198.0 1063.0 +8 7 27518.0 1151.0 +8 8 0.0 0.0 +8 9 36799.0 1529.0 +8 10 29950.0 1230.0 +9 0 15604.0 722.0 +9 1 8945.0 492.0 +9 2 9283.0 507.0 +9 3 3730.0 212.0 +9 4 11018.0 594.0 +9 5 12864.0 633.0 +9 6 13753.0 665.0 +9 7 12558.0 607.0 +9 8 36821.0 1553.0 +9 9 0.0 0.0 +9 10 8307.0 472.0 +10 0 7591.0 404.0 +10 1 1117.0 81.0 +10 2 1733.0 113.0 +10 3 7844.0 354.0 +10 4 5077.0 327.0 +10 5 3914.0 243.0 +10 6 5739.0 347.0 +10 7 3535.0 235.0 +10 8 29802.0 1239.0 +10 9 8906.0 493.0 +10 10 0.0 0.0 diff --git a/jsprit-core/src/test/resources/twbug.xml b/jsprit-core/src/test/resources/twbug.xml new file mode 100644 index 00000000..83c9ef42 --- /dev/null +++ b/jsprit-core/src/test/resources/twbug.xml @@ -0,0 +1,407 @@ + + + + FINITE + + + + vehicle0 + vehicle_type_0 + + v0_start + 0 + + + v0_start + 0 + + + 60.0 + 18060.0 + + true + primemover + + + vehicle1 + vehicle_type_1 + + v1_start + 0 + + + v1_start + 0 + + + 60.0 + 18060.0 + + true + primemover + + + vehicle2 + vehicle_type_2 + + v2_start + 0 + + + v2_start + 0 + + + 7200.0 + 36060.0 + + true + primemover + + + vehicle3 + vehicle_type_3 + + v3_start + 0 + + + v3_start + 0 + + + 36000.0 + 54060.0 + + true + primemover + + + vehicle4 + vehicle_type_4 + + v4_start + 0 + + + v4_start + 0 + + + 36000.0 + 54060.0 + + true + primemover + + + + + vehicle_type_0 + + 20 + + + 0.0 + 0.0 + + + + + vehicle_type_1 + + 20 + + + 0.0 + 0.0 + + + + + vehicle_type_2 + + 20 + + + 0.0 + 0.0 + + + + + vehicle_type_3 + + 20 + + + 0.0 + 0.0 + + + + + vehicle_type_4 + + 20 + + + 0.0 + 0.0 + + + + + + + + js0 + 1 + + + 1 + + 600.0 + + + 0.0 + 1800.0 + + + Test + + + + js2 + 2 + + + 2 + + 600.0 + + + 5400.0 + 7200.0 + + + Test + + + + js5 + 3 + + + 10 + + 1800.0 + + + 17100.0 + 18000.0 + + + Test + + + + js6 + 4 + + + 2 + + 900.0 + + + 0.0 + 1.7976931348623157E308 + + + Test + + + + js8 + 5 + + + 4 + + 600.0 + + + 0.0 + 1.7976931348623157E308 + + + Test + + + + js10 + 6 + + + 10 + + 1500.0 + + + 29700.0 + 32400.0 + + + Test + + + + jsp3 + 7 + + + 0 + + 5594.0 + + + 0.0 + 1.7976931348623157E308 + + + Test + + + + + + + jsp1 + 1 + + 900.0 + + + 0.0 + 1.7976931348623157E308 + + + + + + jsd1 + 8 + + 900.0 + + + 0.0 + 1.7976931348623157E308 + + + + + 0 + + Test + + + + + jsp4 + 9 + + 1200.0 + + + 21600.0 + 23400.0 + + + + + + jsd4 + 8 + + 900.0 + + + 25200.0 + 27000.0 + + + + + 0 + + Test + + + + + jsp7 + 9 + + 1200.0 + + + 37800.0 + 41400.0 + + + + + + jsd7 + 8 + + 1800.0 + + + 43200.0 + 45900.0 + + + + + 0 + + Test + + + + + jsp9 + 10 + + 300.0 + + + 45000.0 + 48600.0 + + + + + + jsd9 + 8 + + 300.0 + + + 50400.0 + 52200.0 + + + + + 0 + + Test + + +