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:
parent
97faf7fb53
commit
cdf4878bf9
7 changed files with 143 additions and 47 deletions
|
|
@ -61,16 +61,23 @@ final class CalculatesVehTypeDepServiceInsertion implements JobInsertionCalculat
|
|||
InsertionData bestIData = InsertionData.noInsertionFound();
|
||||
double bestKnownCost_ = bestKnownCost;
|
||||
Collection<Vehicle> relevantVehicles = new ArrayList<Vehicle>();
|
||||
if(!(selectedVehicle instanceof NoVehicle)) relevantVehicles.add(selectedVehicle);
|
||||
for(TypeKey typeKey : fleetManager.getAvailableVehicleTypes()){
|
||||
if(!(currentRoute.getVehicle() instanceof NoVehicle)){
|
||||
TypeKey key = makeTypeKey(currentRoute.getVehicle().getType(),currentRoute.getVehicle().getLocationId());
|
||||
if(typeKey.equals(key)){
|
||||
continue;
|
||||
if(!(selectedVehicle instanceof NoVehicle)) {
|
||||
relevantVehicles.add(selectedVehicle);
|
||||
relevantVehicles.addAll(fleetManager.getAvailableVehicle(selectedVehicle.getType().getTypeId(),selectedVehicle.getLocationId()));
|
||||
}
|
||||
else{
|
||||
relevantVehicles.addAll(fleetManager.getAvailableVehicles());
|
||||
}
|
||||
relevantVehicles.add(fleetManager.getEmptyVehicle(typeKey));
|
||||
}
|
||||
//
|
||||
// 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){
|
||||
double depTime = v.getEarliestDeparture();
|
||||
InsertionData iData = insertionCalculator.calculate(currentRoute, jobToInsert, v, depTime, selectedDriver, bestKnownCost_);
|
||||
|
|
@ -86,8 +93,8 @@ final class CalculatesVehTypeDepServiceInsertion implements JobInsertionCalculat
|
|||
return bestIData;
|
||||
}
|
||||
|
||||
private TypeKey makeTypeKey(VehicleType type, String locationId) {
|
||||
return new TypeKey(type,locationId);
|
||||
}
|
||||
// private TypeKey makeTypeKey(VehicleType type, String locationId) {
|
||||
// return new TypeKey(type,locationId);
|
||||
// }
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ final class FindCheaperVehicleAlgo {
|
|||
if(vehicleRoute.getTourActivities() == null || vehicleRoute.getVehicle() == null){
|
||||
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;
|
||||
Vehicle bestVehicle = null;
|
||||
List<TourActivity> path = new ArrayList<TourActivity>();
|
||||
|
|
@ -80,8 +80,8 @@ final class FindCheaperVehicleAlgo {
|
|||
path.addAll(vehicleRoute.getTourActivities().getActivities());
|
||||
path.add(vehicleRoute.getEnd());
|
||||
|
||||
for(TypeKey vehicleType : availableVehicleTypes){
|
||||
Vehicle vehicle = fleetManager.getEmptyVehicle(vehicleType);
|
||||
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)){
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ package algorithms;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
|
@ -33,20 +31,19 @@ import java.util.Set;
|
|||
import org.apache.log4j.Logger;
|
||||
|
||||
import basics.route.Vehicle;
|
||||
import basics.route.VehicleImpl.VehicleType;
|
||||
|
||||
class InfiniteVehicles implements VehicleFleetManager{
|
||||
|
||||
static class TypeKeyComparator implements Comparator<TypeKey>{
|
||||
|
||||
@Override
|
||||
public int compare(TypeKey k1, TypeKey k2) {
|
||||
double k1_fix = k1.type.getVehicleCostParams().fix;
|
||||
double k2_fix = k2.type.getVehicleCostParams().fix;
|
||||
return (int)(k1_fix - k2_fix);
|
||||
}
|
||||
|
||||
}
|
||||
// static class TypeKeyComparator implements Comparator<TypeKey>{
|
||||
//
|
||||
// @Override
|
||||
// public int compare(TypeKey k1, TypeKey k2) {
|
||||
// double k1_fix = k1.type.getVehicleCostParams().fix;
|
||||
// double k2_fix = k2.type.getVehicleCostParams().fix;
|
||||
// return (int)(k1_fix - k2_fix);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
private static Logger logger = Logger.getLogger(InfiniteVehicles.class);
|
||||
|
||||
|
|
@ -66,12 +63,12 @@ class InfiniteVehicles implements VehicleFleetManager{
|
|||
|
||||
private void extractTypes(Collection<Vehicle> 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);
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@ interface VehicleFleetManager {
|
|||
|
||||
public static class TypeKey {
|
||||
|
||||
public final VehicleType type;
|
||||
public final String type;
|
||||
public final String locationId;
|
||||
|
||||
public TypeKey(VehicleType type, String locationId) {
|
||||
public TypeKey(String typeId, String locationId) {
|
||||
super();
|
||||
this.type = type;
|
||||
this.type = typeId;
|
||||
this.locationId = locationId;
|
||||
}
|
||||
|
||||
|
|
@ -71,6 +71,7 @@ interface VehicleFleetManager {
|
|||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public abstract Vehicle getEmptyVehicle(TypeKey typeId);
|
||||
|
|
@ -87,4 +88,8 @@ interface VehicleFleetManager {
|
|||
|
||||
public abstract void unlockAll();
|
||||
|
||||
public abstract Collection<? extends Vehicle> getAvailableVehicles();
|
||||
|
||||
Collection<? extends Vehicle> getAvailableVehicle(String withoutThisType, String locationId);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,6 +97,10 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
|
|||
|
||||
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) {
|
||||
super();
|
||||
this.vehicles = vehicles;
|
||||
|
|
@ -122,6 +126,7 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
|
|||
|
||||
private void makeMap() {
|
||||
typeMapOfAvailableVehicles = new HashMap<TypeKey, TypeContainer>();
|
||||
penaltyVehicles = new HashMap<VehicleFleetManager.TypeKey, Vehicle>();
|
||||
for(Vehicle v : vehicles){
|
||||
addVehicle(v);
|
||||
}
|
||||
|
|
@ -131,20 +136,30 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
|
|||
if(v.getType() == null){
|
||||
throw new IllegalStateException("vehicle needs type");
|
||||
}
|
||||
// String typeId = v.getType().typeId;
|
||||
TypeKey typeKey = new TypeKey(v.getType(),v.getLocationId());
|
||||
String typeId = v.getType().typeId;
|
||||
if(typeId.contains("penalty")){
|
||||
String[] typeIdTokens = typeId.split("#");
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
private void removeVehicle(Vehicle v){
|
||||
TypeKey key = new TypeKey(v.getType(),v.getLocationId());
|
||||
//it might be better to introduce a class PenaltyVehicle
|
||||
if(!v.getType().getTypeId().contains("penalty")){
|
||||
TypeKey key = new TypeKey(v.getType().getTypeId(),v.getLocationId());
|
||||
if(typeMapOfAvailableVehicles.containsKey(key)){
|
||||
typeMapOfAvailableVehicles.get(key).remove(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#getEmptyVehicle(java.lang.String)
|
||||
|
|
@ -168,10 +183,65 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
|
|||
if(!typeMapOfAvailableVehicles.get(key).isEmpty()){
|
||||
types.add(key);
|
||||
}
|
||||
else{
|
||||
|
||||
}
|
||||
}
|
||||
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)
|
||||
* @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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#isLocked(org.matsim.contrib.freight.vrp.basics.Vehicle)
|
||||
*/
|
||||
|
|
@ -244,4 +316,6 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,8 +60,8 @@ public class CalcVehicleTypeDependentServiceInsertionTest {
|
|||
fleetManager = mock(VehicleFleetManager.class);
|
||||
service = mock(Service.class);
|
||||
vehicleRoute = mock(VehicleRoute.class);
|
||||
TypeKey typeKey1 = new TypeKey(veh1.getType(),veh1.getLocationId());
|
||||
TypeKey typeKey2 = new TypeKey(veh2.getType(),veh2.getLocationId());
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ public class TestVehicleFleetManager extends TestCase{
|
|||
}
|
||||
|
||||
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);
|
||||
assertEquals(v.getId(), v1.getId());
|
||||
}
|
||||
|
|
@ -87,10 +87,10 @@ public class TestVehicleFleetManager extends TestCase{
|
|||
}
|
||||
|
||||
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);
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue