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();
|
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;
|
|
||||||
}
|
}
|
||||||
|
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){
|
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);
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -71,6 +71,7 @@ interface VehicleFleetManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract Vehicle getEmptyVehicle(TypeKey typeId);
|
public abstract Vehicle getEmptyVehicle(TypeKey typeId);
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,20 +136,30 @@ 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")){
|
||||||
|
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)){
|
if(!typeMapOfAvailableVehicles.containsKey(typeKey)){
|
||||||
typeMapOfAvailableVehicles.put(typeKey, new TypeContainer(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(!v.getType().getTypeId().contains("penalty")){
|
||||||
|
TypeKey key = new TypeKey(v.getType().getTypeId(),v.getLocationId());
|
||||||
if(typeMapOfAvailableVehicles.containsKey(key)){
|
if(typeMapOfAvailableVehicles.containsKey(key)){
|
||||||
typeMapOfAvailableVehicles.get(key).remove(v);
|
typeMapOfAvailableVehicles.get(key).remove(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.matsim.contrib.freight.vrp.basics.VehicleFleetManager#getEmptyVehicle(java.lang.String)
|
* @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()){
|
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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue