1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

change fleetManager concept - instead of returned available types, it

returns vehicles; adapt CalculatesVehTypeDepServiceInsertion to changes
in FleetManager
This commit is contained in:
oblonski 2013-06-20 16:57:39 +02:00
parent 97faf7fb53
commit cdf4878bf9
7 changed files with 143 additions and 47 deletions

View file

@ -61,16 +61,23 @@ final class CalculatesVehTypeDepServiceInsertion implements JobInsertionCalculat
InsertionData bestIData = InsertionData.noInsertionFound(); InsertionData bestIData = InsertionData.noInsertionFound();
double bestKnownCost_ = bestKnownCost; double bestKnownCost_ = bestKnownCost;
Collection<Vehicle> relevantVehicles = new ArrayList<Vehicle>(); Collection<Vehicle> relevantVehicles = new ArrayList<Vehicle>();
if(!(selectedVehicle instanceof NoVehicle)) relevantVehicles.add(selectedVehicle); if(!(selectedVehicle instanceof NoVehicle)) {
for(TypeKey typeKey : fleetManager.getAvailableVehicleTypes()){ relevantVehicles.add(selectedVehicle);
if(!(currentRoute.getVehicle() instanceof NoVehicle)){ relevantVehicles.addAll(fleetManager.getAvailableVehicle(selectedVehicle.getType().getTypeId(),selectedVehicle.getLocationId()));
TypeKey key = makeTypeKey(currentRoute.getVehicle().getType(),currentRoute.getVehicle().getLocationId());
if(typeKey.equals(key)){
continue;
}
}
relevantVehicles.add(fleetManager.getEmptyVehicle(typeKey));
} }
else{
relevantVehicles.addAll(fleetManager.getAvailableVehicles());
}
//
// for(TypeKey typeKey : fleetManager.getAvailableVehicleTypes()){
// if(!(currentRoute.getVehicle() instanceof NoVehicle)){
// TypeKey key = makeTypeKey(currentRoute.getVehicle().getType(),currentRoute.getVehicle().getLocationId());
// if(typeKey.equals(key)){
// continue;
// }
// }
// relevantVehicles.add(fleetManager.getEmptyVehicle(typeKey));
// }
for(Vehicle v : relevantVehicles){ for(Vehicle v : relevantVehicles){
double depTime = v.getEarliestDeparture(); double depTime = v.getEarliestDeparture();
InsertionData iData = insertionCalculator.calculate(currentRoute, jobToInsert, v, depTime, selectedDriver, bestKnownCost_); InsertionData iData = insertionCalculator.calculate(currentRoute, jobToInsert, v, depTime, selectedDriver, bestKnownCost_);
@ -86,8 +93,8 @@ final class CalculatesVehTypeDepServiceInsertion implements JobInsertionCalculat
return bestIData; return bestIData;
} }
private TypeKey makeTypeKey(VehicleType type, String locationId) { // private TypeKey makeTypeKey(VehicleType type, String locationId) {
return new TypeKey(type,locationId); // return new TypeKey(type,locationId);
} // }
} }

View file

