diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java index 52c99bc7..189df274 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/CalculatorBuilder.java @@ -18,6 +18,8 @@ package jsprit.core.algorithm.recreate; import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; import jsprit.core.algorithm.recreate.listener.InsertionListener; +import jsprit.core.problem.AbstractActivity; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.constraint.ConstraintManager; import jsprit.core.problem.job.*; @@ -243,7 +245,7 @@ class CalculatorBuilder { } } - private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, RouteAndActivityStateGetter statesManager){ + private CalculatorPlusListeners createStandardLocal(final VehicleRoutingProblem vrp, RouteAndActivityStateGetter statesManager){ if(constraintManager == null) throw new IllegalStateException("constraint-manager is null"); ActivityInsertionCostsCalculator actInsertionCalc; @@ -265,9 +267,19 @@ class CalculatorBuilder { actInsertionCalc = activityInsertionCostCalculator; } + JobActivityFactory activityFactory = new JobActivityFactory() { + + @Override + public List createActivities(Job job) { + return vrp.copyAndGetActivities(job); + } + + }; ShipmentInsertionCalculator shipmentInsertion = new ShipmentInsertionCalculator(vrp.getTransportCosts(), actInsertionCalc, constraintManager); + shipmentInsertion.setJobActivityFactory(activityFactory); ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), actInsertionCalc, constraintManager); - + serviceInsertion.setJobActivityFactory(activityFactory); + JobCalculatorSwitcher switcher = new JobCalculatorSwitcher(); switcher.put(Shipment.class, shipmentInsertion); switcher.put(Service.class, serviceInsertion); @@ -289,7 +301,7 @@ class CalculatorBuilder { return calcPlusListeners; } - private CalculatorPlusListeners createStandardRoute(VehicleRoutingProblem vrp, RouteAndActivityStateGetter activityStates2, int forwardLooking, int solutionMemory){ + private CalculatorPlusListeners createStandardRoute(final VehicleRoutingProblem vrp, RouteAndActivityStateGetter activityStates2, int forwardLooking, int solutionMemory){ ActivityInsertionCostsCalculator routeLevelCostEstimator; if(activityInsertionCostCalculator == null && addDefaultCostCalc){ RouteLevelActivityInsertionCostsEstimator routeLevelActivityInsertionCostsEstimator = new RouteLevelActivityInsertionCostsEstimator(vrp.getTransportCosts(), vrp.getActivityCosts(), activityStates2); @@ -312,10 +324,16 @@ class CalculatorBuilder { else{ routeLevelCostEstimator = activityInsertionCostCalculator; } - JobInsertionCostsCalculator jobInsertionCalculator = new ServiceInsertionOnRouteLevelCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), routeLevelCostEstimator, constraintManager, constraintManager); - ((ServiceInsertionOnRouteLevelCalculator)jobInsertionCalculator).setNuOfActsForwardLooking(forwardLooking); - ((ServiceInsertionOnRouteLevelCalculator)jobInsertionCalculator).setMemorySize(solutionMemory); - ((ServiceInsertionOnRouteLevelCalculator) jobInsertionCalculator).setStates(activityStates2); + ServiceInsertionOnRouteLevelCalculator jobInsertionCalculator = new ServiceInsertionOnRouteLevelCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), routeLevelCostEstimator, constraintManager, constraintManager); + jobInsertionCalculator.setNuOfActsForwardLooking(forwardLooking); + jobInsertionCalculator.setMemorySize(solutionMemory); + jobInsertionCalculator.setStates(activityStates2); + jobInsertionCalculator.setJobActivityFactory(new JobActivityFactory() { + @Override + public List createActivities(Job job) { + return vrp.copyAndGetActivities(job); + } + }); PenalyzeInsertionCostsWithPenaltyVehicle penalyzeInsertionCosts = new PenalyzeInsertionCostsWithPenaltyVehicle(jobInsertionCalculator); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java index 8f3f2f8d..de47501e 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java @@ -16,6 +16,7 @@ ******************************************************************************/ package jsprit.core.algorithm.recreate; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.constraint.*; import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus; import jsprit.core.problem.cost.VehicleRoutingTransportCosts; @@ -24,7 +25,9 @@ import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Service; import jsprit.core.problem.misc.JobInsertionContext; import jsprit.core.problem.solution.route.VehicleRoute; -import jsprit.core.problem.solution.route.activity.*; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.util.CalculationUtils; import org.apache.log4j.Logger; @@ -51,7 +54,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ private ActivityInsertionCostsCalculator additionalTransportCostsCalculator; - private TourActivityFactory activityFactory; + private JobActivityFactory activityFactory; private AdditionalAccessEgressCalculator additionalAccessEgressCalculator; @@ -63,10 +66,13 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ softActivityConstraint = constraintManager; softRouteConstraint = constraintManager; this.additionalTransportCostsCalculator = additionalTransportCostsCalculator; - activityFactory = new DefaultTourActivityFactory(); additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts); logger.info("initialise " + this); } + + public void setJobActivityFactory(JobActivityFactory jobActivityFactory){ + this.activityFactory = jobActivityFactory; + } @Override public String toString() { @@ -93,7 +99,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ Service service = (Service)jobToInsert; int insertionIndex = InsertionData.NO_INDEX; - TourActivity deliveryAct2Insert = activityFactory.createActivity(service); + TourActivity deliveryAct2Insert = activityFactory.createActivities(service).get(0); Start start = Start.newInstance(newVehicle.getStartLocationId(), newVehicle.getEarliestDeparture(), Double.MAX_VALUE); start.setEndTime(newVehicleDepartureTime); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionOnRouteLevelCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionOnRouteLevelCalculator.java index 89823537..add08852 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionOnRouteLevelCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionOnRouteLevelCalculator.java @@ -16,6 +16,7 @@ ******************************************************************************/ package jsprit.core.algorithm.recreate; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.constraint.HardActivityStateLevelConstraint; import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus; import jsprit.core.problem.constraint.HardRouteStateLevelConstraint; @@ -26,7 +27,10 @@ import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Service; import jsprit.core.problem.misc.JobInsertionContext; import jsprit.core.problem.solution.route.VehicleRoute; -import jsprit.core.problem.solution.route.activity.*; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivities; +import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; import jsprit.core.problem.solution.route.state.StateFactory; import jsprit.core.problem.vehicle.Vehicle; @@ -48,7 +52,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC private AuxilliaryCostCalculator auxilliaryPathCostCalculator; - private TourActivityFactory tourActivityFactory = new DefaultTourActivityFactory(); + private JobActivityFactory activityFactory; private RouteAndActivityStateGetter stateManager; @@ -66,8 +70,8 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC private End end; - public void setTourActivityFactory(TourActivityFactory tourActivityFactory){ - this.tourActivityFactory=tourActivityFactory; + public void setJobActivityFactory(JobActivityFactory jobActivityFactory){ + this.activityFactory=jobActivityFactory; } public void setMemorySize(int memorySize) { @@ -137,7 +141,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC /** * some inis */ - TourActivity serviceAct2Insert = tourActivityFactory.createActivity(service); + TourActivity serviceAct2Insert = activityFactory.createActivities(service).get(0); int best_insertion_index = InsertionData.NO_INDEX; initialiseStartAndEnd(newVehicle, newVehicleDepartureTime); @@ -147,7 +151,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC double sumOf_prevCosts_newVehicle = 0.0; double prevActDepTime_newVehicle = start.getEndTime(); - boolean loopBroken = false; + boolean loopBroken = false; /** * inserting serviceAct2Insert in route r={0,1,...,i-1,i,j,j+1,...,n(r),n(r)+1} * i=prevAct diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java index bfedf1f9..ef8625f7 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ShipmentInsertionCalculator.java @@ -16,6 +16,7 @@ ******************************************************************************/ package jsprit.core.algorithm.recreate; +import jsprit.core.problem.JobActivityFactory; import jsprit.core.problem.constraint.*; import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus; import jsprit.core.problem.cost.VehicleRoutingTransportCosts; @@ -24,7 +25,9 @@ import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Shipment; import jsprit.core.problem.misc.JobInsertionContext; import jsprit.core.problem.solution.route.VehicleRoute; -import jsprit.core.problem.solution.route.activity.*; +import jsprit.core.problem.solution.route.activity.End; +import jsprit.core.problem.solution.route.activity.Start; +import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; import jsprit.core.util.CalculationUtils; @@ -51,7 +54,7 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ private VehicleRoutingTransportCosts transportCosts; - private TourShipmentActivityFactory activityFactory; + private JobActivityFactory activityFactory; private AdditionalAccessEgressCalculator additionalAccessEgressCalculator; @@ -63,10 +66,13 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ this.softActivityConstraint = constraintManager; this.softRouteConstraint = constraintManager; this.transportCosts = routingCosts; - activityFactory = new DefaultShipmentActivityFactory(); additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts); logger.info("initialise " + this); } + + public void setJobActivityFactory(JobActivityFactory activityFactory){ + this.activityFactory = activityFactory; + } @Override public String toString() { @@ -95,8 +101,8 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ additionalICostsAtRouteLevel += additionalAccessEgressCalculator.getCosts(insertionContext); Shipment shipment = (Shipment)jobToInsert; - TourActivity pickupShipment = activityFactory.createPickup(shipment); - TourActivity deliverShipment = activityFactory.createDelivery(shipment); + TourActivity pickupShipment = activityFactory.createActivities(shipment).get(0); + TourActivity deliverShipment = activityFactory.createActivities(shipment).get(1); int pickupInsertionIndex = InsertionData.NO_INDEX; int deliveryInsertionIndex = InsertionData.NO_INDEX;