mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
added core.problem.JobActivityFactory to InsertionCalculators
This commit is contained in:
parent
a1f448c113
commit
0215b8eac6
4 changed files with 56 additions and 22 deletions
|
|
@ -18,6 +18,8 @@ package jsprit.core.algorithm.recreate;
|
||||||
|
|
||||||
import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener;
|
import jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener;
|
||||||
import jsprit.core.algorithm.recreate.listener.InsertionListener;
|
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.VehicleRoutingProblem;
|
||||||
import jsprit.core.problem.constraint.ConstraintManager;
|
import jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import jsprit.core.problem.job.*;
|
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");
|
if(constraintManager == null) throw new IllegalStateException("constraint-manager is null");
|
||||||
|
|
||||||
ActivityInsertionCostsCalculator actInsertionCalc;
|
ActivityInsertionCostsCalculator actInsertionCalc;
|
||||||
|
|
@ -265,9 +267,19 @@ class CalculatorBuilder {
|
||||||
actInsertionCalc = activityInsertionCostCalculator;
|
actInsertionCalc = activityInsertionCostCalculator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JobActivityFactory activityFactory = new JobActivityFactory() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AbstractActivity> createActivities(Job job) {
|
||||||
|
return vrp.copyAndGetActivities(job);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
ShipmentInsertionCalculator shipmentInsertion = new ShipmentInsertionCalculator(vrp.getTransportCosts(), actInsertionCalc, constraintManager);
|
ShipmentInsertionCalculator shipmentInsertion = new ShipmentInsertionCalculator(vrp.getTransportCosts(), actInsertionCalc, constraintManager);
|
||||||
|
shipmentInsertion.setJobActivityFactory(activityFactory);
|
||||||
ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), actInsertionCalc, constraintManager);
|
ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), actInsertionCalc, constraintManager);
|
||||||
|
serviceInsertion.setJobActivityFactory(activityFactory);
|
||||||
|
|
||||||
JobCalculatorSwitcher switcher = new JobCalculatorSwitcher();
|
JobCalculatorSwitcher switcher = new JobCalculatorSwitcher();
|
||||||
switcher.put(Shipment.class, shipmentInsertion);
|
switcher.put(Shipment.class, shipmentInsertion);
|
||||||
switcher.put(Service.class, serviceInsertion);
|
switcher.put(Service.class, serviceInsertion);
|
||||||
|
|
@ -289,7 +301,7 @@ class CalculatorBuilder {
|
||||||
return calcPlusListeners;
|
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;
|
ActivityInsertionCostsCalculator routeLevelCostEstimator;
|
||||||
if(activityInsertionCostCalculator == null && addDefaultCostCalc){
|
if(activityInsertionCostCalculator == null && addDefaultCostCalc){
|
||||||
RouteLevelActivityInsertionCostsEstimator routeLevelActivityInsertionCostsEstimator = new RouteLevelActivityInsertionCostsEstimator(vrp.getTransportCosts(), vrp.getActivityCosts(), activityStates2);
|
RouteLevelActivityInsertionCostsEstimator routeLevelActivityInsertionCostsEstimator = new RouteLevelActivityInsertionCostsEstimator(vrp.getTransportCosts(), vrp.getActivityCosts(), activityStates2);
|
||||||
|
|
@ -312,10 +324,16 @@ class CalculatorBuilder {
|
||||||
else{
|
else{
|
||||||
routeLevelCostEstimator = activityInsertionCostCalculator;
|
routeLevelCostEstimator = activityInsertionCostCalculator;
|
||||||
}
|
}
|
||||||
JobInsertionCostsCalculator jobInsertionCalculator = new ServiceInsertionOnRouteLevelCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), routeLevelCostEstimator, constraintManager, constraintManager);
|
ServiceInsertionOnRouteLevelCalculator jobInsertionCalculator = new ServiceInsertionOnRouteLevelCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), routeLevelCostEstimator, constraintManager, constraintManager);
|
||||||
((ServiceInsertionOnRouteLevelCalculator)jobInsertionCalculator).setNuOfActsForwardLooking(forwardLooking);
|
jobInsertionCalculator.setNuOfActsForwardLooking(forwardLooking);
|
||||||
((ServiceInsertionOnRouteLevelCalculator)jobInsertionCalculator).setMemorySize(solutionMemory);
|
jobInsertionCalculator.setMemorySize(solutionMemory);
|
||||||
((ServiceInsertionOnRouteLevelCalculator) jobInsertionCalculator).setStates(activityStates2);
|
jobInsertionCalculator.setStates(activityStates2);
|
||||||
|
jobInsertionCalculator.setJobActivityFactory(new JobActivityFactory() {
|
||||||
|
@Override
|
||||||
|
public List<AbstractActivity> createActivities(Job job) {
|
||||||
|
return vrp.copyAndGetActivities(job);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
PenalyzeInsertionCostsWithPenaltyVehicle penalyzeInsertionCosts = new PenalyzeInsertionCostsWithPenaltyVehicle(jobInsertionCalculator);
|
PenalyzeInsertionCostsWithPenaltyVehicle penalyzeInsertionCosts = new PenalyzeInsertionCostsWithPenaltyVehicle(jobInsertionCalculator);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package jsprit.core.algorithm.recreate;
|
package jsprit.core.algorithm.recreate;
|
||||||
|
|
||||||
|
import jsprit.core.problem.JobActivityFactory;
|
||||||
import jsprit.core.problem.constraint.*;
|
import jsprit.core.problem.constraint.*;
|
||||||
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus;
|
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus;
|
||||||
import jsprit.core.problem.cost.VehicleRoutingTransportCosts;
|
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.job.Service;
|
||||||
import jsprit.core.problem.misc.JobInsertionContext;
|
import jsprit.core.problem.misc.JobInsertionContext;
|
||||||
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.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.Vehicle;
|
||||||
import jsprit.core.util.CalculationUtils;
|
import jsprit.core.util.CalculationUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
@ -51,7 +54,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
|
||||||
|
|
||||||
private ActivityInsertionCostsCalculator additionalTransportCostsCalculator;
|
private ActivityInsertionCostsCalculator additionalTransportCostsCalculator;
|
||||||
|
|
||||||
private TourActivityFactory activityFactory;
|
private JobActivityFactory activityFactory;
|
||||||
|
|
||||||
private AdditionalAccessEgressCalculator additionalAccessEgressCalculator;
|
private AdditionalAccessEgressCalculator additionalAccessEgressCalculator;
|
||||||
|
|
||||||
|
|
@ -63,10 +66,13 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
|
||||||
softActivityConstraint = constraintManager;
|
softActivityConstraint = constraintManager;
|
||||||
softRouteConstraint = constraintManager;
|
softRouteConstraint = constraintManager;
|
||||||
this.additionalTransportCostsCalculator = additionalTransportCostsCalculator;
|
this.additionalTransportCostsCalculator = additionalTransportCostsCalculator;
|
||||||
activityFactory = new DefaultTourActivityFactory();
|
|
||||||
additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts);
|
additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts);
|
||||||
logger.info("initialise " + this);
|
logger.info("initialise " + this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setJobActivityFactory(JobActivityFactory jobActivityFactory){
|
||||||
|
this.activityFactory = jobActivityFactory;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|
@ -93,7 +99,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
|
||||||
Service service = (Service)jobToInsert;
|
Service service = (Service)jobToInsert;
|
||||||
int insertionIndex = InsertionData.NO_INDEX;
|
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 start = Start.newInstance(newVehicle.getStartLocationId(), newVehicle.getEarliestDeparture(), Double.MAX_VALUE);
|
||||||
start.setEndTime(newVehicleDepartureTime);
|
start.setEndTime(newVehicleDepartureTime);
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package jsprit.core.algorithm.recreate;
|
package jsprit.core.algorithm.recreate;
|
||||||
|
|
||||||
|
import jsprit.core.problem.JobActivityFactory;
|
||||||
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint;
|
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint;
|
||||||
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus;
|
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus;
|
||||||
import jsprit.core.problem.constraint.HardRouteStateLevelConstraint;
|
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.job.Service;
|
||||||
import jsprit.core.problem.misc.JobInsertionContext;
|
import jsprit.core.problem.misc.JobInsertionContext;
|
||||||
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.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.RouteAndActivityStateGetter;
|
||||||
import jsprit.core.problem.solution.route.state.StateFactory;
|
import jsprit.core.problem.solution.route.state.StateFactory;
|
||||||
import jsprit.core.problem.vehicle.Vehicle;
|
import jsprit.core.problem.vehicle.Vehicle;
|
||||||
|
|
@ -48,7 +52,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC
|
||||||
|
|
||||||
private AuxilliaryCostCalculator auxilliaryPathCostCalculator;
|
private AuxilliaryCostCalculator auxilliaryPathCostCalculator;
|
||||||
|
|
||||||
private TourActivityFactory tourActivityFactory = new DefaultTourActivityFactory();
|
private JobActivityFactory activityFactory;
|
||||||
|
|
||||||
private RouteAndActivityStateGetter stateManager;
|
private RouteAndActivityStateGetter stateManager;
|
||||||
|
|
||||||
|
|
@ -66,8 +70,8 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC
|
||||||
|
|
||||||
private End end;
|
private End end;
|
||||||
|
|
||||||
public void setTourActivityFactory(TourActivityFactory tourActivityFactory){
|
public void setJobActivityFactory(JobActivityFactory jobActivityFactory){
|
||||||
this.tourActivityFactory=tourActivityFactory;
|
this.activityFactory=jobActivityFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMemorySize(int memorySize) {
|
public void setMemorySize(int memorySize) {
|
||||||
|
|
@ -137,7 +141,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC
|
||||||
/**
|
/**
|
||||||
* some inis
|
* some inis
|
||||||
*/
|
*/
|
||||||
TourActivity serviceAct2Insert = tourActivityFactory.createActivity(service);
|
TourActivity serviceAct2Insert = activityFactory.createActivities(service).get(0);
|
||||||
int best_insertion_index = InsertionData.NO_INDEX;
|
int best_insertion_index = InsertionData.NO_INDEX;
|
||||||
|
|
||||||
initialiseStartAndEnd(newVehicle, newVehicleDepartureTime);
|
initialiseStartAndEnd(newVehicle, newVehicleDepartureTime);
|
||||||
|
|
@ -147,7 +151,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC
|
||||||
double sumOf_prevCosts_newVehicle = 0.0;
|
double sumOf_prevCosts_newVehicle = 0.0;
|
||||||
double prevActDepTime_newVehicle = start.getEndTime();
|
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}
|
* inserting serviceAct2Insert in route r={0,1,...,i-1,i,j,j+1,...,n(r),n(r)+1}
|
||||||
* i=prevAct
|
* i=prevAct
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package jsprit.core.algorithm.recreate;
|
package jsprit.core.algorithm.recreate;
|
||||||
|
|
||||||
|
import jsprit.core.problem.JobActivityFactory;
|
||||||
import jsprit.core.problem.constraint.*;
|
import jsprit.core.problem.constraint.*;
|
||||||
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus;
|
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint.ConstraintsStatus;
|
||||||
import jsprit.core.problem.cost.VehicleRoutingTransportCosts;
|
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.job.Shipment;
|
||||||
import jsprit.core.problem.misc.JobInsertionContext;
|
import jsprit.core.problem.misc.JobInsertionContext;
|
||||||
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.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.Vehicle;
|
||||||
import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle;
|
import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle;
|
||||||
import jsprit.core.util.CalculationUtils;
|
import jsprit.core.util.CalculationUtils;
|
||||||
|
|
@ -51,7 +54,7 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{
|
||||||
|
|
||||||
private VehicleRoutingTransportCosts transportCosts;
|
private VehicleRoutingTransportCosts transportCosts;
|
||||||
|
|
||||||
private TourShipmentActivityFactory activityFactory;
|
private JobActivityFactory activityFactory;
|
||||||
|
|
||||||
private AdditionalAccessEgressCalculator additionalAccessEgressCalculator;
|
private AdditionalAccessEgressCalculator additionalAccessEgressCalculator;
|
||||||
|
|
||||||
|
|
@ -63,10 +66,13 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{
|
||||||
this.softActivityConstraint = constraintManager;
|
this.softActivityConstraint = constraintManager;
|
||||||
this.softRouteConstraint = constraintManager;
|
this.softRouteConstraint = constraintManager;
|
||||||
this.transportCosts = routingCosts;
|
this.transportCosts = routingCosts;
|
||||||
activityFactory = new DefaultShipmentActivityFactory();
|
|
||||||
additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts);
|
additionalAccessEgressCalculator = new AdditionalAccessEgressCalculator(routingCosts);
|
||||||
logger.info("initialise " + this);
|
logger.info("initialise " + this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setJobActivityFactory(JobActivityFactory activityFactory){
|
||||||
|
this.activityFactory = activityFactory;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|
@ -95,8 +101,8 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{
|
||||||
additionalICostsAtRouteLevel += additionalAccessEgressCalculator.getCosts(insertionContext);
|
additionalICostsAtRouteLevel += additionalAccessEgressCalculator.getCosts(insertionContext);
|
||||||
|
|
||||||
Shipment shipment = (Shipment)jobToInsert;
|
Shipment shipment = (Shipment)jobToInsert;
|
||||||
TourActivity pickupShipment = activityFactory.createPickup(shipment);
|
TourActivity pickupShipment = activityFactory.createActivities(shipment).get(0);
|
||||||
TourActivity deliverShipment = activityFactory.createDelivery(shipment);
|
TourActivity deliverShipment = activityFactory.createActivities(shipment).get(1);
|
||||||
|
|
||||||
int pickupInsertionIndex = InsertionData.NO_INDEX;
|
int pickupInsertionIndex = InsertionData.NO_INDEX;
|
||||||
int deliveryInsertionIndex = InsertionData.NO_INDEX;
|
int deliveryInsertionIndex = InsertionData.NO_INDEX;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue