1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

add solution stats

This commit is contained in:
oblonski 2014-10-07 15:29:22 +02:00
parent 6d7087f8ca
commit 682c0b5083
3 changed files with 246 additions and 126 deletions

View file

@ -17,9 +17,11 @@
package jsprit.core.analysis; package jsprit.core.analysis;
import jsprit.core.algorithm.VariablePlusFixedSolutionCostCalculatorFactory;
import jsprit.core.algorithm.state.*; import jsprit.core.algorithm.state.*;
import jsprit.core.problem.Capacity; import jsprit.core.problem.Capacity;
import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.solution.SolutionCostCalculator;
import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.solution.VehicleRoutingProblemSolution;
import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.VehicleRoute;
import jsprit.core.problem.solution.route.activity.*; import jsprit.core.problem.solution.route.activity.*;
@ -27,16 +29,16 @@ import jsprit.core.util.ActivityTimeTracker;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.util.*; import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/** /**
* * Calculates a set of statistics for a solution.
*/ */
public class SolutionAnalyser { public class SolutionAnalyser {
public static interface DistanceCalculator { public static interface DistanceCalculator {
public double getDistance(String fromLocationId, String toLocationId); public double getDistance(String fromLocationId, String toLocationId);
@ -290,34 +292,66 @@ public class SolutionAnalyser {
private VehicleRoutingProblem vrp; private VehicleRoutingProblem vrp;
private List<VehicleRoute> routes;
private StateManager stateManager; private StateManager stateManager;
private DistanceCalculator distanceCalculator; private DistanceCalculator distanceCalculator;
private final StateId waiting_time_id; private StateId waiting_time_id;
private final StateId transport_time_id; private StateId transport_time_id;
private final StateId service_time_id; private StateId service_time_id;
private final StateId distance_id; private StateId distance_id;
private final StateId too_late_id; private StateId too_late_id;
private final StateId shipment_id; private StateId shipment_id;
private final StateId backhaul_id; private StateId backhaul_id;
private final StateId skill_id; private StateId skill_id;
private ActivityTimeTracker.ActivityPolicy activityPolicy; private ActivityTimeTracker.ActivityPolicy activityPolicy;
private final SolutionCostCalculator solutionCostCalculator;
private Double tp_distance;
private Double tp_time;
private Double waiting_time;
private Double service_time;
private Double operation_time;
private Double tw_violation;
private Capacity cap_violation;
private Double fixed_costs;
private Double variable_transport_costs;
private Boolean hasSkillConstraintViolation;
private Boolean hasBackhaulConstraintViolation;
private Boolean hasShipmentConstraintViolation;
private Double total_costs;
private VehicleRoutingProblemSolution solution;
public SolutionAnalyser(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, DistanceCalculator distanceCalculator) { public SolutionAnalyser(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, DistanceCalculator distanceCalculator) {
this.vrp = vrp; this.vrp = vrp;
this.routes = new ArrayList<VehicleRoute>(solution.getRoutes()); this.solution = solution;
this.distanceCalculator = distanceCalculator;
initialise();
this.solutionCostCalculator = new VariablePlusFixedSolutionCostCalculatorFactory(stateManager).createCalculator();
refreshStates();
}
public SolutionAnalyser(VehicleRoutingProblem vrp, VehicleRoutingProblemSolution solution, SolutionCostCalculator solutionCostCalculator, DistanceCalculator distanceCalculator) {
this.vrp = vrp;
this.solution = solution;
this.distanceCalculator = distanceCalculator;
this.solutionCostCalculator = solutionCostCalculator;
initialise();
refreshStates();
}
private void initialise() {
this.stateManager = new StateManager(vrp); this.stateManager = new StateManager(vrp);
this.stateManager.updateTimeWindowStates(); this.stateManager.updateTimeWindowStates();
this.stateManager.updateLoadStates(); this.stateManager.updateLoadStates();
@ -325,7 +359,6 @@ public class SolutionAnalyser {
activityPolicy = ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS; activityPolicy = ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS;
this.stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(),activityPolicy)); this.stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(),activityPolicy));
this.stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(),vrp.getTransportCosts(),stateManager)); this.stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(),vrp.getTransportCosts(),stateManager));
this.distanceCalculator = distanceCalculator;
waiting_time_id = stateManager.createStateId("waiting-time"); waiting_time_id = stateManager.createStateId("waiting-time");
transport_time_id = stateManager.createStateId("transport-time"); transport_time_id = stateManager.createStateId("transport-time");
service_time_id = stateManager.createStateId("service-time"); service_time_id = stateManager.createStateId("service-time");
@ -338,21 +371,54 @@ public class SolutionAnalyser {
stateManager.addStateUpdater(new DistanceUpdater(distance_id,stateManager,distanceCalculator)); stateManager.addStateUpdater(new DistanceUpdater(distance_id,stateManager,distanceCalculator));
stateManager.addStateUpdater(new BackhaulAndShipmentUpdater(backhaul_id,shipment_id,stateManager)); stateManager.addStateUpdater(new BackhaulAndShipmentUpdater(backhaul_id,shipment_id,stateManager));
stateManager.addStateUpdater(new SkillUpdater(stateManager,skill_id)); stateManager.addStateUpdater(new SkillUpdater(stateManager,skill_id));
refreshStates();
} }
private void refreshStates(){ private void refreshStates(){
stateManager.clear(); stateManager.clear();
stateManager.informInsertionStarts(routes,null); stateManager.informInsertionStarts(solution.getRoutes(),null);
clearSolutionIndicators();
recalculateSolutionIndicators();
} }
// private void recalculateSolutionIndicators() {
// public void informRouteChanged(VehicleRoute route){ for(VehicleRoute route : solution.getRoutes()){
// update(route); tp_distance += getDistance(route);
// } tp_time += getTransportTime(route);
// waiting_time += getWaitingTime(route);
// service_time += getServiceTime(route);
operation_time += getOperationTime(route);
tw_violation += getTimeWindowViolation(route);
cap_violation = Capacity.addup(cap_violation,getCapacityViolation(route));
fixed_costs += getFixedCosts(route);
variable_transport_costs += getVariableTransportCosts(route);
if(hasSkillConstraintViolation(route)) hasSkillConstraintViolation = true;
if(hasShipmentConstraintViolation(route)) hasShipmentConstraintViolation = true;
if(hasBackhaulConstraintViolation(route)) hasBackhaulConstraintViolation = true;
}
total_costs = solutionCostCalculator.getCosts(this.solution);
}
private void clearSolutionIndicators() {
tp_distance = 0.;
tp_time = 0.;
waiting_time = 0.;
service_time = 0.;
operation_time = 0.;
tw_violation = 0.;
cap_violation = Capacity.Builder.newInstance().build();
fixed_costs = 0.;
variable_transport_costs = 0.;
total_costs = 0.;
hasBackhaulConstraintViolation = false;
hasShipmentConstraintViolation = false;
hasSkillConstraintViolation = false;
}
public void informSolutionChanged(VehicleRoutingProblemSolution newSolution){
this.solution = newSolution;
refreshStates();
}
/** /**
* @param route to get the load at beginning from * @param route to get the load at beginning from
@ -495,7 +561,7 @@ public class SolutionAnalyser {
* @return true if skill constraint is violated, i.e. if vehicle does not have the required skills to conduct all * @return true if skill constraint is violated, i.e. if vehicle does not have the required skills to conduct all
* activities on the specified route. Returns null if route is null or skill state cannot be found. * activities on the specified route. Returns null if route is null or skill state cannot be found.
*/ */
public Boolean skillConstraintIsViolated(VehicleRoute route){ public Boolean hasSkillConstraintViolation(VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing."); if(route == null) throw new IllegalStateException("route is missing.");
return stateManager.getRouteState(route, skill_id, Boolean.class); return stateManager.getRouteState(route, skill_id, Boolean.class);
} }
@ -507,7 +573,7 @@ public class SolutionAnalyser {
* if specified route or activity is null or if route does not contain specified activity or if skill state connot be * if specified route or activity is null or if route does not contain specified activity or if skill state connot be
* found. If specified activity is Start or End, it returns false. * found. If specified activity is Start or End, it returns false.
*/ */
public Boolean skillConstraintIsViolatedAtActivity(TourActivity activity, VehicleRoute route){ public Boolean hasSkillConstraintViolationAtActivity(TourActivity activity, VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing."); if(route == null) throw new IllegalStateException("route is missing.");
if(activity == null) throw new IllegalStateException("activity is missing."); if(activity == null) throw new IllegalStateException("activity is missing.");
if(activity instanceof Start) return false; if(activity instanceof Start) return false;
@ -526,7 +592,7 @@ public class SolutionAnalyser {
* @return true if backhaul constraint for specified route is violated. returns null if route is null or no backhaul * @return true if backhaul constraint for specified route is violated. returns null if route is null or no backhaul
* state can be found. In latter case try routeChanged(route). * state can be found. In latter case try routeChanged(route).
*/ */
public Boolean backhaulConstraintIsViolated(VehicleRoute route){ public Boolean hasBackhaulConstraintViolation(VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing."); if(route == null) throw new IllegalStateException("route is missing.");
return stateManager.getRouteState(route,backhaul_id,Boolean.class); return stateManager.getRouteState(route,backhaul_id,Boolean.class);
} }
@ -537,7 +603,7 @@ public class SolutionAnalyser {
* @return true if backhaul constraint is violated, false otherwise. Null if either specified route or activity is null. * @return true if backhaul constraint is violated, false otherwise. Null if either specified route or activity is null.
* Null if specified route does not contain specified activity. * Null if specified route does not contain specified activity.
*/ */
public Boolean backhaulConstraintIsViolatedAtActivity(TourActivity activity, VehicleRoute route){ public Boolean hasBackhaulConstraintViolationAtActivity(TourActivity activity, VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing."); if(route == null) throw new IllegalStateException("route is missing.");
if(activity == null) throw new IllegalStateException("activity is missing."); if(activity == null) throw new IllegalStateException("activity is missing.");
if(activity instanceof Start) return false; if(activity instanceof Start) return false;
@ -554,7 +620,7 @@ public class SolutionAnalyser {
* @param route to check the shipment constraint. * @param route to check the shipment constraint.
* @return true if violated, false otherwise. Null if no state can be found or specified route is null. * @return true if violated, false otherwise. Null if no state can be found or specified route is null.
*/ */
public Boolean shipmentConstraintIsViolated(VehicleRoute route){ public Boolean hasShipmentConstraintViolation(VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing."); if(route == null) throw new IllegalStateException("route is missing.");
return stateManager.getRouteState(route,shipment_id,Boolean.class); return stateManager.getRouteState(route,shipment_id,Boolean.class);
} }
@ -568,7 +634,7 @@ public class SolutionAnalyser {
* @return true if shipment constraint is violated, false otherwise. If activity is either Start or End, it returns * @return true if shipment constraint is violated, false otherwise. If activity is either Start or End, it returns
* false. Returns null if either specified activity or route is null or route does not containt activity. * false. Returns null if either specified activity or route is null or route does not containt activity.
*/ */
public Boolean shipmentConstraintIsViolatedAtActivity(TourActivity activity, VehicleRoute route){ public Boolean hasShipmentConstraintViolationAtActivity(TourActivity activity, VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing."); if(route == null) throw new IllegalStateException("route is missing.");
if(activity == null) throw new IllegalStateException("activity is missing."); if(activity == null) throw new IllegalStateException("activity is missing.");
if(activity instanceof Start) return false; if(activity instanceof Start) return false;
@ -667,29 +733,6 @@ public class SolutionAnalyser {
return waitingTime; return waitingTime;
} }
/**
* @param activity to get the late arrival times from
* @return time too late
*/
public Double getLateArrivalTimesAtActivity(TourActivity activity, VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing.");
if(activity == null) throw new IllegalStateException("activity is missing.");
double tooLate = 0.;
if(activityPolicy.equals(ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS)){
tooLate = Math.max(0,activity.getArrTime()-activity.getTheoreticalLatestOperationStartTime());
}
return tooLate;
}
/**
* @param route to get the late arrival times from
* @return time too late, i.e. sum of late time of activities
*/
public Double getLateArrivalTimes(VehicleRoute route){
if(route == null) throw new IllegalStateException("route is missing.");
return stateManager.getRouteState(route,too_late_id,Double.class);
}
/** /**
* @param route to get the distance from * @param route to get the distance from
* @return total distance of route * @return total distance of route
@ -712,36 +755,102 @@ public class SolutionAnalyser {
return stateManager.getActivityState(activity, distance_id, Double.class); return stateManager.getActivityState(activity, distance_id, Double.class);
} }
/**
* @return total distance for specified solution
*/
public Double getDistance(){
return tp_distance;
}
/**
* @return total operation time for specified solution
*/
public Double getOperationTime(){
return operation_time;
}
/**
* @return total waiting time for specified solution
*/
public Double getWaitingTime(){
return waiting_time;
}
/**
* @return total transportation time
*/
public Double getTransportTime(){
return tp_time;
}
/**
* @return total time window violation for specified solution
*/
public Double getTimeWindowViolation(){
return tw_violation;
}
/**
* @return total capacity violation for specified solution
*/
public Capacity getCapacityViolation(){
return cap_violation;
}
/**
* @return total service time for specified solution
*/
public Double getServiceTime(){
return service_time;
}
/**
* @return total fixed costs for specified solution
*/
public Double getFixedCosts(){
return fixed_costs;
}
/**
* @return total variable transport costs for specified solution
*/
public Double getVariableTransportCosts(){
return variable_transport_costs;
}
/**
* @return total costs defined by solutionCostCalculator
*/
public Double getTotalCosts(){
return total_costs;
}
/**
* @return true if at least one route in specified solution has shipment constraint violation
*/
public Boolean hasShipmentConstraintViolation(){
return hasShipmentConstraintViolation;
}
/**
* @return true if at least one route in specified solution has backhaul constraint violation
*/
public Boolean hasBackhaulConstraintViolation(){
return hasBackhaulConstraintViolation;
}
/**
* @return true if at least one route in specified solution has skill constraint violation
*/
public Boolean hasSkillConstraintViolation(){
return hasSkillConstraintViolation;
}
// /**
// * @return total distance
// */
// public double getDistance(){
//
// }
//
// /**
// * @return total operation time
// */
// public double getOperationTime(){
//
// }
//
// /**
// * @return total waiting time
// */
// public double getWaitingTime(){
//
// }
//
// /**
// * @return total transportation time
// */
// public double getTransportationTime(){
//
// }
} }

View file

@ -600,7 +600,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Assert.assertEquals(0, analyser.getLateArrivalTimesAtActivity(route.getStart(), route), 0.01); Assert.assertEquals(0, analyser.getTimeWindowViolationAtActivity(route.getStart(), route), 0.01);
} }
@Test @Test
@ -612,7 +612,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Assert.assertEquals(0., analyser.getLateArrivalTimesAtActivity(route.getActivities().get(0), route), 0.01); Assert.assertEquals(0., analyser.getTimeWindowViolationAtActivity(route.getActivities().get(0), route), 0.01);
} }
@Test @Test
@ -624,7 +624,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Assert.assertEquals(0., analyser.getLateArrivalTimesAtActivity(route.getActivities().get(1), route), 0.01); Assert.assertEquals(0., analyser.getTimeWindowViolationAtActivity(route.getActivities().get(1), route), 0.01);
} }
@Test @Test
@ -636,7 +636,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Assert.assertEquals(0., analyser.getLateArrivalTimesAtActivity(route.getActivities().get(2), route), 0.01); Assert.assertEquals(0., analyser.getTimeWindowViolationAtActivity(route.getActivities().get(2), route), 0.01);
} }
@Test @Test
@ -648,7 +648,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Assert.assertEquals(0., analyser.getLateArrivalTimesAtActivity(route.getActivities().get(3), route), 0.01); Assert.assertEquals(0., analyser.getTimeWindowViolationAtActivity(route.getActivities().get(3), route), 0.01);
} }
@Test @Test
@ -660,7 +660,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Assert.assertEquals(0., analyser.getLateArrivalTimesAtActivity(route.getEnd(), route), 0.01); Assert.assertEquals(0., analyser.getTimeWindowViolationAtActivity(route.getEnd(), route), 0.01);
} }
@Test @Test
@ -672,7 +672,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Assert.assertEquals(0., analyser.getLateArrivalTimes(route), 0.01); Assert.assertEquals(0., analyser.getTimeWindowViolation(route), 0.01);
} }
@Test @Test
@ -1308,7 +1308,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolated(route); Boolean violation = analyser.hasBackhaulConstraintViolation(route);
assertTrue(violation); assertTrue(violation);
} }
@ -1324,7 +1324,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getStart(), route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getStart(), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1341,7 +1341,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(0),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(0), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1357,7 +1357,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(1),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(1), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1373,7 +1373,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(2),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(2), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1389,7 +1389,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(3),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(3), route);
assertTrue(violation); assertTrue(violation);
} }
@ -1405,7 +1405,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(4),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(4), route);
assertTrue(violation); assertTrue(violation);
} }
@ -1421,7 +1421,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(5),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(5), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1437,7 +1437,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(6),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(6), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1453,7 +1453,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(7),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(7), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1469,7 +1469,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getEnd(),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getEnd(), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1485,7 +1485,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.shipmentConstraintIsViolatedAtActivity(route.getStart(), route); Boolean violation = analyser.hasShipmentConstraintViolationAtActivity(route.getStart(), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1501,7 +1501,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(0),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(0), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1517,7 +1517,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(1),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(1), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1533,7 +1533,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(2),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(2), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1549,7 +1549,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(3),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(3), route);
assertTrue(violation); assertTrue(violation);
} }
@ -1565,7 +1565,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(4),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(4), route);
assertTrue(violation); assertTrue(violation);
} }
@ -1581,7 +1581,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(5),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(5), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1597,7 +1597,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(6),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(6), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1613,7 +1613,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getActivities().get(7),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getActivities().get(7), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1629,7 +1629,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.backhaulConstraintIsViolatedAtActivity(route.getEnd(),route); Boolean violation = analyser.hasBackhaulConstraintViolationAtActivity(route.getEnd(), route);
assertFalse(violation); assertFalse(violation);
} }
@ -1645,7 +1645,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violation = analyser.shipmentConstraintIsViolated(route); Boolean violation = analyser.hasShipmentConstraintViolation(route);
assertFalse(violation); assertFalse(violation);
} }
@ -1665,7 +1665,7 @@ public class SolutionAnalyserTest {
} }
}); });
Boolean violation = analyser.shipmentConstraintIsViolated(route); Boolean violation = analyser.hasShipmentConstraintViolation(route);
assertTrue(violation); assertTrue(violation);
} }
@ -1686,7 +1686,7 @@ public class SolutionAnalyserTest {
} }
}); });
Boolean violation = analyser.shipmentConstraintIsViolatedAtActivity(route.getActivities().get(1), route); Boolean violation = analyser.hasShipmentConstraintViolationAtActivity(route.getActivities().get(1), route);
assertTrue(violation); assertTrue(violation);
} }
@ -1707,7 +1707,7 @@ public class SolutionAnalyserTest {
} }
}); });
Boolean violation = analyser.shipmentConstraintIsViolated(route); Boolean violation = analyser.hasShipmentConstraintViolation(route);
assertTrue(violation); assertTrue(violation);
} }
@ -1728,7 +1728,7 @@ public class SolutionAnalyserTest {
} }
}); });
Boolean violation = analyser.shipmentConstraintIsViolatedAtActivity(route.getActivities().get(1),route); Boolean violation = analyser.hasShipmentConstraintViolationAtActivity(route.getActivities().get(1), route);
assertTrue(violation); assertTrue(violation);
} }
@ -1749,7 +1749,7 @@ public class SolutionAnalyserTest {
} }
}); });
Boolean violation = analyser.shipmentConstraintIsViolated(route); Boolean violation = analyser.hasShipmentConstraintViolation(route);
assertTrue(violation); assertTrue(violation);
} }
@ -1762,7 +1762,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violated = analyser.skillConstraintIsViolated(route); Boolean violated = analyser.hasSkillConstraintViolation(route);
assertTrue(violated); assertTrue(violated);
} }
@ -1775,7 +1775,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violated = analyser.skillConstraintIsViolatedAtActivity(route.getStart(), route); Boolean violated = analyser.hasSkillConstraintViolationAtActivity(route.getStart(), route);
assertFalse(violated); assertFalse(violated);
} }
@ -1788,7 +1788,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violated = analyser.skillConstraintIsViolatedAtActivity(route.getActivities().get(0),route); Boolean violated = analyser.hasSkillConstraintViolationAtActivity(route.getActivities().get(0), route);
assertFalse(violated); assertFalse(violated);
} }
@ -1801,7 +1801,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violated = analyser.skillConstraintIsViolatedAtActivity(route.getActivities().get(1),route); Boolean violated = analyser.hasSkillConstraintViolationAtActivity(route.getActivities().get(1), route);
assertTrue(violated); assertTrue(violated);
} }
@ -1814,7 +1814,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violated = analyser.skillConstraintIsViolatedAtActivity(route.getActivities().get(2),route); Boolean violated = analyser.hasSkillConstraintViolationAtActivity(route.getActivities().get(2), route);
assertTrue(violated); assertTrue(violated);
} }
@ -1827,7 +1827,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violated = analyser.skillConstraintIsViolatedAtActivity(route.getActivities().get(3),route); Boolean violated = analyser.hasSkillConstraintViolationAtActivity(route.getActivities().get(3), route);
assertFalse(violated); assertFalse(violated);
} }
@ -1840,7 +1840,7 @@ public class SolutionAnalyserTest {
} }
}); });
VehicleRoute route = solution.getRoutes().iterator().next(); VehicleRoute route = solution.getRoutes().iterator().next();
Boolean violated = analyser.skillConstraintIsViolatedAtActivity(route.getEnd(),route); Boolean violated = analyser.hasSkillConstraintViolationAtActivity(route.getEnd(), route);
assertFalse(violated); assertFalse(violated);
} }
@ -1858,7 +1858,7 @@ public class SolutionAnalyserTest {
Iterator<VehicleRoute> iterator = solution.getRoutes().iterator(); Iterator<VehicleRoute> iterator = solution.getRoutes().iterator();
iterator.next(); iterator.next();
VehicleRoute route = iterator.next(); VehicleRoute route = iterator.next();
Boolean violated = analyser.skillConstraintIsViolated(route); Boolean violated = analyser.hasSkillConstraintViolation(route);
assertFalse(violated); assertFalse(violated);
} }

View file

@ -129,14 +129,13 @@ public class VRPWithBackhaulsExample2 {
System.out.println("operationTime: " + analyser.getOperationTime(route)); System.out.println("operationTime: " + analyser.getOperationTime(route));
System.out.println("serviceTime: " + analyser.getServiceTime(route)); System.out.println("serviceTime: " + analyser.getServiceTime(route));
System.out.println("transportTime: " + analyser.getTransportTime(route)); System.out.println("transportTime: " + analyser.getTransportTime(route));
System.out.println("lateArrival: " + analyser.getLateArrivalTimes(route));
System.out.println("transportCosts: " + analyser.getVariableTransportCosts(route)); System.out.println("transportCosts: " + analyser.getVariableTransportCosts(route));
System.out.println("fixedCosts: " + analyser.getFixedCosts(route)); System.out.println("fixedCosts: " + analyser.getFixedCosts(route));
System.out.println("capViolationOnRoute: " + analyser.getCapacityViolation(route)); System.out.println("capViolationOnRoute: " + analyser.getCapacityViolation(route));
System.out.println("capViolation@beginning: " + analyser.getCapacityViolationAtBeginning(route)); System.out.println("capViolation@beginning: " + analyser.getCapacityViolationAtBeginning(route));
System.out.println("capViolation@end: " + analyser.getCapacityViolationAtEnd(route)); System.out.println("capViolation@end: " + analyser.getCapacityViolationAtEnd(route));
System.out.println("timeWindowViolationOnRoute: " + analyser.getTimeWindowViolation(route)); System.out.println("timeWindowViolationOnRoute: " + analyser.getTimeWindowViolation(route));
System.out.println("skillConstraintViolatedOnRoute: " + analyser.skillConstraintIsViolated(route)); System.out.println("skillConstraintViolatedOnRoute: " + analyser.hasSkillConstraintViolation(route));
System.out.println("dist@" + route.getStart().getLocationId() + ": " + analyser.getDistanceAtActivity(route.getStart(),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)); System.out.println("timeWindowViolation@" + route.getStart().getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(route.getStart(), route));
@ -146,17 +145,29 @@ public class VRPWithBackhaulsExample2 {
System.out.println("dist@" + act.getLocationId() + ": " + analyser.getDistanceAtActivity(act,route)); System.out.println("dist@" + act.getLocationId() + ": " + analyser.getDistanceAtActivity(act,route));
System.out.println("load(before)@" + act.getLocationId() + ": " + analyser.getLoadJustBeforeActivity(act,route)); System.out.println("load(before)@" + act.getLocationId() + ": " + analyser.getLoadJustBeforeActivity(act,route));
System.out.println("load(after)@" + act.getLocationId() + ": " + analyser.getLoadRightAfterActivity(act, route)); System.out.println("load(after)@" + act.getLocationId() + ": " + analyser.getLoadRightAfterActivity(act, route));
System.out.println("tooLate@" + act.getLocationId() + ": " + analyser.getLateArrivalTimesAtActivity(act, route));
System.out.println("transportCosts@" + act.getLocationId() + ": " + analyser.getVariableTransportCostsAtActivity(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("capViolation(after)@" + act.getLocationId() + ": " + analyser.getCapacityViolationAfterActivity(act,route));
System.out.println("timeWindowViolation@" + act.getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(act,route)); System.out.println("timeWindowViolation@" + act.getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(act,route));
System.out.println("skillConstraintViolated@" + act.getLocationId() + ": " + analyser.skillConstraintIsViolatedAtActivity(act,route)); System.out.println("skillConstraintViolated@" + act.getLocationId() + ": " + analyser.hasSkillConstraintViolationAtActivity(act, route));
} }
System.out.println("--"); System.out.println("--");
System.out.println("dist@" + route.getEnd().getLocationId() + ": " + analyser.getDistanceAtActivity(route.getEnd(),route)); System.out.println("dist@" + route.getEnd().getLocationId() + ": " + analyser.getDistanceAtActivity(route.getEnd(),route));
System.out.println("timeWindowViolation@" + route.getEnd().getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(route.getEnd(),route)); System.out.println("timeWindowViolation@" + route.getEnd().getLocationId() + ": " + analyser.getTimeWindowViolationAtActivity(route.getEnd(),route));
} }
System.out.println("-----");
System.out.println("aggreate solution stats");
System.out.println("total tp_distance: " + analyser.getDistance());
System.out.println("total tp_time: " + analyser.getTransportTime());
System.out.println("total waiting_time: " + analyser.getWaitingTime());
System.out.println("total service_time: " + analyser.getServiceTime());
System.out.println("total operation_time: " + analyser.getOperationTime());
System.out.println("total twViolation: " + analyser.getTimeWindowViolation());
System.out.println("total capViolation: " + analyser.getCapacityViolation());
System.out.println("total fixedCosts: " + analyser.getFixedCosts());
System.out.println("total variableCosts: " + analyser.getVariableTransportCosts());
System.out.println("total costs: " + analyser.getTotalCosts());
} }
} }