diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java index 3660103e..d763a3b7 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java @@ -88,13 +88,13 @@ final class CalculatesServiceInsertionConsideringFixCost implements JobInsertion double currentFix = 0.0; if(route.getVehicle() != null){ if(!(route.getVehicle() instanceof NoVehicle)){ - currentFix += route.getVehicle().getType().vehicleCostParams.fix; + currentFix += route.getVehicle().getType().getVehicleCostParams().fix; } } if(newVehicle.getCapacity() < load){ return Double.MAX_VALUE; } - return newVehicle.getType().vehicleCostParams.fix - currentFix; + return newVehicle.getType().getVehicleCostParams().fix - currentFix; } private double getDeltaRelativeFixCost(VehicleRoute route, Vehicle newVehicle, Job job) { @@ -103,13 +103,13 @@ final class CalculatesServiceInsertionConsideringFixCost implements JobInsertion double currentRelFix = 0.0; if(route.getVehicle() != null){ if(!(route.getVehicle() instanceof NoVehicle)){ - currentRelFix += route.getVehicle().getType().vehicleCostParams.fix*currentLoad/route.getVehicle().getCapacity(); + currentRelFix += route.getVehicle().getType().getVehicleCostParams().fix*currentLoad/route.getVehicle().getCapacity(); } } if(newVehicle.getCapacity() < load){ return Double.MAX_VALUE; } - double relativeFixCost = newVehicle.getType().vehicleCostParams.fix*(load/newVehicle.getCapacity()) - currentRelFix; + double relativeFixCost = newVehicle.getType().getVehicleCostParams().fix*(load/newVehicle.getCapacity()) - currentRelFix; return relativeFixCost; } diff --git a/jsprit-core/src/main/java/algorithms/CalculatesVehTypeDepServiceInsertion.java b/jsprit-core/src/main/java/algorithms/CalculatesVehTypeDepServiceInsertion.java index 445b537c..763842eb 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesVehTypeDepServiceInsertion.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesVehTypeDepServiceInsertion.java @@ -31,7 +31,6 @@ import basics.Job; import basics.route.Driver; import basics.route.Vehicle; import basics.route.VehicleImpl.NoVehicle; -import basics.route.VehicleImpl.VehicleType; import basics.route.VehicleRoute; diff --git a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java b/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java index 61c97d67..2e25ef03 100644 --- a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java +++ b/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java @@ -82,11 +82,11 @@ final class FindCheaperVehicleAlgo { for(Vehicle vehicle : fleetManager.getAvailableVehicle(vehicleRoute.getVehicle().getType().getTypeId(), vehicleRoute.getVehicle().getLocationId())){ // Vehicle vehicle = fleetManager.getEmptyVehicle(vehicleType); - if(vehicle.getType().typeId.equals(vehicleRoute.getVehicle().getType().typeId)){ + if(vehicle.getType().getTypeId().equals(vehicleRoute.getVehicle().getType().getTypeId())){ continue; } if(states.getRouteState(vehicleRoute).getLoad() <= vehicle.getCapacity()){ - double fixCostSaving = vehicleRoute.getVehicle().getType().vehicleCostParams.fix - vehicle.getType().vehicleCostParams.fix; + double fixCostSaving = vehicleRoute.getVehicle().getType().getVehicleCostParams().fix - vehicle.getType().getVehicleCostParams().fix; double departureTime = vehicleRoute.getStart().getEndTime(); double newCost = auxilliaryCostCalculator.costOfPath(path, departureTime, vehicleRoute.getDriver(), vehicle); double varCostSaving = states.getRouteState(vehicleRoute).getCosts() - newCost; diff --git a/jsprit-core/src/main/java/algorithms/InfiniteVehicles.java b/jsprit-core/src/main/java/algorithms/InfiniteVehicles.java index 0f8fe66c..2c00a316 100644 --- a/jsprit-core/src/main/java/algorithms/InfiniteVehicles.java +++ b/jsprit-core/src/main/java/algorithms/InfiniteVehicles.java @@ -23,10 +23,8 @@ package algorithms; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.log4j.Logger; @@ -72,16 +70,6 @@ class InfiniteVehicles implements VehicleFleetManager{ } - @Override - public Vehicle getEmptyVehicle(TypeKey typeId) { - return types.get(typeId); - } - - @Override - public Collection getAvailableVehicleTypes() { - return sortedTypes; - } - @Override public void lock(Vehicle vehicle) { @@ -92,12 +80,6 @@ class InfiniteVehicles implements VehicleFleetManager{ } - @Override - public Collection getAvailableVehicleTypes(TypeKey withoutThisType) { - Set typeSet = new HashSet(types.keySet()); - typeSet.remove(withoutThisType); - return typeSet; - } @Override public boolean isLocked(Vehicle vehicle) { diff --git a/jsprit-core/src/main/java/algorithms/VehicleFleetManager.java b/jsprit-core/src/main/java/algorithms/VehicleFleetManager.java index 099f1909..96ea8d0a 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleFleetManager.java +++ b/jsprit-core/src/main/java/algorithms/VehicleFleetManager.java @@ -23,11 +23,10 @@ package algorithms; import java.util.Collection; import basics.route.Vehicle; -import basics.route.VehicleImpl.VehicleType; interface VehicleFleetManager { - public static class TypeKey { + static class TypeKey { public final String type; public final String locationId; @@ -74,21 +73,15 @@ interface VehicleFleetManager { } - public abstract Vehicle getEmptyVehicle(TypeKey typeId); + abstract void lock(Vehicle vehicle); - public abstract Collection getAvailableVehicleTypes(); + abstract void unlock(Vehicle vehicle); - public abstract void lock(Vehicle vehicle); + abstract boolean isLocked(Vehicle vehicle); - public abstract void unlock(Vehicle vehicle); + abstract void unlockAll(); - public abstract Collection getAvailableVehicleTypes(TypeKey withoutThisType); - - public abstract boolean isLocked(Vehicle vehicle); - - public abstract void unlockAll(); - - public abstract Collection getAvailableVehicles(); + abstract Collection getAvailableVehicles(); Collection getAvailableVehicle(String withoutThisType, String locationId); diff --git a/jsprit-core/src/main/java/algorithms/VehicleFleetManagerImpl.java b/jsprit-core/src/main/java/algorithms/VehicleFleetManagerImpl.java index 7b92762a..5b50d004 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleFleetManagerImpl.java +++ b/jsprit-core/src/main/java/algorithms/VehicleFleetManagerImpl.java @@ -31,6 +31,7 @@ import java.util.Set; import org.apache.log4j.Logger; +import basics.route.PenaltyVehicleType; import basics.route.Vehicle; import basics.route.VehicleImpl.NoVehicle; @@ -136,10 +137,9 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { if(v.getType() == null){ throw new IllegalStateException("vehicle needs type"); } - String typeId = v.getType().typeId; - if(typeId.contains("penalty")){ - String[] typeIdTokens = typeId.split("#"); - TypeKey typeKey = new TypeKey(typeIdTokens[0],v.getLocationId()); + String typeId = v.getType().getTypeId(); + if(v.getType() instanceof PenaltyVehicleType){ + TypeKey typeKey = new TypeKey(typeId,v.getLocationId()); penaltyVehicles.put(typeKey, v); } else{ @@ -153,7 +153,7 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { private void removeVehicle(Vehicle v){ //it might be better to introduce a class PenaltyVehicle - if(!v.getType().getTypeId().contains("penalty")){ + if(!(v.getType() instanceof PenaltyVehicleType)){ TypeKey key = new TypeKey(v.getType().getTypeId(),v.getLocationId()); if(typeMapOfAvailableVehicles.containsKey(key)){ typeMapOfAvailableVehicles.get(key).remove(v); @@ -161,34 +161,6 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { } } - /* (non-Javadoc) - * @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#getEmptyVehicle(java.lang.String) - */ - @Override - public Vehicle getEmptyVehicle(TypeKey typeId){ - Vehicle v = null; - if(typeMapOfAvailableVehicles.containsKey(typeId)){ - v = typeMapOfAvailableVehicles.get(typeId).getVehicle(); - } - return v; - } - - /* (non-Javadoc) - * @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#getAvailableVehicleTypes() - */ - @Override - public Collection getAvailableVehicleTypes(){ - List types = new ArrayList(); - for(TypeKey key : typeMapOfAvailableVehicles.keySet()){ - if(!typeMapOfAvailableVehicles.get(key).isEmpty()){ - types.add(key); - } - else{ - - } - } - return types; - } /** * Returns a collection of available vehicles. @@ -250,7 +222,7 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { if(vehicles.isEmpty() || vehicle instanceof NoVehicle){ return; } - if(vehicle.getType().getTypeId().contains("penalty")) return; + if(vehicle.getType() instanceof PenaltyVehicleType) return; boolean locked = lockedVehicles.add(vehicle); removeVehicle(vehicle); if(!locked){ @@ -267,30 +239,11 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { return; } if(vehicle == null) return; - if(vehicle.getType().getTypeId().contains("penalty")) return; + if(vehicle.getType() instanceof PenaltyVehicleType) return; lockedVehicles.remove(vehicle); addVehicle(vehicle); } - /* (non-Javadoc) - * @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#getAvailableVehicleTypes(java.lang.String) - */ - @Override - public Collection getAvailableVehicleTypes(TypeKey withoutThisType) { - List types = new ArrayList(); - for(TypeKey typeKey : typeMapOfAvailableVehicles.keySet()){ - if(typeKey.equals(withoutThisType)){ - continue; - } - if(!typeMapOfAvailableVehicles.get(typeKey).isEmpty()){ - types.add(typeKey); - } - } - return types; - } - - - /* (non-Javadoc) * @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#isLocked(org.matsim.contrib.freight.vrp.basics.Vehicle) */ diff --git a/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java b/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java index 2534d1fa..4ee8a0c6 100644 --- a/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java +++ b/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java @@ -29,7 +29,8 @@ import basics.costs.VehicleRoutingActivityCosts; import basics.costs.VehicleRoutingTransportCosts; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; /** * Contains and describes the vehicle routing problem. @@ -96,7 +97,7 @@ public class VehicleRoutingProblem { jobs = new HashMap(); vehicles = new ArrayList(); coordinates = new HashMap(); - vehicleTypes = new ArrayList(); + vehicleTypes = new ArrayList(); services = new ArrayList(); } @@ -237,7 +238,7 @@ public class VehicleRoutingProblem { * @param type * @return builder */ - public Builder addVehicleType(VehicleType type){ + public Builder addVehicleType(VehicleTypeImpl type){ vehicleTypes.add(type); return this; } @@ -445,7 +446,7 @@ public class VehicleRoutingProblem { * Returns the entire, unmodifiable collection of types. * * @return unmodifiable collection of types - * @see VehicleType + * @see VehicleTypeImpl */ public Collection getTypes(){ return Collections.unmodifiableCollection(vehicleTypes); diff --git a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java b/jsprit-core/src/main/java/basics/io/VrpXMLReader.java index 3ba9104e..68636356 100644 --- a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java +++ b/jsprit-core/src/main/java/basics/io/VrpXMLReader.java @@ -52,8 +52,9 @@ import basics.route.TimeWindow; import basics.route.Vehicle; import basics.route.VehicleImpl; import basics.route.VehicleImpl.VehicleBuilder; -import basics.route.VehicleImpl.VehicleType; import basics.route.VehicleRoute; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class VrpXMLReader{ @@ -255,7 +256,7 @@ public class VrpXMLReader{ private void readVehiclesAndTheirTypes(XMLConfiguration vrpProblem) { //read vehicle-types - Map types = new HashMap(); + Map types = new HashMap(); List typeConfigs = vrpProblem.configurationsAt("vehicleTypes.type"); for(HierarchicalConfiguration typeConfig : typeConfigs){ String typeId = typeConfig.getString("id"); @@ -267,12 +268,12 @@ public class VrpXMLReader{ // Double end = typeConfig.getDouble("timeSchedule.end"); if(typeId == null) throw new IllegalStateException("typeId is missing."); if(capacity == null) throw new IllegalStateException("capacity is missing."); - VehicleType.Builder typeBuilder = VehicleType.Builder.newInstance(typeId, capacity); + VehicleTypeImpl.Builder typeBuilder = VehicleTypeImpl.Builder.newInstance(typeId, capacity); if(fix != null) typeBuilder.setFixedCost(fix); if(timeC != null) typeBuilder.setCostPerTime(timeC); if(distC != null) typeBuilder.setCostPerDistance(distC); // if(start != null && end != null) typeBuilder.setTimeSchedule(new TimeSchedule(start, end)); - VehicleType type = typeBuilder.build(); + VehicleTypeImpl type = typeBuilder.build(); types.put(type.typeId, type); vrpBuilder.addVehicleType(type); } @@ -286,7 +287,7 @@ public class VrpXMLReader{ VehicleBuilder builder = VehicleImpl.VehicleBuilder.newInstance(vehicleId); String typeId = vehicleConfig.getString("typeId"); if(typeId == null) throw new IllegalStateException("typeId is missing."); - VehicleType type = types.get(typeId); + VehicleTypeImpl type = types.get(typeId); if(type == null) throw new IllegalStateException("vehicleType with typeId " + typeId + " is missing."); builder.setType(type); String locationId = vehicleConfig.getString("location.id"); diff --git a/jsprit-core/src/main/java/basics/io/VrpXMLWriter.java b/jsprit-core/src/main/java/basics/io/VrpXMLWriter.java index 53b777d6..cf2fe549 100644 --- a/jsprit-core/src/main/java/basics/io/VrpXMLWriter.java +++ b/jsprit-core/src/main/java/basics/io/VrpXMLWriter.java @@ -40,8 +40,8 @@ import basics.VehicleRoutingProblemSolution; import basics.route.ServiceActivity; import basics.route.TourActivity; import basics.route.Vehicle; -import basics.route.VehicleImpl.VehicleType; import basics.route.VehicleRoute; +import basics.route.VehicleType; public class VrpXMLWriter { @@ -226,7 +226,7 @@ public class VrpXMLWriter { int counter = 0; for(Vehicle vehicle : vrp.getVehicles()){ xmlConfig.setProperty(vehiclePathString + "("+counter+").id", vehicle.getId()); - xmlConfig.setProperty(vehiclePathString + "("+counter+").typeId", vehicle.getType().typeId); + xmlConfig.setProperty(vehiclePathString + "("+counter+").typeId", vehicle.getType().getTypeId()); xmlConfig.setProperty(vehiclePathString + "("+counter+").location.id", vehicle.getLocationId()); if(vehicle.getCoord() != null){ xmlConfig.setProperty(vehiclePathString + "("+counter+").location.coord[@x]", vehicle.getCoord().getX()); @@ -248,13 +248,13 @@ public class VrpXMLWriter { String typePathString = Schema.builder().append(Schema.TYPES).dot(Schema.TYPE).build(); int typeCounter = 0; for(VehicleType type : vrp.getTypes()){ - xmlConfig.setProperty(typePathString + "("+typeCounter+").id", type.typeId); - xmlConfig.setProperty(typePathString + "("+typeCounter+").capacity", type.capacity); + xmlConfig.setProperty(typePathString + "("+typeCounter+").id", type.getTypeId()); + xmlConfig.setProperty(typePathString + "("+typeCounter+").capacity", type.getCapacity()); // xmlConfig.setProperty(typePathString + "("+typeCounter+").timeSchedule.start", type.getTimeSchedule().getEarliestStart()); // xmlConfig.setProperty(typePathString + "("+typeCounter+").timeSchedule.end", type.getTimeSchedule().getLatestEnd()); - xmlConfig.setProperty(typePathString + "("+typeCounter+").costs.fixed", type.vehicleCostParams.fix); - xmlConfig.setProperty(typePathString + "("+typeCounter+").costs.distance", type.vehicleCostParams.perDistanceUnit); - xmlConfig.setProperty(typePathString + "("+typeCounter+").costs.time", type.vehicleCostParams.perTimeUnit); + xmlConfig.setProperty(typePathString + "("+typeCounter+").costs.fixed", type.getVehicleCostParams().fix); + xmlConfig.setProperty(typePathString + "("+typeCounter+").costs.distance", type.getVehicleCostParams().perDistanceUnit); + xmlConfig.setProperty(typePathString + "("+typeCounter+").costs.time", type.getVehicleCostParams().perTimeUnit); typeCounter++; } diff --git a/jsprit-core/src/main/java/basics/route/DefaultVehicleRouteCostCalculator.java b/jsprit-core/src/main/java/basics/route/DefaultVehicleRouteCostCalculator.java index 5d605c73..f5e274cf 100644 --- a/jsprit-core/src/main/java/basics/route/DefaultVehicleRouteCostCalculator.java +++ b/jsprit-core/src/main/java/basics/route/DefaultVehicleRouteCostCalculator.java @@ -20,7 +20,6 @@ ******************************************************************************/ package basics.route; -import basics.route.VehicleImpl.VehicleType; public class DefaultVehicleRouteCostCalculator implements VehicleRouteCostCalculator { diff --git a/jsprit-core/src/main/java/basics/route/PenaltyVehicleType.java b/jsprit-core/src/main/java/basics/route/PenaltyVehicleType.java new file mode 100644 index 00000000..9963a00c --- /dev/null +++ b/jsprit-core/src/main/java/basics/route/PenaltyVehicleType.java @@ -0,0 +1,31 @@ +package basics.route; + +import basics.route.VehicleTypeImpl.VehicleCostParams; + +public class PenaltyVehicleType implements VehicleType{ + + private VehicleType type; + + public PenaltyVehicleType(VehicleType type) { + super(); + this.type = type; + } + + @Override + public String getTypeId() { + return type.getTypeId(); + } + + @Override + public int getCapacity() { + return type.getCapacity(); + } + + @Override + public VehicleCostParams getVehicleCostParams() { + return type.getVehicleCostParams(); + } + + + +} diff --git a/jsprit-core/src/main/java/basics/route/Vehicle.java b/jsprit-core/src/main/java/basics/route/Vehicle.java index 60e8eb86..7af040a0 100644 --- a/jsprit-core/src/main/java/basics/route/Vehicle.java +++ b/jsprit-core/src/main/java/basics/route/Vehicle.java @@ -21,7 +21,6 @@ package basics.route; import util.Coordinate; -import basics.route.VehicleImpl.VehicleType; diff --git a/jsprit-core/src/main/java/basics/route/VehicleImpl.java b/jsprit-core/src/main/java/basics/route/VehicleImpl.java index 172cf3c4..8279056f 100644 --- a/jsprit-core/src/main/java/basics/route/VehicleImpl.java +++ b/jsprit-core/src/main/java/basics/route/VehicleImpl.java @@ -31,7 +31,7 @@ public class VehicleImpl implements Vehicle { public static class NoVehicle extends VehicleImpl { public NoVehicle() { - super(VehicleBuilder.newInstance("noVehicle").setType(VehicleType.newInstance(null, 0, null))); + super(VehicleBuilder.newInstance("noVehicle").setType(VehicleTypeImpl.newInstance(null, 0, null))); } public int getCapacity(){ @@ -40,129 +40,6 @@ public class VehicleImpl implements Vehicle { } - public static class VehicleType { - - public static class Builder{ - - public static Builder newInstance(String id, int capacity){ - return new Builder(id,capacity); - } - - private String id; - private int capacity; - /** - * default cost values for default vehicle type - */ - private double fixedCost = 0.0; - private double perDistance = 1.0; - private double perTime = 0.0; - - public Builder(String id, int capacity) { - super(); - this.id = id; - this.capacity = capacity; - } - - public Builder setFixedCost(double fixedCost) { this.fixedCost = fixedCost; return this; } - - public Builder setCostPerDistance(double perDistance){ this.perDistance = perDistance; return this; } - - public Builder setCostPerTime(double perTime){ this.perTime = perTime; return this; } - - public VehicleType build(){ - return new VehicleType(this); - } - - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((typeId == null) ? 0 : typeId.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - VehicleType other = (VehicleType) obj; - if (typeId == null) { - if (other.typeId != null) - return false; - } else if (!typeId.equals(other.typeId)) - return false; - return true; - } - - public final String typeId; - public final int capacity; - public final VehicleCostParams vehicleCostParams; - - public static VehicleType newInstance(String typeId, int capacity, VehicleCostParams para){ - return new VehicleType(typeId, capacity, para); - } - - private VehicleType(Builder builder){ - typeId = builder.id; - capacity = builder.capacity; - vehicleCostParams = new VehicleCostParams(builder.fixedCost, builder.perTime, builder.perDistance); - } - - public VehicleType(String typeId, int capacity,VehicleCostParams vehicleCostParams) { - super(); - this.typeId = typeId; - this.capacity = capacity; - this.vehicleCostParams = vehicleCostParams; - } - - public String getTypeId() { - return typeId; - } - - public int getCapacity() { - return capacity; - } - - public VehicleCostParams getVehicleCostParams() { - return vehicleCostParams; - } - - @Override - public String toString() { - return "[typeId="+typeId+"][capacity="+capacity+"]" + vehicleCostParams; - } - } - - public static class VehicleCostParams { - - public static VehicleCostParams newInstance(double fix, double perTimeUnit,double perDistanceUnit){ - return new VehicleCostParams(fix, perTimeUnit, perDistanceUnit); - } - - public final double fix; - public final double perTimeUnit; - public final double perDistanceUnit; - - private VehicleCostParams(double fix, double perTimeUnit,double perDistanceUnit) { - super(); - this.fix = fix; - this.perTimeUnit = perTimeUnit; - this.perDistanceUnit = perDistanceUnit; - } - - @Override - public String toString() { - return "[fixed="+fix+"][perTime="+perTimeUnit+"][perDistance="+perDistanceUnit+"]"; - } - } - public static class VehicleBuilder { static Logger log = Logger.getLogger(VehicleBuilder.class); private String id; @@ -172,7 +49,7 @@ public class VehicleImpl implements Vehicle { private double earliestStart = 0.0; private double latestArrival = Double.MAX_VALUE; - private VehicleType type = VehicleType.Builder.newInstance("default", 0).build(); + private VehicleType type = VehicleTypeImpl.Builder.newInstance("default", 0).build(); private VehicleBuilder(String id) { super(); @@ -309,7 +186,7 @@ public class VehicleImpl implements Vehicle { */ @Override public int getCapacity() { - return type.capacity; + return type.getCapacity(); } } diff --git a/jsprit-core/src/main/java/basics/route/VehicleType.java b/jsprit-core/src/main/java/basics/route/VehicleType.java new file mode 100644 index 00000000..e0870532 --- /dev/null +++ b/jsprit-core/src/main/java/basics/route/VehicleType.java @@ -0,0 +1,14 @@ +package basics.route; + +import basics.route.VehicleTypeImpl.VehicleCostParams; + + +public interface VehicleType { + + public String getTypeId(); + + public int getCapacity(); + + public VehicleCostParams getVehicleCostParams(); + +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/basics/route/VehicleTypeImpl.java b/jsprit-core/src/main/java/basics/route/VehicleTypeImpl.java new file mode 100644 index 00000000..aa3a7820 --- /dev/null +++ b/jsprit-core/src/main/java/basics/route/VehicleTypeImpl.java @@ -0,0 +1,138 @@ +package basics.route; + + +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); + } + + public final double fix; + public final double perTimeUnit; + public final double perDistanceUnit; + + private VehicleCostParams(double fix, double perTimeUnit,double perDistanceUnit) { + super(); + this.fix = fix; + this.perTimeUnit = perTimeUnit; + this.perDistanceUnit = perDistanceUnit; + } + + @Override + public String toString() { + return "[fixed="+fix+"][perTime="+perTimeUnit+"][perDistance="+perDistanceUnit+"]"; + } + } + + + public static class Builder{ + + public static VehicleTypeImpl.Builder newInstance(String id, int capacity){ + return new Builder(id,capacity); + } + + private String id; + private int capacity; + /** + * default cost values for default vehicle type + */ + private double fixedCost = 0.0; + private double perDistance = 1.0; + private double perTime = 0.0; + + public Builder(String id, int capacity) { + super(); + this.id = id; + this.capacity = capacity; + } + + public VehicleTypeImpl.Builder setFixedCost(double fixedCost) { this.fixedCost = fixedCost; return this; } + + public VehicleTypeImpl.Builder setCostPerDistance(double perDistance){ this.perDistance = perDistance; return this; } + + public VehicleTypeImpl.Builder setCostPerTime(double perTime){ this.perTime = perTime; return this; } + + public VehicleTypeImpl build(){ + return new VehicleTypeImpl(this); + } + + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((typeId == null) ? 0 : typeId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + VehicleTypeImpl other = (VehicleTypeImpl) obj; + if (typeId == null) { + if (other.typeId != null) + return false; + } else if (!typeId.equals(other.typeId)) + return false; + return true; + } + + public final String typeId; + public final int capacity; + public final VehicleTypeImpl.VehicleCostParams vehicleCostParams; + + public static VehicleTypeImpl newInstance(String typeId, int capacity, VehicleTypeImpl.VehicleCostParams para){ + return new VehicleTypeImpl(typeId, capacity, para); + } + + private VehicleTypeImpl(VehicleTypeImpl.Builder builder){ + typeId = builder.id; + capacity = builder.capacity; + vehicleCostParams = new VehicleCostParams(builder.fixedCost, builder.perTime, builder.perDistance); + } + + public VehicleTypeImpl(String typeId, int capacity,VehicleTypeImpl.VehicleCostParams vehicleCostParams) { + super(); + this.typeId = typeId; + this.capacity = capacity; + this.vehicleCostParams = vehicleCostParams; + } + + /* (non-Javadoc) + * @see basics.route.VehicleType#getTypeId() + */ + @Override + public String getTypeId() { + return typeId; + } + + /* (non-Javadoc) + * @see basics.route.VehicleType#getCapacity() + */ + @Override + public int getCapacity() { + return capacity; + } + + /* (non-Javadoc) + * @see basics.route.VehicleType#getVehicleCostParams() + */ + @Override + public VehicleTypeImpl.VehicleCostParams getVehicleCostParams() { + return vehicleCostParams; + } + + @Override + public String toString() { + return "[typeId="+typeId+"][capacity="+capacity+"]" + vehicleCostParams; + } +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/util/CrowFlyCosts.java b/jsprit-core/src/main/java/util/CrowFlyCosts.java index d2adaa50..3b32fa9b 100644 --- a/jsprit-core/src/main/java/util/CrowFlyCosts.java +++ b/jsprit-core/src/main/java/util/CrowFlyCosts.java @@ -20,7 +20,6 @@ import org.apache.log4j.Logger; import basics.costs.VehicleRoutingTransportCosts; import basics.route.Driver; import basics.route.Vehicle; -import basics.route.VehicleImpl.VehicleType; /** diff --git a/jsprit-core/src/main/java/util/RouteUtils.java b/jsprit-core/src/main/java/util/RouteUtils.java index fd7b3df7..8034079a 100644 --- a/jsprit-core/src/main/java/util/RouteUtils.java +++ b/jsprit-core/src/main/java/util/RouteUtils.java @@ -84,7 +84,7 @@ public class RouteUtils { if(r.getTourActivities().isEmpty()){ continue; } - total += r.getVehicle().getType().vehicleCostParams.fix; + total += r.getVehicle().getType().getVehicleCostParams().fix; } return total; } diff --git a/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java b/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java index e20f03d0..56d3a2db 100644 --- a/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java +++ b/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java @@ -25,17 +25,15 @@ import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import java.util.Arrays; - import org.junit.Before; import org.junit.Test; -import algorithms.VehicleFleetManager.TypeKey; import basics.Service; import basics.route.TimeWindow; import basics.route.Vehicle; import basics.route.VehicleImpl; import basics.route.VehicleRoute; +import basics.route.VehicleTypeImpl; @@ -53,18 +51,13 @@ public class CalcVehicleTypeDependentServiceInsertionTest { public void doBefore(){ veh1 = mock(Vehicle.class); veh2 = mock(Vehicle.class); - when(veh1.getType()).thenReturn(VehicleImpl.VehicleType.Builder.newInstance("type1", 0).build()); - when(veh2.getType()).thenReturn(VehicleImpl.VehicleType.Builder.newInstance("type2", 0).build()); + when(veh1.getType()).thenReturn(VehicleTypeImpl.Builder.newInstance("type1", 0).build()); + when(veh2.getType()).thenReturn(VehicleTypeImpl.Builder.newInstance("type2", 0).build()); when(veh1.getLocationId()).thenReturn("loc1"); when(veh2.getLocationId()).thenReturn("loc2"); fleetManager = mock(VehicleFleetManager.class); service = mock(Service.class); vehicleRoute = mock(VehicleRoute.class); - TypeKey typeKey1 = new TypeKey(veh1.getType().getTypeId(),veh1.getLocationId()); - TypeKey typeKey2 = new TypeKey(veh2.getType().getTypeId(),veh2.getLocationId()); - when(fleetManager.getAvailableVehicleTypes()).thenReturn(Arrays.asList(typeKey1,typeKey2)); - when(fleetManager.getEmptyVehicle(typeKey1)).thenReturn(veh1); - when(fleetManager.getEmptyVehicle(typeKey2)).thenReturn(veh2); when(veh1.getCapacity()).thenReturn(10); when(veh2.getCapacity()).thenReturn(10); diff --git a/jsprit-core/src/test/java/algorithms/CalcWithTimeSchedulingTest.java b/jsprit-core/src/test/java/algorithms/CalcWithTimeSchedulingTest.java index 406e879d..526149db 100644 --- a/jsprit-core/src/test/java/algorithms/CalcWithTimeSchedulingTest.java +++ b/jsprit-core/src/test/java/algorithms/CalcWithTimeSchedulingTest.java @@ -36,8 +36,8 @@ import basics.costs.VehicleRoutingTransportCosts; import basics.route.Driver; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; import basics.route.VehicleRoute; +import basics.route.VehicleTypeImpl; public class CalcWithTimeSchedulingTest { @@ -46,7 +46,7 @@ public class CalcWithTimeSchedulingTest { VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("myVehicle").setEarliestStart(0.0).setLatestArrival(100.0). setLocationCoord(Coordinate.newInstance(0, 0)).setLocationId("0,0") - .setType(VehicleType.Builder.newInstance("myType", 20).setCostPerDistance(1.0).build()).build(); + .setType(VehicleTypeImpl.Builder.newInstance("myType", 20).setCostPerDistance(1.0).build()).build(); vrpBuilder.addVehicle(vehicle); vrpBuilder.addService(Service.Builder.newInstance("myService", 2).setLocationId("0,20").setCoord(Coordinate.newInstance(0, 20)).build()); vrpBuilder.setFleetSize(FleetSize.INFINITE); diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java index 87cc4820..01be6cfd 100644 --- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java +++ b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java @@ -44,8 +44,9 @@ import basics.route.TimeWindow; import basics.route.TourActivities; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; import basics.route.VehicleRoute; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class GendreauPostOptTest { @@ -109,7 +110,7 @@ public class GendreauPostOptTest { double costPerDistanceUnit; if(vehicle != null){ - costPerDistanceUnit = vehicle.getType().vehicleCostParams.perDistanceUnit; + costPerDistanceUnit = vehicle.getType().getVehicleCostParams().perDistanceUnit; } else{ costPerDistanceUnit = 1; @@ -124,8 +125,8 @@ public class GendreauPostOptTest { } }; - VehicleType lightType = VehicleImpl.VehicleType.Builder.newInstance("light", 10).setFixedCost(10).setCostPerDistance(1.0).build(); - VehicleType heavyType = VehicleImpl.VehicleType.Builder.newInstance("heavy", 10).setFixedCost(30).setCostPerDistance(2.0).build(); + VehicleTypeImpl lightType = VehicleTypeImpl.Builder.newInstance("light", 10).setFixedCost(10).setCostPerDistance(1.0).build(); + VehicleTypeImpl heavyType = VehicleTypeImpl.Builder.newInstance("heavy", 10).setFixedCost(30).setCostPerDistance(2.0).build(); lightVehicle1 = VehicleImpl.VehicleBuilder.newInstance("light").setLocationId("0,0").setType(lightType).build(); lightVehicle2 = VehicleImpl.VehicleBuilder.newInstance("light2").setLocationId("0,0").setType(lightType).build(); diff --git a/jsprit-core/src/test/java/algorithms/TestDepartureTimeOpt.java b/jsprit-core/src/test/java/algorithms/TestDepartureTimeOpt.java index 8c827a2d..2eaeb7ce 100644 --- a/jsprit-core/src/test/java/algorithms/TestDepartureTimeOpt.java +++ b/jsprit-core/src/test/java/algorithms/TestDepartureTimeOpt.java @@ -20,7 +20,7 @@ ******************************************************************************/ package algorithms; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import java.util.Collection; @@ -40,7 +40,8 @@ import basics.route.TimeWindow; import basics.route.TourActivity; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class TestDepartureTimeOpt { @@ -48,9 +49,9 @@ public class TestDepartureTimeOpt { public void whenSettingOneCustWithTWAnd_NO_DepTimeChoice_totalCostsShouldBe50(){ TimeWindow timeWindow = TimeWindow.newInstance(40, 45); Service service = Service.Builder.newInstance("s", 0).setLocationId("servLoc").setCoord(Coordinate.newInstance(0, 10)).setTimeWindow(timeWindow).build(); - VehicleType type = mock(VehicleType.class); + VehicleType type = mock(VehicleTypeImpl.class); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("vehLoc").setLocationCoord(Coordinate.newInstance(0, 0)) - .setType(VehicleType.Builder.newInstance("vType", 0).build()).build(); + .setType(VehicleTypeImpl.Builder.newInstance("vType", 0).build()).build(); Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts(){ @@ -76,9 +77,9 @@ public class TestDepartureTimeOpt { public void whenSettingOneCustWithTWAnd_NO_DepTimeChoice_depTimeShouldBe0(){ TimeWindow timeWindow = TimeWindow.newInstance(40, 45); Service service = Service.Builder.newInstance("s", 0).setLocationId("servLoc").setCoord(Coordinate.newInstance(0, 10)).setTimeWindow(timeWindow).build(); - VehicleType type = mock(VehicleType.class); + VehicleType type = mock(VehicleTypeImpl.class); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("vehLoc").setLocationCoord(Coordinate.newInstance(0, 0)) - .setType(VehicleType.Builder.newInstance("vType", 0).build()).build(); + .setType(VehicleTypeImpl.Builder.newInstance("vType", 0).build()).build(); Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts(){ @@ -105,7 +106,7 @@ public class TestDepartureTimeOpt { TimeWindow timeWindow = TimeWindow.newInstance(40, 45); Service service = Service.Builder.newInstance("s", 0).setLocationId("servLoc").setCoord(Coordinate.newInstance(0, 10)).setTimeWindow(timeWindow).build(); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("vehLoc").setLocationCoord(Coordinate.newInstance(0, 0)) - .setType(VehicleType.Builder.newInstance("vType", 0).build()).build(); + .setType(VehicleTypeImpl.Builder.newInstance("vType", 0).build()).build(); Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts(){ @@ -133,7 +134,7 @@ public class TestDepartureTimeOpt { TimeWindow timeWindow = TimeWindow.newInstance(40, 45); Service service = Service.Builder.newInstance("s", 0).setLocationId("servLoc").setCoord(Coordinate.newInstance(0, 10)).setTimeWindow(timeWindow).build(); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("vehLoc").setLocationCoord(Coordinate.newInstance(0, 0)) - .setType(VehicleType.Builder.newInstance("vType", 0).build()).build(); + .setType(VehicleTypeImpl.Builder.newInstance("vType", 0).build()).build(); Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts(){ @@ -165,7 +166,7 @@ public class TestDepartureTimeOpt { setTimeWindow(TimeWindow.newInstance(30, 40)).build(); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("vehLoc").setLocationCoord(Coordinate.newInstance(0, 0)) - .setType(VehicleType.Builder.newInstance("vType", 0).build()).build(); + .setType(VehicleTypeImpl.Builder.newInstance("vType", 0).build()).build(); Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts(){ @@ -197,7 +198,7 @@ public class TestDepartureTimeOpt { setTimeWindow(TimeWindow.newInstance(30, 40)).build(); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("vehLoc").setLocationCoord(Coordinate.newInstance(0, 0)) - .setType(VehicleType.Builder.newInstance("vType", 0).build()).build(); + .setType(VehicleTypeImpl.Builder.newInstance("vType", 0).build()).build(); Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts(){ diff --git a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java index bdcd3713..1955ceeb 100644 --- a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java +++ b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java @@ -36,8 +36,9 @@ import basics.route.TimeWindow; import basics.route.TourActivities; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; import basics.route.VehicleRoute; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class TestTourStateUpdaterWithService { @@ -102,7 +103,7 @@ public class TestTourStateUpdaterWithService { states = new RouteStates(); states.initialiseStateOfJobs(services); - VehicleType type = VehicleImpl.VehicleType.Builder.newInstance("test", 0).build(); + VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 0).build(); vehicle = VehicleImpl.VehicleBuilder.newInstance("testvehicle").setType(type).setLocationId("0,0") .setEarliestStart(0.0).setLatestArrival(50.0).build(); diff --git a/jsprit-core/src/test/java/algorithms/TestVehicleFleetManager.java b/jsprit-core/src/test/java/algorithms/TestVehicleFleetManager.java index d64445df..9c9b1ca2 100644 --- a/jsprit-core/src/test/java/algorithms/TestVehicleFleetManager.java +++ b/jsprit-core/src/test/java/algorithms/TestVehicleFleetManager.java @@ -24,17 +24,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import junit.framework.TestCase; +import algorithms.VehicleFleetManager.TypeKey; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleBuilder; -import basics.route.VehicleImpl.VehicleType; -import basics.route.VehicleImpl.VehicleType.Builder; - -import algorithms.VehicleFleetManager; -import algorithms.VehicleFleetManagerImpl; -import algorithms.VehicleFleetManager.TypeKey; - -import junit.framework.TestCase; +import basics.route.VehicleTypeImpl; public class TestVehicleFleetManager extends TestCase{ @@ -47,8 +41,8 @@ public class TestVehicleFleetManager extends TestCase{ public void setUp(){ List vehicles = new ArrayList(); - v1 = VehicleImpl.VehicleBuilder.newInstance("standard").setLocationId("loc").setType(VehicleImpl.VehicleType.Builder.newInstance("standard", 0).build()).build(); - v2 = VehicleImpl.VehicleBuilder.newInstance("foo").setLocationId("fooLoc").setType(VehicleImpl.VehicleType.Builder.newInstance("foo", 0).build()).build(); + v1 = VehicleImpl.VehicleBuilder.newInstance("standard").setLocationId("loc").setType(VehicleTypeImpl.Builder.newInstance("standard", 0).build()).build(); + v2 = VehicleImpl.VehicleBuilder.newInstance("foo").setLocationId("fooLoc").setType(VehicleTypeImpl.Builder.newInstance("foo", 0).build()).build(); vehicles.add(v1); vehicles.add(v2); diff --git a/jsprit-core/src/test/java/basics/VehicleRoutingProblemBuilderTest.java b/jsprit-core/src/test/java/basics/VehicleRoutingProblemBuilderTest.java index 46d83863..91929585 100644 --- a/jsprit-core/src/test/java/basics/VehicleRoutingProblemBuilderTest.java +++ b/jsprit-core/src/test/java/basics/VehicleRoutingProblemBuilderTest.java @@ -27,7 +27,7 @@ import org.junit.Test; import basics.VehicleRoutingProblem.FleetSize; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleTypeImpl; public class VehicleRoutingProblemBuilderTest { @@ -48,8 +48,8 @@ public class VehicleRoutingProblemBuilderTest { VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); builder.setFleetSize(FleetSize.FINITE); - VehicleType type1 = VehicleType.Builder.newInstance("t1", 20).build(); - VehicleType type2 = VehicleType.Builder.newInstance("t2", 200).build(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("t1", 20).build(); + VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("t2", 200).build(); Vehicle v1 = VehicleImpl.VehicleBuilder.newInstance("v1").setLocationId("yo").setType(type1).build(); Vehicle v2 = VehicleImpl.VehicleBuilder.newInstance("v2").setLocationId("yo").setType(type1).build(); diff --git a/jsprit-core/src/test/java/basics/io/VrpWriterV2Test.java b/jsprit-core/src/test/java/basics/io/VrpWriterV2Test.java index eae79489..1fd8d17d 100644 --- a/jsprit-core/src/test/java/basics/io/VrpWriterV2Test.java +++ b/jsprit-core/src/test/java/basics/io/VrpWriterV2Test.java @@ -43,7 +43,8 @@ import basics.route.Start; import basics.route.Vehicle; import basics.route.VehicleImpl; import basics.route.VehicleRoute; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class VrpWriterV2Test { @@ -65,7 +66,7 @@ public class VrpWriterV2Test { // builder.addDepot(depot2); // builder.assignVehicleType(depot, VehicleType.Builder.newInstance("vehType", 20).build()); // builder.assignVehicleType(depot, VehicleType.Builder.newInstance("vehType2", 200).build()); - VehicleType type = VehicleType.Builder.newInstance("vehType", 20).build(); + VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("myVehicle").setLocationId("loc").setType(type).build(); builder.addVehicle(vehicle); VehicleRoutingProblem vrp = builder.build(); @@ -80,8 +81,8 @@ public class VrpWriterV2Test { // Depot depot = new Depot("depotLoc",Coordinate.newInstance(0, 0)); // Depot depot2 = new Depot("depotLoc2",Coordinate.newInstance(100, 100)); // builder.addDepot(depot2); - VehicleType type1 = VehicleType.Builder.newInstance("vehType", 20).build(); - VehicleType type2 = VehicleType.Builder.newInstance("vehType2", 200).build(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); + VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2", 200).build(); Vehicle v1 = VehicleImpl.VehicleBuilder.newInstance("v1").setLocationId("loc").setType(type1).build(); Vehicle v2 = VehicleImpl.VehicleBuilder.newInstance("v2").setLocationId("loc").setType(type2).build(); builder.addVehicleType(type1); @@ -100,8 +101,8 @@ public class VrpWriterV2Test { // Depot depot = new Depot("depotLoc",Coordinate.newInstance(0, 0)); // Depot depot2 = new Depot("depotLoc2",Coordinate.newInstance(100, 100)); // builder.addDepot(depot2); - VehicleType type1 = VehicleType.Builder.newInstance("vehType", 20).build(); - VehicleType type2 = VehicleType.Builder.newInstance("vehType2", 200).build(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); + VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2", 200).build(); Vehicle v1 = VehicleImpl.VehicleBuilder.newInstance("v1").setLocationId("loc").setType(type1).build(); Vehicle v2 = VehicleImpl.VehicleBuilder.newInstance("v2").setLocationId("loc").setType(type2).build(); builder.addVehicleType(type1); @@ -119,8 +120,8 @@ public class VrpWriterV2Test { public void whenWritingServices_itWritesThemCorrectly(){ Builder builder = VehicleRoutingProblem.Builder.newInstance(); - VehicleType type1 = VehicleType.Builder.newInstance("vehType", 20).build(); - VehicleType type2 = VehicleType.Builder.newInstance("vehType2", 200).build(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); + VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2", 200).build(); Vehicle v1 = VehicleImpl.VehicleBuilder.newInstance("v1").setLocationId("loc").setType(type1).build(); Vehicle v2 = VehicleImpl.VehicleBuilder.newInstance("v2").setLocationId("loc").setType(type2).build(); @@ -152,8 +153,8 @@ public class VrpWriterV2Test { VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); builder.setFleetComposition(FleetComposition.HETEROGENEOUS); builder.setFleetSize(FleetSize.FINITE); - VehicleType type1 = VehicleType.Builder.newInstance("vehType", 20).build(); - VehicleType type2 = VehicleType.Builder.newInstance("vehType2", 200).build(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); + VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2", 200).build(); Vehicle v1 = VehicleImpl.VehicleBuilder.newInstance("v1").setLocationId("loc").setType(type1).build(); Vehicle v2 = VehicleImpl.VehicleBuilder.newInstance("v2").setLocationId("loc").setType(type2).build(); builder.addVehicleType(type1); diff --git a/jsprit-core/src/test/java/basics/io/VrpWriterV3Test.java b/jsprit-core/src/test/java/basics/io/VrpWriterV3Test.java index 79753430..40c2068c 100644 --- a/jsprit-core/src/test/java/basics/io/VrpWriterV3Test.java +++ b/jsprit-core/src/test/java/basics/io/VrpWriterV3Test.java @@ -43,7 +43,8 @@ import basics.route.Start; import basics.route.Vehicle; import basics.route.VehicleImpl; import basics.route.VehicleRoute; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class VrpWriterV3Test { @@ -59,8 +60,8 @@ public class VrpWriterV3Test { VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); builder.setFleetComposition(FleetComposition.HETEROGENEOUS); builder.setFleetSize(FleetSize.FINITE); - VehicleType type1 = VehicleType.Builder.newInstance("vehType", 20).build(); - VehicleType type2 = VehicleType.Builder.newInstance("vehType2", 200).build(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType", 20).build(); + VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2", 200).build(); Vehicle v1 = VehicleImpl.VehicleBuilder.newInstance("v1").setLocationId("loc").setType(type1).build(); Vehicle v2 = VehicleImpl.VehicleBuilder.newInstance("v2").setLocationId("loc").setType(type2).build(); builder.addVehicleType(type1); diff --git a/jsprit-core/src/test/java/basics/route/TestVehicleRoute.java b/jsprit-core/src/test/java/basics/route/TestVehicleRoute.java index 954f714e..7e8eefbf 100644 --- a/jsprit-core/src/test/java/basics/route/TestVehicleRoute.java +++ b/jsprit-core/src/test/java/basics/route/TestVehicleRoute.java @@ -29,15 +29,6 @@ import org.junit.Before; import org.junit.Test; import basics.Service; -import basics.Service.Builder; -import basics.route.DriverImpl; -import basics.route.ServiceActivity; -import basics.route.Start; -import basics.route.TourActivities; -import basics.route.TourActivity; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleRoute; import basics.route.DriverImpl.NoDriver; public class TestVehicleRoute { @@ -47,7 +38,7 @@ public class TestVehicleRoute { @Before public void doBefore(){ - vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("loc").setType(VehicleImpl.VehicleType.Builder.newInstance("yo", 0).build()).build(); + vehicle = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("loc").setType(VehicleTypeImpl.Builder.newInstance("yo", 0).build()).build(); driver = DriverImpl.noDriver(); } @@ -97,7 +88,7 @@ public class TestVehicleRoute { @Test public void whenBuildingEmptyTour_tourIterIteratesOverAnEmptyList(){ TourActivities tour = new TourActivities(); - Vehicle v = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("loc").setType(VehicleImpl.VehicleType.Builder.newInstance("yo", 0).build()).build(); + Vehicle v = VehicleImpl.VehicleBuilder.newInstance("v").setLocationId("loc").setType(VehicleTypeImpl.Builder.newInstance("yo", 0).build()).build(); VehicleRoute route = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),v); Iterator iter = route.getTourActivities().iterator(); int count = 0; diff --git a/jsprit-examples/input/algorithmConfig.xml b/jsprit-examples/input/algorithmConfig.xml index ddf54736..19d8d042 100755 --- a/jsprit-examples/input/algorithmConfig.xml +++ b/jsprit-examples/input/algorithmConfig.xml @@ -34,19 +34,19 @@ - 0.15 + 0.0 100 - 0.3 + 0.15 - 0.3 + 0.0 @@ -55,13 +55,13 @@ - 0.2 + 0.1 - 0.3 + 0.2 @@ -70,13 +70,13 @@ - 0.1 + 0.025 - 0.4 + 0.8 diff --git a/jsprit-examples/src/main/java/examples/ConcurrentMultipleDepotExample.java b/jsprit-examples/src/main/java/examples/ConcurrentMultipleDepotExample.java deleted file mode 100644 index d4e3205f..00000000 --- a/jsprit-examples/src/main/java/examples/ConcurrentMultipleDepotExample.java +++ /dev/null @@ -1,107 +0,0 @@ -package examples; - -import java.util.Arrays; -import java.util.Collection; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import util.Coordinate; -import util.Solutions; -import algorithms.VehicleRoutingAlgorithms; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.StopWatch; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.algo.VehicleRoutingAlgorithmListeners.Priority; -import basics.io.VrpXMLReader; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; - -public class ConcurrentMultipleDepotExample { - - /** - * @param args - */ - public static void main(String[] args) { - - VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); - /* - * Read cordeau-instance p01, BUT only its services without any vehicles - */ - new VrpXMLReader(vrpBuilder).read("input/vrp_cordeau_01.xml"); - - /* - * add vehicles with its depots - * 4 depots: - * (20,20) - * (30,40) - * (50,30) - * (60,50) - * - * each with 4 vehicles each with a capacity of 80 - */ - int nuOfVehicles = 4; - int capacity = 80; - Coordinate firstDepotCoord = Coordinate.newInstance(20, 20); - Coordinate second = Coordinate.newInstance(30, 40); - Coordinate third = Coordinate.newInstance(50, 30); - Coordinate fourth = Coordinate.newInstance(60, 50); - - int depotCounter = 1; - for(Coordinate depotCoord : Arrays.asList(firstDepotCoord,second,third,fourth)){ - for(int i=0;i solutions = vra.searchSolutions(); - - executor.shutdown(); - // Wait until all threads are finish - while (!executor.isTerminated()) { - - } - System.out.println("Finished all threads"); - - SolutionPrinter.print(Solutions.getBest(solutions)); - SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.getBest(solutions), "output/p01_solution.png", "p01"); - - } - -} diff --git a/jsprit-examples/src/main/java/examples/ConcurrentMultipleDepotExampleWithPenaltyVehicles.java b/jsprit-examples/src/main/java/examples/ConcurrentMultipleDepotExampleWithPenaltyVehicles.java deleted file mode 100644 index 86ef08ae..00000000 --- a/jsprit-examples/src/main/java/examples/ConcurrentMultipleDepotExampleWithPenaltyVehicles.java +++ /dev/null @@ -1,126 +0,0 @@ -package examples; - -import java.util.Arrays; -import java.util.Collection; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import util.Coordinate; -import util.Solutions; -import algorithms.VehicleRoutingAlgorithms; -import analysis.AlgorithmSearchProgressChartListener; -import analysis.SolutionPlotter; -import analysis.SolutionPrinter; -import analysis.StopWatch; -import basics.VehicleRoutingAlgorithm; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblem.FleetSize; -import basics.VehicleRoutingProblemSolution; -import basics.algo.VehicleRoutingAlgorithmListeners.Priority; -import basics.io.VrpXMLReader; -import basics.route.Vehicle; -import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; - -public class ConcurrentMultipleDepotExampleWithPenaltyVehicles { - - /** - * @param args - */ - public static void main(String[] args) { - - VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); - /* - * Read cordeau-instance p01, BUT only its services without any vehicles - */ - new VrpXMLReader(vrpBuilder).read("input/vrp_cordeau_08.xml"); - - /* - * add vehicles with its depots - * 2 depots: - * (-33,33) - * (33,-33) - * - * each with 14 vehicles each with a capacity of 500 and a maximum duration of 310 - */ - int nuOfVehicles = 14; - int capacity = 500; - double maxDuration = 310; - Coordinate firstDepotCoord = Coordinate.newInstance(-33, 33); - Coordinate second = Coordinate.newInstance(33, -33); - - /* - * number of penalty vehicles - */ - int nuOfPenaltyVehicles = 4; - int depotCounter = 1; - for(Coordinate depotCoord : Arrays.asList(firstDepotCoord,second)){ - for(int i=0;i solutions = vra.searchSolutions(); - - executor.shutdown(); - // Wait until all threads are finish - while (!executor.isTerminated()) { - - } - System.out.println("Finished all threads"); - - SolutionPrinter.print(Solutions.getBest(solutions)); - SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.getBest(solutions), "output/p08_solution.png", "p08"); - - } - -} diff --git a/jsprit-examples/src/main/java/examples/MultipleDepotExample.java b/jsprit-examples/src/main/java/examples/MultipleDepotExample.java index b3dd73ba..2d364064 100644 --- a/jsprit-examples/src/main/java/examples/MultipleDepotExample.java +++ b/jsprit-examples/src/main/java/examples/MultipleDepotExample.java @@ -18,7 +18,8 @@ import basics.algo.VehicleRoutingAlgorithmListeners.Priority; import basics.io.VrpXMLReader; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class MultipleDepotExample { @@ -53,7 +54,7 @@ public class MultipleDepotExample { int depotCounter = 1; for(Coordinate depotCoord : Arrays.asList(firstDepotCoord,second,third,fourth)){ for(int i=0;i solutions = vra.searchSolutions(); SolutionPrinter.print(Solutions.getBest(solutions)); diff --git a/jsprit-examples/src/main/java/examples/MultipleDepotExampleWithPenaltyVehicles.java b/jsprit-examples/src/main/java/examples/MultipleDepotExampleWithPenaltyVehicles.java index 50d6c814..ecc930f2 100644 --- a/jsprit-examples/src/main/java/examples/MultipleDepotExampleWithPenaltyVehicles.java +++ b/jsprit-examples/src/main/java/examples/MultipleDepotExampleWithPenaltyVehicles.java @@ -9,6 +9,7 @@ import algorithms.VehicleRoutingAlgorithms; import analysis.AlgorithmSearchProgressChartListener; import analysis.SolutionPlotter; import analysis.SolutionPrinter; +import analysis.SolutionPrinter.Print; import analysis.StopWatch; import basics.VehicleRoutingAlgorithm; import basics.VehicleRoutingProblem; @@ -16,9 +17,10 @@ import basics.VehicleRoutingProblem.FleetSize; import basics.VehicleRoutingProblemSolution; import basics.algo.VehicleRoutingAlgorithmListeners.Priority; import basics.io.VrpXMLReader; +import basics.route.PenaltyVehicleType; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleTypeImpl; public class MultipleDepotExampleWithPenaltyVehicles { @@ -50,7 +52,7 @@ public class MultipleDepotExampleWithPenaltyVehicles { int depotCounter = 1; for(Coordinate depotCoord : Arrays.asList(firstDepotCoord,second)){ for(int i=0;i solutions = vra.searchSolutions(); - SolutionPrinter.print(Solutions.getBest(solutions)); + SolutionPrinter.print(Solutions.getBest(solutions),Print.VERBOSE); SolutionPlotter.plotSolutionAsPNG(vrp, Solutions.getBest(solutions), "output/p08_solution.png", "p08"); } diff --git a/jsprit-examples/src/main/java/examples/RefuseCollectionExample.java b/jsprit-examples/src/main/java/examples/RefuseCollectionExample.java index 02138a14..5a531208 100644 --- a/jsprit-examples/src/main/java/examples/RefuseCollectionExample.java +++ b/jsprit-examples/src/main/java/examples/RefuseCollectionExample.java @@ -43,7 +43,7 @@ import basics.io.VrpXMLWriter; import basics.route.Driver; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleTypeImpl; /** @@ -157,9 +157,9 @@ public class RefuseCollectionExample { /* * create vehicle-type and vehicle */ - VehicleType.Builder typeBuilder = VehicleType.Builder.newInstance("vehicle-type", 23); + VehicleTypeImpl.Builder typeBuilder = VehicleTypeImpl.Builder.newInstance("vehicle-type", 23); typeBuilder.setCostPerDistance(1.0); - VehicleType bigType = typeBuilder.build(); + VehicleTypeImpl bigType = typeBuilder.build(); VehicleImpl.VehicleBuilder vehicleBuilder = VehicleImpl.VehicleBuilder.newInstance("vehicle"); vehicleBuilder.setLocationId("1"); diff --git a/jsprit-examples/src/main/java/examples/SimpleExample.java b/jsprit-examples/src/main/java/examples/SimpleExample.java index a0bf60dc..2b52a0e2 100644 --- a/jsprit-examples/src/main/java/examples/SimpleExample.java +++ b/jsprit-examples/src/main/java/examples/SimpleExample.java @@ -36,7 +36,8 @@ import basics.io.VrpXMLWriter; import basics.route.Vehicle; import basics.route.VehicleImpl; import basics.route.VehicleImpl.VehicleBuilder; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; public class SimpleExample { @@ -45,8 +46,8 @@ public class SimpleExample { /* * get a vehicle type-builder and build a type with the typeId "vehicleType" and a capacity of 2 */ - VehicleType.Builder vehicleTypeBuilder = VehicleImpl.VehicleType.Builder.newInstance("vehicleType", 2); - VehicleType vehicleType = vehicleTypeBuilder.build(); + VehicleTypeImpl.Builder vehicleTypeBuilder = VehicleTypeImpl.Builder.newInstance("vehicleType", 2); + VehicleTypeImpl vehicleType = vehicleTypeBuilder.build(); /* * get a vehicle-builder and build a vehicle located at (10,10) with type "vehicleType" diff --git a/jsprit-examples/src/main/java/examples/SolomonExample.java b/jsprit-examples/src/main/java/examples/SolomonExample.java index 905a1652..ef17937c 100644 --- a/jsprit-examples/src/main/java/examples/SolomonExample.java +++ b/jsprit-examples/src/main/java/examples/SolomonExample.java @@ -66,7 +66,7 @@ public class SolomonExample { * The algorithm can be defined and configured in an xml-file. */ VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); -// vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener(pngFileName)); + vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png")); /* * Solve the problem. * diff --git a/jsprit-instances/src/main/java/readers/ChristophidesReader.java b/jsprit-instances/src/main/java/readers/ChristophidesReader.java index 146f154f..750cf65b 100644 --- a/jsprit-instances/src/main/java/readers/ChristophidesReader.java +++ b/jsprit-instances/src/main/java/readers/ChristophidesReader.java @@ -33,7 +33,8 @@ import util.Coordinate; import basics.route.Vehicle; import basics.route.VehicleImpl; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; import basics.Service; import basics.VehicleRoutingProblem; import basics.VehicleRoutingProblem.FleetSize; @@ -92,7 +93,7 @@ public class ChristophidesReader { else if(counter == 1){ String id = Integer.valueOf(counter).toString(); Coordinate depotCoord = makeCoord(tokens[0].trim(),tokens[1].trim()); - VehicleType vehicleType = VehicleImpl.VehicleType.Builder.newInstance("christophidesType", vehicleCapacity). + VehicleTypeImpl vehicleType = VehicleType.Builder.newInstance("christophidesType", vehicleCapacity). setCostPerDistance(1.0).setFixedCost(100).build(); Vehicle vehicle = VehicleImpl.VehicleBuilder.newInstance("christophidesVehicle").setLatestArrival(endTime).setLocationId(id).setLocationCoord(depotCoord). setType(vehicleType).build(); diff --git a/jsprit-instances/src/main/java/readers/CordeauReader.java b/jsprit-instances/src/main/java/readers/CordeauReader.java index 8e09362e..71e085ce 100644 --- a/jsprit-instances/src/main/java/readers/CordeauReader.java +++ b/jsprit-instances/src/main/java/readers/CordeauReader.java @@ -36,7 +36,8 @@ import util.Coordinate; import basics.VehicleRoutingProblem.FleetSize; import basics.route.VehicleImpl; import basics.route.VehicleImpl.VehicleBuilder; -import basics.route.VehicleImpl.VehicleType; +import basics.route.VehicleType; +import basics.route.VehicleTypeImpl; import basics.Service; import basics.VehicleRoutingProblem; @@ -100,7 +101,7 @@ public class CordeauReader { int duration = Integer.parseInt(tokens[0].trim()); if(duration == 0) duration = 999999; int capacity = Integer.parseInt(tokens[1].trim()); - VehicleType vehicleType = VehicleImpl.VehicleType.Builder.newInstance(counter + "_cordeauType", capacity). + VehicleTypeImpl vehicleType = VehicleType.Builder.newInstance(counter + "_cordeauType", capacity). setCostPerDistance(1.0).setFixedCost(0).build(); List builders = new ArrayList(); for(int vehicleCounter=0;vehicleCounter