From e7d7d3c799d2df10d8f991a6d0cfabb359ccf7f1 Mon Sep 17 00:00:00 2001 From: Stefan Schroeder <4sschroeder@gmail.com> Date: Wed, 4 Dec 2013 15:07:28 +0100 Subject: [PATCH] add penalyzer to up the pressure for penalty-vehicles --- .../algorithm/recreate/CalculatorBuilder.java | 9 +++-- ...alyzeInsertionCostsWithPenaltyVehicle.java | 35 +++++++++++++++++++ .../recreate/ShipmentInsertionCalculator.java | 11 +----- .../problem/vehicle/PenaltyVehicleType.java | 12 +++++++ 4 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 jsprit-core/src/main/java/jsprit/core/algorithm/recreate/PenalyzeInsertionCostsWithPenaltyVehicle.java 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 f078a338..dfdec50b 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 @@ -259,9 +259,11 @@ class CalculatorBuilder { switcher.put(Pickup.class, serviceInsertion); switcher.put(Delivery.class, serviceInsertion); + PenalyzeInsertionCostsWithPenaltyVehicle penalyzeInsertionCosts = new PenalyzeInsertionCostsWithPenaltyVehicle(switcher); + // JobInsertionCostsCalculator standardServiceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), actInsertionCalc, constraintManager, constraintManager); // ((ServiceInsertionCalculator) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood()); - CalculatorPlusListeners calcPlusListeners = new CalculatorPlusListeners(switcher); + CalculatorPlusListeners calcPlusListeners = new CalculatorPlusListeners(penalyzeInsertionCosts); return calcPlusListeners; } @@ -288,7 +290,10 @@ class CalculatorBuilder { ((ServiceInsertionOnRouteLevelCalculator)jobInsertionCalculator).setMemorySize(solutionMemory); ((ServiceInsertionOnRouteLevelCalculator)jobInsertionCalculator).setNeighborhood(vrp.getNeighborhood()); ((ServiceInsertionOnRouteLevelCalculator) jobInsertionCalculator).setStates(activityStates2); - CalculatorPlusListeners calcPlusListener = new CalculatorPlusListeners(jobInsertionCalculator); + + PenalyzeInsertionCostsWithPenaltyVehicle penalyzeInsertionCosts = new PenalyzeInsertionCostsWithPenaltyVehicle(jobInsertionCalculator); + + CalculatorPlusListeners calcPlusListener = new CalculatorPlusListeners(penalyzeInsertionCosts); return calcPlusListener; } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/PenalyzeInsertionCostsWithPenaltyVehicle.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/PenalyzeInsertionCostsWithPenaltyVehicle.java new file mode 100644 index 00000000..ef50a4d9 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/PenalyzeInsertionCostsWithPenaltyVehicle.java @@ -0,0 +1,35 @@ +package jsprit.core.algorithm.recreate; + +import jsprit.core.problem.driver.Driver; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.vehicle.PenaltyVehicleType; +import jsprit.core.problem.vehicle.Vehicle; + +class PenalyzeInsertionCostsWithPenaltyVehicle implements JobInsertionCostsCalculator{ + + JobInsertionCostsCalculator base; + + public PenalyzeInsertionCostsWithPenaltyVehicle(JobInsertionCostsCalculator baseInsertionCostsCalculator) { + super(); + this.base = baseInsertionCostsCalculator; + } + + @Override + public InsertionData getInsertionData(VehicleRoute currentRoute,Job newJob, Vehicle newVehicle, double newVehicleDepartureTime, Driver newDriver, double bestKnownCosts) { + if(newVehicle.getType() instanceof PenaltyVehicleType){ + if(currentRoute.getVehicle().getType() instanceof PenaltyVehicleType){ + InsertionData iData = base.getInsertionData(currentRoute, newJob, newVehicle, newVehicleDepartureTime, newDriver, bestKnownCosts); + double penaltyC = iData.getInsertionCost()*((PenaltyVehicleType)newVehicle.getType()).getPenaltyFactor(); + InsertionData newData = new InsertionData(penaltyC, iData.getPickupInsertionIndex(), iData.getDeliveryInsertionIndex(), iData.getSelectedVehicle(), iData.getSelectedDriver()); + newData.setAdditionalTime(iData.getAdditionalTime()); + newData.setVehicleDepartureTime(iData.getVehicleDepartureTime()); + return newData; + } + } + return base.getInsertionData(currentRoute, newJob, newVehicle, newVehicleDepartureTime, newDriver, bestKnownCosts); + } + + + +} 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 67cba2ca..b3311cb0 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 @@ -33,6 +33,7 @@ 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.solution.route.activity.TourShipmentActivityFactory; +import jsprit.core.problem.vehicle.PenaltyVehicleType; import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; import jsprit.core.util.CalculationUtils; @@ -51,14 +52,6 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ private HardActivityStateLevelConstraint hardActivityLevelConstraint; - private Neighborhood neighborhood = new Neighborhood() { - - @Override - public boolean areNeighbors(String location1, String location2) { - return true; - } - }; - private ActivityInsertionCostsCalculator activityInsertionCostsCalculator; private VehicleRoutingTransportCosts transportCosts; @@ -66,7 +59,6 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ private TourShipmentActivityFactory activityFactory; public void setNeighborhood(Neighborhood neighborhood) { - this.neighborhood = neighborhood; logger.info("initialise neighborhood " + neighborhood); } @@ -201,7 +193,6 @@ final class ShipmentInsertionCalculator implements JobInsertionCostsCalculator{ return InsertionData.createEmptyInsertionData(); } InsertionData insertionData = new InsertionData(bestCost, pickupInsertionIndex, deliveryInsertionIndex, newVehicle, newDriver); -// logger.info("pickupIndex="+pickupInsertionIndex + ";deliveryIndex=" + deliveryInsertionIndex); insertionData.setVehicleDepartureTime(newVehicleDepartureTime); return insertionData; } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/PenaltyVehicleType.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/PenaltyVehicleType.java index b26e01ba..9778ed5a 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/PenaltyVehicleType.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/PenaltyVehicleType.java @@ -22,10 +22,22 @@ public class PenaltyVehicleType implements VehicleType{ private VehicleType type; + private double penaltyFactor = 2; + public PenaltyVehicleType(VehicleType type) { super(); this.type = type; } + + public PenaltyVehicleType(VehicleType type, double penaltyFactor) { + super(); + this.type = type; + this.penaltyFactor = penaltyFactor; + } + + public double getPenaltyFactor(){ + return this.penaltyFactor; + } @Override public String getTypeId() {