From e543665da27ca9535f276a0ecd2d51398791fbe3 Mon Sep 17 00:00:00 2001 From: oblonski Date: Sat, 19 Sep 2015 20:23:24 +0200 Subject: [PATCH] bugfix #186 --- .../algorithm/PrettyAlgorithmBuilder.java | 2 ++ .../core/algorithm/state/InternalStates.java | 2 ++ ...eVehicleDependentPracticalTimeWindows.java | 3 +++ .../problem/constraint/SwitchNotFeasible.java | 25 +++++++++++++++++++ ...astVehicleRoutingTransportCostsMatrix.java | 8 ++++++ .../jsprit/core/algorithm/Solomon_IT.java | 5 ++-- 6 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 jsprit-core/src/main/java/jsprit/core/problem/constraint/SwitchNotFeasible.java diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java index ed215a30..733bb05c 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java @@ -25,6 +25,7 @@ import jsprit.core.algorithm.recreate.VehicleSwitched; import jsprit.core.algorithm.state.*; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.constraint.ConstraintManager; +import jsprit.core.problem.constraint.SwitchNotFeasible; import jsprit.core.problem.solution.SolutionCostCalculator; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.solution.route.VehicleRoute; @@ -89,6 +90,7 @@ public class PrettyAlgorithmBuilder { constraintManager.addTimeWindowConstraint(); constraintManager.addLoadConstraint(); constraintManager.addSkillsConstraint(); + constraintManager.addConstraint(new SwitchNotFeasible(stateManager)); stateManager.updateLoadStates(); stateManager.updateTimeWindowStates(); UpdateVehicleDependentPracticalTimeWindows twUpdater = new UpdateVehicleDependentPracticalTimeWindows(stateManager, vrp.getTransportCosts()); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/state/InternalStates.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/InternalStates.java index 6c9ab22b..45d5efc1 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/state/InternalStates.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/InternalStates.java @@ -49,4 +49,6 @@ public class InternalStates { public static final StateId FUTURE_WAITING = new StateFactory.StateIdImpl("future_waiting", 13); public static final StateId EARLIEST_WITHOUT_WAITING = new StateFactory.StateIdImpl("earliest_without_waiting", 14); + + public static final StateId SWITCH_NOT_FEASIBLE = new StateFactory.StateIdImpl("switch_not_feasible", 15); } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateVehicleDependentPracticalTimeWindows.java b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateVehicleDependentPracticalTimeWindows.java index e8d36880..57a5b3a5 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateVehicleDependentPracticalTimeWindows.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/state/UpdateVehicleDependentPracticalTimeWindows.java @@ -97,6 +97,9 @@ public class UpdateVehicleDependentPracticalTimeWindows implements RouteVisitor, double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocation(), prevLocation, latestArrTimeAtPrevAct, route.getDriver(), vehicle) - activity.getOperationTime(); double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct); + if(latestArrivalTime < activity.getTheoreticalEarliestOperationStartTime()){ + stateManager.putTypedInternalRouteState(route,vehicle,InternalStates.SWITCH_NOT_FEASIBLE,true); + } stateManager.putInternalTypedActivityState(activity, vehicle, InternalStates.LATEST_OPERATION_START_TIME, latestArrivalTime); latest_arrTimes_at_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = latestArrivalTime; location_of_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = activity.getLocation(); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/SwitchNotFeasible.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/SwitchNotFeasible.java new file mode 100644 index 00000000..6be3645d --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/SwitchNotFeasible.java @@ -0,0 +1,25 @@ +package jsprit.core.problem.constraint; + +import jsprit.core.algorithm.state.InternalStates; +import jsprit.core.algorithm.state.StateManager; +import jsprit.core.problem.misc.JobInsertionContext; + +/** + * Created by schroeder on 19/09/15. + */ +public class SwitchNotFeasible implements HardRouteConstraint{ + + private StateManager stateManager; + + public SwitchNotFeasible(StateManager stateManager) { + this.stateManager = stateManager; + } + + @Override + public boolean fulfilled(JobInsertionContext insertionContext) { + Boolean notFeasible = stateManager.getRouteState(insertionContext.getRoute(),insertionContext.getNewVehicle(), InternalStates.SWITCH_NOT_FEASIBLE,Boolean.class); + if(notFeasible == null) return true; + else return !notFeasible; + } + +} diff --git a/jsprit-core/src/main/java/jsprit/core/util/FastVehicleRoutingTransportCostsMatrix.java b/jsprit-core/src/main/java/jsprit/core/util/FastVehicleRoutingTransportCostsMatrix.java index 28d1995e..6bff4a03 100644 --- a/jsprit-core/src/main/java/jsprit/core/util/FastVehicleRoutingTransportCostsMatrix.java +++ b/jsprit-core/src/main/java/jsprit/core/util/FastVehicleRoutingTransportCostsMatrix.java @@ -114,6 +114,14 @@ public class FastVehicleRoutingTransportCostsMatrix extends AbstractForwardVehic matrix = builder.matrix; } + /** + * First dim is from, second to and third indicates whether it is a distance value (index=0) or time value (index=1). + * + * @return + */ + public double[][][] getMatrix(){ + return matrix; + } @Override public double getTransportTime(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) { diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java index 98fa3d91..ff5a5b86 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java @@ -1,7 +1,7 @@ package jsprit.core.algorithm; import jsprit.core.IntegrationTest; -import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.algorithm.box.Jsprit; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.io.VrpXMLReader; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; @@ -25,7 +25,8 @@ public class Solomon_IT { new VrpXMLReader(vrpBuilder).read("src/test/resources/solomon_c101.xml"); VehicleRoutingProblem vrp = vrpBuilder.build(); - VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml"); + VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp); +// VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml"); vra.setMaxIterations(500); Collection solutions = vra.searchSolutions(); assertEquals(828.94, Solutions.bestOf(solutions).getCost(), 0.01);