From 818cf7aaba0230691e9c64f83b4dffd30e8d5c15 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Mon, 6 Oct 2014 11:54:06 +0200 Subject: [PATCH] add, test and illustrate twViolation --- .../core/analysis/SolutionAnalyser.java | 7 +- .../core/analysis/SolutionAnalyserTest.java | 197 +++++++++++++++++- .../examples/VRPWithBackhaulsExample2.java | 5 + 3 files changed, 205 insertions(+), 4 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/analysis/SolutionAnalyser.java b/jsprit-core/src/main/java/jsprit/core/analysis/SolutionAnalyser.java index 92a249fd..0964f6f9 100644 --- a/jsprit-core/src/main/java/jsprit/core/analysis/SolutionAnalyser.java +++ b/jsprit-core/src/main/java/jsprit/core/analysis/SolutionAnalyser.java @@ -71,7 +71,7 @@ public class SolutionAnalyser { // // } - private static class SumUpWaitingTimes implements StateUpdater, ActivityVisitor { + private static class SumUpActivityTimes implements StateUpdater, ActivityVisitor { private StateId waiting_time_id; @@ -97,7 +97,7 @@ public class SolutionAnalyser { double prevActDeparture; - private SumUpWaitingTimes(StateId waiting_time_id, StateId transport_time_id, StateId service_time_id, StateId too_late_id, StateManager stateManager, ActivityTimeTracker.ActivityPolicy activityPolicy) { + private SumUpActivityTimes(StateId waiting_time_id, StateId transport_time_id, StateId service_time_id, StateId too_late_id, StateManager stateManager, ActivityTimeTracker.ActivityPolicy activityPolicy) { this.waiting_time_id = waiting_time_id; this.transport_time_id = transport_time_id; this.service_time_id = service_time_id; @@ -139,6 +139,7 @@ public class SolutionAnalyser { @Override public void finish() { sum_transport_time += route.getEnd().getArrTime() - prevActDeparture; + sum_too_late += Math.max(0, route.getEnd().getArrTime() - route.getEnd().getTheoreticalLatestOperationStartTime()); stateManager.putRouteState(route,transport_time_id,sum_transport_time); stateManager.putRouteState(route,waiting_time_id,sum_waiting_time); stateManager.putRouteState(route,service_time_id,sum_service_time); @@ -305,7 +306,7 @@ public class SolutionAnalyser { // if(stateManager.timeWindowUpdateIsActivated()){ // activityPolicy = ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS; // } - stateManager.addStateUpdater(new SumUpWaitingTimes(waiting_time_id, transport_time_id, service_time_id,too_late_id , stateManager, activityPolicy)); + stateManager.addStateUpdater(new SumUpActivityTimes(waiting_time_id, transport_time_id, service_time_id,too_late_id , stateManager, activityPolicy)); stateManager.addStateUpdater(new DistanceUpdater(distance_id,stateManager,distanceCalculator)); // hardRouteConstraints = getHardRouteConstraints(constraintManager); // hardActivityConstraints = getHardActivityConstrains(constraintManager); diff --git a/jsprit-core/src/test/java/jsprit/core/analysis/SolutionAnalyserTest.java b/jsprit-core/src/test/java/jsprit/core/analysis/SolutionAnalyserTest.java index c0832588..e719d1f3 100644 --- a/jsprit-core/src/test/java/jsprit/core/analysis/SolutionAnalyserTest.java +++ b/jsprit-core/src/test/java/jsprit/core/analysis/SolutionAnalyserTest.java @@ -1075,6 +1075,195 @@ public class SolutionAnalyserTest { } } + @Test + public void timeWindowViolation_shouldWork(){ + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolation(route); + assertEquals(0.,violation,0.01); + } + + @Test + public void timeWindowViolation_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolation(route); + assertEquals((2+26+57+77+90+114+144+20),violation,0.01); + } + + @Test + public void timeWindowViolationAtStart_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getStart(), route); + assertEquals(0.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct1_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(0),route); + assertEquals(0.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct2_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(1),route); + assertEquals(2.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct3_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(2),route); + assertEquals(26.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct4_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(3),route); + assertEquals(57.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct5_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(4),route); + assertEquals(77.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct6_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(5),route); + assertEquals(90.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct7_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(6),route); + assertEquals(114.,violation,0.01); + } + + @Test + public void timeWindowViolationAtAct8_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getActivities().get(7),route); + assertEquals(144.,violation,0.01); + } + + @Test + public void timeWindowViolationAtEnd_shouldWorkWhenViolated(){ + buildAnotherScenarioWithOnlyOneVehicleAndWithoutAnyConstraintsBefore(); + SolutionPrinter.print(vrp,solution, SolutionPrinter.Print.VERBOSE); + + SolutionAnalyser analyser = new SolutionAnalyser(vrp,solution, new SolutionAnalyser.DistanceCalculator() { + @Override + public double getDistance(String fromLocationId, String toLocationId) { + return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); + } + }); + VehicleRoute route = solution.getRoutes().iterator().next(); + Double violation = analyser.getTimeWindowViolationAtActivity(route.getEnd(),route); + assertEquals(20.,violation,0.01); + } + @Test public void testRealViolation(){ assertFalse(true); @@ -1086,7 +1275,9 @@ public class SolutionAnalyserTest { VehicleType type = VehicleTypeImpl.Builder.newInstance("type").setFixedCost(100.).setCostPerDistance(2.).addCapacityDimension(0, 15).build(); VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v1").setType(type) - .setStartLocationCoordinate(Coordinate.newInstance(-5, 0)).build(); + .setStartLocationCoordinate(Coordinate.newInstance(-5, 0)) + .setLatestArrival(150.) + .build(); Pickup s1 = (Pickup) Pickup.Builder.newInstance("s1") .setTimeWindow(TimeWindow.newInstance(10, 20)) @@ -1095,11 +1286,13 @@ public class SolutionAnalyserTest { .build(); Delivery s2 = (Delivery) Delivery.Builder.newInstance("s2") .setCoord(Coordinate.newInstance(-10, 10)) + .setTimeWindow(TimeWindow.newInstance(10, 20)) .addSizeDimension(0, 20) .build(); Shipment shipment1 = Shipment.Builder.newInstance("ship1").setPickupCoord(Coordinate.newInstance(-15, 2)).setDeliveryCoord(Coordinate.newInstance(-16, 5)) .addSizeDimension(0, 15) .setPickupServiceTime(20.).setDeliveryServiceTime(20.) + .setPickupTimeWindow(TimeWindow.newInstance(10,20)).setDeliveryTimeWindow(TimeWindow.newInstance(10,20)) .build(); Pickup s3 = (Pickup) Pickup.Builder.newInstance("s3") @@ -1109,10 +1302,12 @@ public class SolutionAnalyserTest { .build(); Delivery s4 = (Delivery) Delivery.Builder.newInstance("s4").setCoord(Coordinate.newInstance(10, 10)) .addSizeDimension(0, 20) + .setTimeWindow(TimeWindow.newInstance(10, 20)) .build(); Shipment shipment2 = Shipment.Builder.newInstance("ship2").setPickupCoord(Coordinate.newInstance(15, 2)) .setPickupServiceTime(20.).setDeliveryServiceTime(20.) .setDeliveryCoord(Coordinate.newInstance(16, 5)) + .setPickupTimeWindow(TimeWindow.newInstance(10, 20)).setDeliveryTimeWindow(TimeWindow.newInstance(10, 20)) .addSizeDimension(0, 15).build(); VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance().addVehicle(vehicle) diff --git a/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample2.java b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample2.java index 0d86ec06..52cde060 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample2.java +++ b/jsprit-examples/src/main/java/jsprit/examples/VRPWithBackhaulsExample2.java @@ -135,8 +135,11 @@ public class VRPWithBackhaulsExample2 { System.out.println("capViolationOnRoute: " + analyser.getCapacityViolation(route)); System.out.println("capViolation@beginning: " + analyser.getCapacityViolationAtBeginning(route)); System.out.println("capViolation@end: " + analyser.getCapacityViolationAtEnd(route)); + System.out.println("timeWindowViolationOnRoute: " + analyser.getTimeWindowViolation(route)); + System.out.println("dist@" + route.getStart().getLocationId() + ": " + analyser.getDistanceAtActivity(route.getStart(),route)); + System.out.println("timeWindowViolation@" + route.getStart().getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(route.getStart(), route)); for(TourActivity act : route.getActivities()){ System.out.println("--"); System.out.println("actType: " + act.getName() + " demand: " + act.getSize()); @@ -146,9 +149,11 @@ public class VRPWithBackhaulsExample2 { System.out.println("tooLate@" + act.getLocationId() + ": " + analyser.getLateArrivalTimesAtActivity(act, route)); System.out.println("transportCosts@" + act.getLocationId() + ": " + analyser.getVariableTransportCostsAtActivity(act,route)); System.out.println("capViolation(after)@" + act.getLocationId() + ": " + analyser.getCapacityViolationAfterActivity(act,route)); + System.out.println("timeWindowViolation@" + act.getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(act,route)); } System.out.println("--"); System.out.println("dist@" + route.getEnd().getLocationId() + ": " + analyser.getDistanceAtActivity(route.getEnd(),route)); + System.out.println("timeWindowViolation@" + route.getEnd().getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(route.getEnd(),route)); } }