@ -72,7 +72,7 @@ final class FindCheaperVehicleAlgo {
if(vehicleRoute.getTourActivities() == null || vehicleRoute.getVehicle() == null){ if(vehicleRoute.getTourActivities() == null || vehicleRoute.getVehicle() == null){
return vehicleRoute; return vehicleRoute;
} }
Collection<TypeKey> availableVehicleTypes = fleetManager.getAvailableVehicleTypes(new TypeKey(vehicleRoute.getVehicle().getType(),vehicleRoute.getVehicle().getLocationId())); // Collection<TypeKey> availableVehicleTypes = fleetManager.getAvailableVehicleTypes(new TypeKey(vehicleRoute.getVehicle().getType(),vehicleRoute.getVehicle().getLocationId()));
double bestSaving = 0.0; double bestSaving = 0.0;
Vehicle bestVehicle = null; Vehicle bestVehicle = null;
List<TourActivity> path = new ArrayList<TourActivity>(); List<TourActivity> path = new ArrayList<TourActivity>();
@ -80,8 +80,8 @@ final class FindCheaperVehicleAlgo {
path.addAll(vehicleRoute.getTourActivities().getActivities()); path.addAll(vehicleRoute.getTourActivities().getActivities());
path.add(vehicleRoute.getEnd()); path.add(vehicleRoute.getEnd());
for(TypeKey vehicleType : availableVehicleTypes){ for(Vehicle vehicle : fleetManager.getAvailableVehicle(vehicleRoute.getVehicle().getType().getTypeId(), vehicleRoute.getVehicle().getLocationId())){
Vehicle vehicle = fleetManager.getEmptyVehicle(vehicleType); // Vehicle vehicle = fleetManager.getEmptyVehicle(vehicleType);
if(vehicle.getType().typeId.equals(vehicleRoute.getVehicle().getType().typeId)){ if(vehicle.getType().typeId.equals(vehicleRoute.getVehicle().getType().typeId)){
continue; continue;
} }

View file

@ -22,8 +22,6 @@ package algorithms;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -33,20 +31,19 @@ import java.util.Set;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import basics.route.Vehicle; import basics.route.Vehicle;
import basics.route.VehicleImpl.VehicleType;
class InfiniteVehicles implements VehicleFleetManager{ class InfiniteVehicles implements VehicleFleetManager{
static class TypeKeyComparator implements Comparator<TypeKey>{ // static class TypeKeyComparator implements Comparator<TypeKey>{
//
@Override // @Override
public int compare(TypeKey k1, TypeKey k2) { // public int compare(TypeKey k1, TypeKey k2) {
double k1_fix = k1.type.getVehicleCostParams().fix; // double k1_fix = k1.type.getVehicleCostParams().fix;
double k2_fix = k2.type.getVehicleCostParams().fix; // double k2_fix = k2.type.getVehicleCostParams().fix;
return (int)(k1_fix - k2_fix); // return (int)(k1_fix - k2_fix);
} // }
//
} // }
private static Logger logger = Logger.getLogger(InfiniteVehicles.class); private static Logger logger = Logger.getLogger(InfiniteVehicles.class);
@ -66,12 +63,12 @@ class InfiniteVehicles implements VehicleFleetManager{
private void extractTypes(Collection<Vehicle> vehicles) { private void extractTypes(Collection<Vehicle> vehicles) {
for(Vehicle v : vehicles){ for(Vehicle v : vehicles){
TypeKey typeKey = new TypeKey(v.getType(),v.getLocationId()); TypeKey typeKey = new TypeKey(v.getType().getTypeId(),v.getLocationId());
types.put(typeKey,v); types.put(typeKey,v);
sortedTypes.add(typeKey); sortedTypes.add(typeKey);
} }
Collections.sort(sortedTypes, new TypeKeyComparator()); // Collections.sort(sortedTypes, new TypeKeyComparator());
} }
@ -112,4 +109,17 @@ class InfiniteVehicles implements VehicleFleetManager{
} }
@Override
public Collection<? extends Vehicle> getAvailableVehicles() {
// TODO Auto-generated method stub
return null;
}
@Override
public Collection<? extends Vehicle> getAvailableVehicle(
String withoutThisType, String locationId) {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -29,12 +29,12 @@ interface VehicleFleetManager {
public static class TypeKey { public static class TypeKey {
public final VehicleType type; public final String type;
public final String locationId; public final String locationId;
public TypeKey(VehicleType type, String locationId) { public TypeKey(String typeId, String locationId) {
super(); super();
this.type = type; this.type = typeId;
this.locationId = locationId; this.locationId = locationId;
} }
@ -69,7 +69,8 @@ interface VehicleFleetManager {
return false; return false;
return true; return true;
} }
} }
@ -87,4 +88,8 @@ interface VehicleFleetManager {
public abstract void unlockAll(); public abstract void unlockAll();
public abstract Collection<? extends Vehicle> getAvailableVehicles();
Collection<? extends Vehicle> getAvailableVehicle(String withoutThisType, String locationId);
} }

View file

@ -97,6 +97,10 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
private Map<TypeKey,TypeContainer> typeMapOfAvailableVehicles; private Map<TypeKey,TypeContainer> typeMapOfAvailableVehicles;
private Map<TypeKey,Vehicle> penaltyVehicles = new HashMap<VehicleFleetManager.TypeKey, Vehicle>();
// private Map<TypeKey,TypeContainer> typeMapOfAvailablePenaltyVehicles;
public VehicleFleetManagerImpl(Collection<Vehicle> vehicles) { public VehicleFleetManagerImpl(Collection<Vehicle> vehicles) {
super(); super();
this.vehicles = vehicles; this.vehicles = vehicles;
@ -122,6 +126,7 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
private void makeMap() { private void makeMap() {
typeMapOfAvailableVehicles = new HashMap<TypeKey, TypeContainer>(); typeMapOfAvailableVehicles = new HashMap<TypeKey, TypeContainer>();
penaltyVehicles = new HashMap<VehicleFleetManager.TypeKey, Vehicle>();
for(Vehicle v : vehicles){ for(Vehicle v : vehicles){
addVehicle(v); addVehicle(v);
} }
@ -131,18 +136,28 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
if(v.getType() == null){ if(v.getType() == null){
throw new IllegalStateException("vehicle needs type"); throw new IllegalStateException("vehicle needs type");
} }
// String typeId = v.getType().typeId; String typeId = v.getType().typeId;
TypeKey typeKey = new TypeKey(v.getType(),v.getLocationId()); if(typeId.contains("penalty")){
if(!typeMapOfAvailableVehicles.containsKey(typeKey)){ String[] typeIdTokens = typeId.split("#");
typeMapOfAvailableVehicles.put(typeKey, new TypeContainer(typeKey)); TypeKey typeKey = new TypeKey(typeIdTokens[0],v.getLocationId());
penaltyVehicles.put(typeKey, v);
}
else{
TypeKey typeKey = new TypeKey(v.getType().getTypeId(),v.getLocationId());
if(!typeMapOfAvailableVehicles.containsKey(typeKey)){
typeMapOfAvailableVehicles.put(typeKey, new TypeContainer(typeKey));
}
typeMapOfAvailableVehicles.get(typeKey).add(v);
} }
typeMapOfAvailableVehicles.get(typeKey).add(v);
} }
private void removeVehicle(Vehicle v){ private void removeVehicle(Vehicle v){
TypeKey key = new TypeKey(v.getType(),v.getLocationId()); //it might be better to introduce a class PenaltyVehicle
if(typeMapOfAvailableVehicles.containsKey(key)){ if(!v.getType().getTypeId().contains("penalty")){
typeMapOfAvailableVehicles.get(key).remove(v); TypeKey key = new TypeKey(v.getType().getTypeId(),v.getLocationId());
if(typeMapOfAvailableVehicles.containsKey(key)){
typeMapOfAvailableVehicles.get(key).remove(v);
}
} }
} }
@ -168,10 +183,65 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
if(!typeMapOfAvailableVehicles.get(key).isEmpty()){ if(!typeMapOfAvailableVehicles.get(key).isEmpty()){
types.add(key); types.add(key);
} }
else{
}
} }
return types; return types;
} }
/**
* Returns a collection of available vehicles.
*
*<p>If there is no vehicle with a certain type and location anymore, it looks up whether a penalty vehicle has been specified with
* this type and location. If so, it returns this penalty vehicle. If not, no vehicle with this type and location is returned.
*/
@Override
public Collection<? extends Vehicle> getAvailableVehicles() {
List<Vehicle> vehicles = new ArrayList<Vehicle>();
for(TypeKey key : typeMapOfAvailableVehicles.keySet()){
if(!typeMapOfAvailableVehicles.get(key).isEmpty()){
vehicles.add(typeMapOfAvailableVehicles.get(key).getVehicle());
}
else{
if(penaltyVehicles.containsKey(key)){
vehicles.add(penaltyVehicles.get(key));
}
}
}
return vehicles;
}
/**
* Returns a collection of available vehicles without vehicles with typeId 'withoutThisType' and locationId 'withThisLocation'.
*
* <p>If there is no vehicle with a certain type and location anymore, it looks up whether a penalty vehicle has been specified with
* this type and location. If so, it returns this penalty vehicle. If not, no vehicle with this type and location is returned.
*
* @param typeId to specify the typeId that should not be the returned collection
* @param locationId to specify the locationId that should not be in the returned collection
* @return collection of available vehicles without the vehicles that have the typeId 'withoutThisType' AND the locationId 'withThisLocation'.
*/
@Override
public Collection<? extends Vehicle> getAvailableVehicle(String withoutThisType, String withThisLocationId) {
List<Vehicle> vehicles = new ArrayList<Vehicle>();
TypeKey thisKey = new TypeKey(withoutThisType,withThisLocationId);
for(TypeKey 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));
}
}
}
return vehicles;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#lock(org.matsim.contrib.freight.vrp.basics.Vehicle) * @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#lock(org.matsim.contrib.freight.vrp.basics.Vehicle)
*/ */
@ -217,6 +287,8 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
return types; return types;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#isLocked(org.matsim.contrib.freight.vrp.basics.Vehicle) * @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#isLocked(org.matsim.contrib.freight.vrp.basics.Vehicle)
*/ */
@ -244,4 +316,6 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
} }
} }

