diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java b/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java index cc4a58fa..4a37bac8 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java @@ -591,8 +591,13 @@ public class Jsprit { costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); if(route.getVehicle().getBreak() != null){ if(!hasBreak){ - //break defined but not assigned penalty - costs += maxCosts * 2; + //break defined and required but not assigned penalty + if(route.getEnd().getArrTime() > route.getVehicle().getBreak().getTimeWindow().getEnd()){ + costs += maxCosts * 2 + route.getVehicle().getBreak().getServiceDuration() * route.getVehicle().getType().getVehicleCostParams().perServiceTimeUnit; + } + else{ + costs -= maxCosts * 2; + } } } } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/cost/WaitingTimeCosts.java b/jsprit-core/src/main/java/jsprit/core/problem/cost/WaitingTimeCosts.java index 2ae2338d..73b9a35a 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/cost/WaitingTimeCosts.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/cost/WaitingTimeCosts.java @@ -12,7 +12,9 @@ public class WaitingTimeCosts implements VehicleRoutingActivityCosts { @Override public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) { if (vehicle != null) { - return vehicle.getType().getVehicleCostParams().perWaitingTimeUnit * Math.max(0., tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime); + double waiting = vehicle.getType().getVehicleCostParams().perWaitingTimeUnit * Math.max(0., tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime); + double servicing = vehicle.getType().getVehicleCostParams().perServiceTimeUnit * tourAct.getOperationTime(); + return waiting + servicing; } return 0; } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeImpl.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeImpl.java index bef19e26..9898ae7f 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleTypeImpl.java @@ -35,6 +35,8 @@ public class VehicleTypeImpl implements VehicleType { */ public static class VehicleCostParams { + + public static VehicleTypeImpl.VehicleCostParams newInstance(double fix, double perTimeUnit, double perDistanceUnit) { return new VehicleCostParams(fix, perTimeUnit, perDistanceUnit); } @@ -45,6 +47,7 @@ public class VehicleTypeImpl implements VehicleType { public final double perTransportTimeUnit; public final double perDistanceUnit; public final double perWaitingTimeUnit; + public final double perServiceTimeUnit; private VehicleCostParams(double fix, double perTimeUnit, double perDistanceUnit) { super(); @@ -53,6 +56,7 @@ public class VehicleTypeImpl implements VehicleType { this.perTransportTimeUnit = perTimeUnit; this.perDistanceUnit = perDistanceUnit; this.perWaitingTimeUnit = 0.; + this.perServiceTimeUnit = 0.; } public VehicleCostParams(double fix, double perTimeUnit, double perDistanceUnit, double perWaitingTimeUnit) { @@ -61,6 +65,16 @@ public class VehicleTypeImpl implements VehicleType { this.perTransportTimeUnit = perTimeUnit; this.perDistanceUnit = perDistanceUnit; this.perWaitingTimeUnit = perWaitingTimeUnit; + this.perServiceTimeUnit = 0.; + } + + public VehicleCostParams(double fix, double perTimeUnit, double perDistanceUnit, double perWaitingTimeUnit, double perServiceTimeUnit) { + this.fix = fix; + this.perTimeUnit = perTimeUnit; + this.perTransportTimeUnit = perTimeUnit; + this.perDistanceUnit = perDistanceUnit; + this.perWaitingTimeUnit = perWaitingTimeUnit; + this.perServiceTimeUnit = perServiceTimeUnit; } @Override @@ -92,6 +106,7 @@ public class VehicleTypeImpl implements VehicleType { private double perDistance = 1.0; private double perTime = 0.0; private double perWaitingTime = 0.0; + private double perServiceTime = 0.0; private String profile = "car"; @@ -195,6 +210,12 @@ public class VehicleTypeImpl implements VehicleType { return this; } + public VehicleTypeImpl.Builder setCostPerServiceTime(double perServiceTime) { + if (perServiceTime < 0.0) throw new IllegalStateException(); + this.perServiceTime = perServiceTime; + return this; + } + /** * Builds the vehicle-type. * @@ -303,7 +324,7 @@ public class VehicleTypeImpl implements VehicleType { typeId = builder.id; capacity = builder.capacity; maxVelocity = builder.maxVelo; - vehicleCostParams = new VehicleCostParams(builder.fixedCost, builder.perTime, builder.perDistance, builder.perWaitingTime); + vehicleCostParams = new VehicleCostParams(builder.fixedCost, builder.perTime, builder.perDistance, builder.perWaitingTime, builder.perServiceTime); capacityDimensions = builder.capacityDimensions; profile = builder.profile; } diff --git a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml index 2d9058ab..07c5406a 100644 --- a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml +++ b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml @@ -2,9 +2,24 @@ - INFINITE + FINITE + + v2 + vehType2 + + loc + + + loc + + + 0.0 + 1.7976931348623157E308 + + true + v1 vehType @@ -33,58 +48,16 @@ + + vehType2 + + 200 + + + 0.0 + 1.0 + + + - - - - loc - - - 1 - - 2.0 - - - 0.0 - 1.7976931348623157E308 - - - - - - loc2 - - - 1 - - 4.0 - - - 0.0 - 1.7976931348623157E308 - - - - - - - 10.0 - - - noDriver - v1 - 0.0 - - 1 - 0.0 - 0.0 - - 0.0 - - - - - - -