From df105da98df16f1b5f56665a609e212749ab6a2b Mon Sep 17 00:00:00 2001 From: oblonski Date: Fri, 9 Oct 2015 13:06:21 +0200 Subject: [PATCH] improve vehicle fleet manager --- .../vehicle/VehicleFleetManagerImpl.java | 93 ++++++++----------- .../vehicle/TestVehicleFleetManagerImpl.java | 41 ++++---- 2 files changed, 60 insertions(+), 74 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerImpl.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerImpl.java index 7dc1f94b..a6bebe51 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleFleetManagerImpl.java @@ -20,7 +20,9 @@ import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; class VehicleFleetManagerImpl implements VehicleFleetManager { @@ -51,7 +53,6 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { public Vehicle getVehicle() { return vehicleList.get(0); -// return vehicleList.getFirst(); } public boolean isEmpty() { @@ -64,19 +65,21 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { private Collection vehicles; - private Set lockedVehicles; + private TypeContainer[] vehicleTypes; - private Map typeMapOfAvailableVehicles; - - private Map penaltyVehicles = new HashMap(); + private boolean[] locked; + private Vehicle[] vehicleArr; public VehicleFleetManagerImpl(Collection vehicles) { super(); this.vehicles = vehicles; - this.lockedVehicles = new HashSet(); - makeMap(); - logger.debug("initialise " + this); + int arrSize = vehicles.size() + 2; + locked = new boolean[arrSize]; + vehicleArr = new Vehicle[arrSize]; + vehicleTypes = new TypeContainer[arrSize]; + initializeVehicleTypes(); + logger.debug("initialise {}",this); } @Override @@ -84,10 +87,12 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { return "[name=finiteVehicles]"; } - private void makeMap() { - typeMapOfAvailableVehicles = new HashMap(); - penaltyVehicles = new HashMap(); + private void initializeVehicleTypes() { + for(int i=0;i< vehicleTypes.length;i++){ + vehicleTypes[i] = new TypeContainer(); + } for (Vehicle v : vehicles) { + vehicleArr[v.getIndex()]=v; addVehicle(v); } } @@ -96,19 +101,11 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { if (v.getType() == null) { throw new IllegalStateException("vehicle needs type"); } - VehicleTypeKey typeKey = new VehicleTypeKey(v.getType().getTypeId(), v.getStartLocation().getId(), v.getEndLocation().getId(), v.getEarliestDeparture(), v.getLatestArrival(), v.getSkills(), v.isReturnToDepot()); - if (!typeMapOfAvailableVehicles.containsKey(typeKey)) { - typeMapOfAvailableVehicles.put(typeKey, new TypeContainer()); - } - typeMapOfAvailableVehicles.get(typeKey).add(v); - + vehicleTypes[v.getVehicleTypeIdentifier().getIndex()].add(v); } private void removeVehicle(Vehicle v) { - VehicleTypeKey key = new VehicleTypeKey(v.getType().getTypeId(), v.getStartLocation().getId(), v.getEndLocation().getId(), v.getEarliestDeparture(), v.getLatestArrival(), v.getSkills(), v.isReturnToDepot()); - if (typeMapOfAvailableVehicles.containsKey(key)) { - typeMapOfAvailableVehicles.get(key).remove(v); - } + vehicleTypes[v.getVehicleTypeIdentifier().getIndex()].remove(v); } @@ -121,13 +118,9 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { @Override public Collection getAvailableVehicles() { List vehicles = new ArrayList(); - for (VehicleTypeKey key : typeMapOfAvailableVehicles.keySet()) { - if (!typeMapOfAvailableVehicles.get(key).isEmpty()) { - vehicles.add(typeMapOfAvailableVehicles.get(key).getVehicle()); - } else { - if (penaltyVehicles.containsKey(key)) { - vehicles.add(penaltyVehicles.get(key)); - } + for(int i=0;i< vehicleTypes.length;i++){ + if(!vehicleTypes[i].isEmpty()){ + vehicles.add(vehicleTypes[i].getVehicle()); } } return vehicles; @@ -136,15 +129,9 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { @Override public Collection getAvailableVehicles(Vehicle withoutThisType) { List vehicles = new ArrayList(); - VehicleTypeKey thisKey = new VehicleTypeKey(withoutThisType.getType().getTypeId(), withoutThisType.getStartLocation().getId(), withoutThisType.getEndLocation().getId(), withoutThisType.getEarliestDeparture(), withoutThisType.getLatestArrival(), withoutThisType.getSkills(), withoutThisType.isReturnToDepot()); - for (VehicleTypeKey key : typeMapOfAvailableVehicles.keySet()) { - if (key.equals(thisKey)) continue; - if (!typeMapOfAvailableVehicles.get(key).isEmpty()) { - vehicles.add(typeMapOfAvailableVehicles.get(key).getVehicle()); - } else { - if (penaltyVehicles.containsKey(key)) { - vehicles.add(penaltyVehicles.get(key)); - } + for(int i=0;i< vehicleTypes.length;i++){ + if(!vehicleTypes[i].isEmpty() && i != withoutThisType.getVehicleTypeIdentifier().getIndex()){ + vehicles.add(vehicleTypes[i].getVehicle()); } } return vehicles; @@ -158,11 +145,13 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { if (vehicles.isEmpty() || vehicle instanceof NoVehicle) { return; } - boolean locked = lockedVehicles.add(vehicle); - removeVehicle(vehicle); - if (!locked) { + if(locked[vehicle.getIndex()]){ throw new IllegalStateException("cannot lock vehicle twice " + vehicle.getId()); } + else{ + locked[vehicle.getIndex()] = true; + removeVehicle(vehicle); + } } /* (non-Javadoc) @@ -170,11 +159,10 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { */ @Override public void unlock(Vehicle vehicle) { - if (vehicles.isEmpty() || vehicle instanceof NoVehicle) { + if (vehicle == null || vehicles.isEmpty() || vehicle instanceof NoVehicle) { return; } - if (vehicle == null) return; - lockedVehicles.remove(vehicle); + locked[vehicle.getIndex()] = false; addVehicle(vehicle); } @@ -183,7 +171,7 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { */ @Override public boolean isLocked(Vehicle vehicle) { - return lockedVehicles.contains(vehicle); + return locked[vehicle.getIndex()]; } /* (non-Javadoc) @@ -191,18 +179,11 @@ class VehicleFleetManagerImpl implements VehicleFleetManager { */ @Override public void unlockAll() { - Collection locked = new ArrayList(lockedVehicles); - for (Vehicle v : locked) { - unlock(v); + for(int i=0;i vehicles = new ArrayList(); - vehicles.add(v1); - vehicles.add(v2); - vehicles.add(penalty4standard); - VehicleFleetManager fleetManager = new FiniteFleetManagerFactory(vehicles).createFleetManager(); - - Collection availableVehicles = fleetManager.getAvailableVehicles(); - assertEquals(2, availableVehicles.size()); - } - - @Test public void whenAddingTwoVehiclesWithSameTypeIdAndLocation_getAvailableVehicleShouldReturnOnlyOneOfThem() { VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("standard").build(); @@ -140,6 +140,7 @@ public class TestVehicleFleetManagerImpl { .setType(type).setEarliestStart(0.).setLatestArrival(10.).build(); Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setEndLocation(Location.newInstance("endLoc")) .setType(type2).setEarliestStart(0.).setLatestArrival(10.).build(); + VehicleRoutingProblem.Builder.newInstance().addVehicle(v1).addVehicle(v2).build(); VehicleFleetManager fleetManager = new FiniteFleetManagerFactory(Arrays.asList(v1, v2)).createFleetManager(); Collection vehicles = fleetManager.getAvailableVehicles(); assertEquals(2, vehicles.size()); @@ -154,6 +155,7 @@ public class TestVehicleFleetManagerImpl { .setType(type).setEarliestStart(0.).setLatestArrival(10.).build(); Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setEndLocation(Location.newInstance("endLoc")) .setType(type).setEarliestStart(0.).setLatestArrival(10.).build(); + VehicleRoutingProblem.Builder.newInstance().addVehicle(v1).addVehicle(v2).build(); VehicleFleetManager fleetManager = new FiniteFleetManagerFactory(Arrays.asList(v1, v2)).createFleetManager(); Collection vehicles = fleetManager.getAvailableVehicles(); assertEquals(2, vehicles.size()); @@ -168,6 +170,7 @@ public class TestVehicleFleetManagerImpl { .setType(type).setEarliestStart(0.).setLatestArrival(10.).build(); Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setEndLocation(Location.newInstance("endLoc")) .setType(type).setEarliestStart(0.).setLatestArrival(10.).build(); + VehicleRoutingProblem.Builder.newInstance().addVehicle(v1).addVehicle(v2).build(); VehicleFleetManager fleetManager = new FiniteFleetManagerFactory(Arrays.asList(v1, v2)).createFleetManager(); Collection vehicles = fleetManager.getAvailableVehicles(); assertEquals(2, vehicles.size()); @@ -182,6 +185,7 @@ public class TestVehicleFleetManagerImpl { .setType(type).setEarliestStart(5.).setLatestArrival(10.).build(); Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setEndLocation(Location.newInstance("endLoc")) .setType(type).setEarliestStart(0.).setLatestArrival(10.).build(); + VehicleRoutingProblem.Builder.newInstance().addVehicle(v1).addVehicle(v2).build(); VehicleFleetManager fleetManager = new FiniteFleetManagerFactory(Arrays.asList(v1, v2)).createFleetManager(); Collection vehicles = fleetManager.getAvailableVehicles(); assertEquals(2, vehicles.size()); @@ -196,6 +200,7 @@ public class TestVehicleFleetManagerImpl { .setType(type).setEarliestStart(0.).setLatestArrival(20.).build(); Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setEndLocation(Location.newInstance("endLoc")) .setType(type).setEarliestStart(0.).setLatestArrival(10.).build(); + VehicleRoutingProblem.Builder.newInstance().addVehicle(v1).addVehicle(v2).build(); VehicleFleetManager fleetManager = new FiniteFleetManagerFactory(Arrays.asList(v1, v2)).createFleetManager(); Collection vehicles = fleetManager.getAvailableVehicles(); assertEquals(2, vehicles.size());