View file

@ -60,8 +60,8 @@ public class CalcVehicleTypeDependentServiceInsertionTest {
fleetManager = mock(VehicleFleetManager.class); fleetManager = mock(VehicleFleetManager.class);
service = mock(Service.class); service = mock(Service.class);
vehicleRoute = mock(VehicleRoute.class); vehicleRoute = mock(VehicleRoute.class);
TypeKey typeKey1 = new TypeKey(veh1.getType(),veh1.getLocationId()); TypeKey typeKey1 = new TypeKey(veh1.getType().getTypeId(),veh1.getLocationId());
TypeKey typeKey2 = new TypeKey(veh2.getType(),veh2.getLocationId()); TypeKey typeKey2 = new TypeKey(veh2.getType().getTypeId(),veh2.getLocationId());
when(fleetManager.getAvailableVehicleTypes()).thenReturn(Arrays.asList(typeKey1,typeKey2)); when(fleetManager.getAvailableVehicleTypes()).thenReturn(Arrays.asList(typeKey1,typeKey2));
when(fleetManager.getEmptyVehicle(typeKey1)).thenReturn(veh1); when(fleetManager.getEmptyVehicle(typeKey1)).thenReturn(veh1);
when(fleetManager.getEmptyVehicle(typeKey2)).thenReturn(veh2); when(fleetManager.getEmptyVehicle(typeKey2)).thenReturn(veh2);

View file

@ -61,7 +61,7 @@ public class TestVehicleFleetManager extends TestCase{
} }
public void testGetVehicle(){ public void testGetVehicle(){
TypeKey typeKey = new TypeKey(v1.getType(),v1.getLocationId()); TypeKey typeKey = new TypeKey(v1.getType().getTypeId(),v1.getLocationId());
Vehicle v = fleetManager.getEmptyVehicle(typeKey); Vehicle v = fleetManager.getEmptyVehicle(typeKey);
assertEquals(v.getId(), v1.getId()); assertEquals(v.getId(), v1.getId());
} }
@ -87,10 +87,10 @@ public class TestVehicleFleetManager extends TestCase{
} }
public void testGetTypesWithout(){ public void testGetTypesWithout(){
TypeKey typeKey = new TypeKey(v1.getType(),v1.getLocationId()); TypeKey typeKey = new TypeKey(v1.getType().getTypeId(),v1.getLocationId());
Collection<TypeKey> types = fleetManager.getAvailableVehicleTypes(typeKey); Collection<TypeKey> types = fleetManager.getAvailableVehicleTypes(typeKey);
assertEquals(new TypeKey(v2.getType(),v2.getLocationId()), types.iterator().next()); assertEquals(new TypeKey(v2.getType().getTypeId(),v2.getLocationId()), types.iterator().next());
assertEquals(1, types.size()); assertEquals(1, types.size());
} }