mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
merge min-waiting-time branch
This commit is contained in:
parent
a9d1e03c56
commit
842067231d
62 changed files with 2770 additions and 2863 deletions
|
|
@ -128,8 +128,8 @@ public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_IT {
|
|||
* create cost-matrix
|
||||
*/
|
||||
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
|
||||
/*
|
||||
* read demand quantities
|
||||
/*
|
||||
* read demand quantities
|
||||
*/
|
||||
try {
|
||||
readDemandQuantities(vrpBuilder);
|
||||
|
|
|
|||
|
|
@ -128,8 +128,8 @@ public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndD
|
|||
* create cost-matrix
|
||||
*/
|
||||
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
|
||||
/*
|
||||
* read demand quantities
|
||||
/*
|
||||
* read demand quantities
|
||||
*/
|
||||
try {
|
||||
readDemandQuantities(vrpBuilder);
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ public class RefuseCollection_IT {
|
|||
*/
|
||||
VehicleRoutingTransportCostsMatrix.Builder matrixBuilder = VehicleRoutingTransportCostsMatrix.Builder.newInstance(true);
|
||||
/*
|
||||
* read demand quantities
|
||||
* read demand quantities
|
||||
*/
|
||||
readDemandQuantitiesAsServices(vrpBuilder);
|
||||
readDistances(matrixBuilder);
|
||||
|
|
@ -92,7 +92,7 @@ public class RefuseCollection_IT {
|
|||
public void whenReadingServices_usingJsprit_itShouldCalculateCorrectly() {
|
||||
|
||||
/*
|
||||
* create vehicle-type and vehicle
|
||||
* create vehicle-type and vehicle
|
||||
*/
|
||||
VehicleTypeImpl.Builder typeBuilder = VehicleTypeImpl.Builder.newInstance("vehicle-type").addCapacityDimension(0, 23);
|
||||
typeBuilder.setCostPerDistance(1.0);
|
||||
|
|
|
|||
|
|
@ -36,12 +36,12 @@ public class VariableDepartureAndWaitingTime_IT {
|
|||
AlgorithmFactory algorithmFactory;
|
||||
|
||||
@Before
|
||||
public void doBefore(){
|
||||
public void doBefore() {
|
||||
activityCosts = new VehicleRoutingActivityCosts() {
|
||||
|
||||
@Override
|
||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
||||
return vehicle.getType().getVehicleCostParams().perWaitingTimeUnit * Math.max(0,tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime);
|
||||
return vehicle.getType().getVehicleCostParams().perWaitingTimeUnit * Math.max(0, tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime);
|
||||
}
|
||||
|
||||
};
|
||||
|
|
@ -49,60 +49,59 @@ public class VariableDepartureAndWaitingTime_IT {
|
|||
@Override
|
||||
public VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp) {
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager);
|
||||
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
||||
|
||||
return Jsprit.Builder.newInstance(vrp)
|
||||
.addCoreStateAndConstraintStuff(true)
|
||||
.setStateAndConstraintManager(stateManager,constraintManager)
|
||||
.setObjectiveFunction(new SolutionCostCalculator() {
|
||||
@Override
|
||||
public double getCosts(VehicleRoutingProblemSolution solution) {
|
||||
SolutionAnalyser sa = new SolutionAnalyser(vrp, solution, new TransportDistance() {
|
||||
@Override
|
||||
public double getDistance(Location from, Location to) {
|
||||
return vrp.getTransportCosts().getTransportCost(from, to, 0., null, null);
|
||||
}
|
||||
});
|
||||
return sa.getWaitingTime() + sa.getDistance();
|
||||
}
|
||||
})
|
||||
.buildAlgorithm();
|
||||
return Jsprit.Builder.newInstance(vrp)
|
||||
.addCoreStateAndConstraintStuff(true)
|
||||
.setStateAndConstraintManager(stateManager, constraintManager)
|
||||
.setObjectiveFunction(new SolutionCostCalculator() {
|
||||
@Override
|
||||
public double getCosts(VehicleRoutingProblemSolution solution) {
|
||||
SolutionAnalyser sa = new SolutionAnalyser(vrp, solution, new TransportDistance() {
|
||||
@Override
|
||||
public double getDistance(Location from, Location to) {
|
||||
return vrp.getTransportCosts().getTransportCost(from, to, 0., null, null);
|
||||
}
|
||||
});
|
||||
return sa.getWaitingTime() + sa.getDistance();
|
||||
}
|
||||
})
|
||||
.buildAlgorithm();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Test
|
||||
public void plainSetupShouldWork(){
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0,0)).build();
|
||||
Service s1 = Service.Builder.newInstance("s1").setLocation(Location.newInstance(10,0)).build();
|
||||
Service s2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance(20,0)).build();
|
||||
public void plainSetupShouldWork() {
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
|
||||
Service s1 = Service.Builder.newInstance("s1").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service s2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance(20, 0)).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance()
|
||||
.addJob(s1).addJob(s2).addVehicle(v)
|
||||
.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
|
||||
.setRoutingCost(CostFactory.createManhattanCosts())
|
||||
.setActivityCosts(activityCosts)
|
||||
.build();
|
||||
.addJob(s1).addJob(s2).addVehicle(v)
|
||||
.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
|
||||
.setRoutingCost(CostFactory.createManhattanCosts())
|
||||
.setActivityCosts(activityCosts)
|
||||
.build();
|
||||
VehicleRoutingAlgorithm vra = algorithmFactory.createAlgorithm(vrp);
|
||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions());
|
||||
Assert.assertEquals(40.,solution.getCost());
|
||||
Assert.assertEquals(40., solution.getCost());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withTimeWindowsShouldWork(){
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0,0)).build();
|
||||
Service s1 = Service.Builder.newInstance("s1").setTimeWindow(TimeWindow.newInstance(1010,1100)).setLocation(Location.newInstance(10,0)).build();
|
||||
Service s2 = Service.Builder.newInstance("s2").setTimeWindow(TimeWindow.newInstance(1020,1100)).setLocation(Location.newInstance(20,0)).build();
|
||||
public void withTimeWindowsShouldWork() {
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
|
||||
Service s1 = Service.Builder.newInstance("s1").setTimeWindow(TimeWindow.newInstance(1010, 1100)).setLocation(Location.newInstance(10, 0)).build();
|
||||
Service s2 = Service.Builder.newInstance("s2").setTimeWindow(TimeWindow.newInstance(1020, 1100)).setLocation(Location.newInstance(20, 0)).build();
|
||||
final VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance()
|
||||
.addJob(s1).addJob(s2).addVehicle(v)
|
||||
.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
|
||||
.setRoutingCost(CostFactory.createManhattanCosts())
|
||||
.setActivityCosts(activityCosts)
|
||||
.build();
|
||||
.addJob(s1).addJob(s2).addVehicle(v)
|
||||
.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
|
||||
.setRoutingCost(CostFactory.createManhattanCosts())
|
||||
.setActivityCosts(activityCosts)
|
||||
.build();
|
||||
VehicleRoutingAlgorithm vra = algorithmFactory.createAlgorithm(vrp);
|
||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions());
|
||||
Assert.assertEquals(40.+1000.,solution.getCost());
|
||||
Assert.assertEquals(40. + 1000., solution.getCost());
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,49 +54,49 @@ import static org.mockito.Mockito.mock;
|
|||
|
||||
public class ServiceInsertionAndLoadConstraintsTest {
|
||||
|
||||
VehicleRoutingTransportCosts routingCosts;
|
||||
VehicleRoutingTransportCosts routingCosts;
|
||||
|
||||
VehicleRoutingActivityCosts activityCosts = new VehicleRoutingActivityCosts(){
|
||||
VehicleRoutingActivityCosts activityCosts = new VehicleRoutingActivityCosts() {
|
||||
|
||||
@Override
|
||||
public double getActivityCost(TourActivity tourAct, double arrivalTime,Driver driver, Vehicle vehicle) {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
HardActivityConstraint hardActivityLevelConstraint = new HardActivityConstraint() {
|
||||
HardActivityConstraint hardActivityLevelConstraint = new HardActivityConstraint() {
|
||||
|
||||
@Override
|
||||
public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
|
||||
return ConstraintsStatus.FULFILLED;
|
||||
}
|
||||
};
|
||||
@Override
|
||||
public ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
|
||||
return ConstraintsStatus.FULFILLED;
|
||||
}
|
||||
};
|
||||
|
||||
HardRouteConstraint hardRouteLevelConstraint = new HardRouteConstraint(){
|
||||
HardRouteConstraint hardRouteLevelConstraint = new HardRouteConstraint() {
|
||||
|
||||
@Override
|
||||
public boolean fulfilled(JobInsertionContext insertionContext) {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public boolean fulfilled(JobInsertionContext insertionContext) {
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
ActivityInsertionCostsCalculator activityInsertionCostsCalculator;
|
||||
ActivityInsertionCostsCalculator activityInsertionCostsCalculator;
|
||||
|
||||
ShipmentInsertionCalculator insertionCalculator;
|
||||
ShipmentInsertionCalculator insertionCalculator;
|
||||
|
||||
VehicleRoutingProblem vehicleRoutingProblem;
|
||||
|
||||
Vehicle vehicle;
|
||||
Vehicle vehicle;
|
||||
|
||||
@Before
|
||||
public void doBefore(){
|
||||
routingCosts = CostFactory.createManhattanCosts();
|
||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").addCapacityDimension(0, 2).setCostPerDistance(1).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("0,0")).setType(type).build();
|
||||
activityInsertionCostsCalculator = new LocalActivityInsertionCostsCalculator(routingCosts, activityCosts, mock(StateManager.class));
|
||||
createInsertionCalculator(hardRouteLevelConstraint);
|
||||
@Before
|
||||
public void doBefore() {
|
||||
routingCosts = CostFactory.createManhattanCosts();
|
||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").addCapacityDimension(0, 2).setCostPerDistance(1).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("0,0")).setType(type).build();
|
||||
activityInsertionCostsCalculator = new LocalActivityInsertionCostsCalculator(routingCosts, activityCosts, mock(StateManager.class));
|
||||
createInsertionCalculator(hardRouteLevelConstraint);
|
||||
vehicleRoutingProblem = mock(VehicleRoutingProblem.class);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,71 +61,71 @@ import static org.mockito.Mockito.when;
|
|||
|
||||
public class ShipmentInsertionCalculatorTest {
|
||||
|
||||
VehicleRoutingTransportCosts routingCosts;
|
||||
VehicleRoutingTransportCosts routingCosts;
|
||||
|
||||
VehicleRoutingProblem vehicleRoutingProblem;
|
||||
|
||||
VehicleRoutingActivityCosts activityCosts = new VehicleRoutingActivityCosts(){
|
||||
VehicleRoutingActivityCosts activityCosts = new VehicleRoutingActivityCosts() {
|
||||
|
||||
@Override
|
||||
public double getActivityCost(TourActivity tourAct, double arrivalTime,Driver driver, Vehicle vehicle) {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
HardRouteConstraint hardRouteLevelConstraint = new HardRouteConstraint(){
|
||||
HardRouteConstraint hardRouteLevelConstraint = new HardRouteConstraint() {
|
||||
|
||||
@Override
|
||||
public boolean fulfilled(JobInsertionContext insertionContext) {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public boolean fulfilled(JobInsertionContext insertionContext) {
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
ActivityInsertionCostsCalculator activityInsertionCostsCalculator;
|
||||
ActivityInsertionCostsCalculator activityInsertionCostsCalculator;
|
||||
|
||||
ShipmentInsertionCalculator insertionCalculator;
|
||||
ShipmentInsertionCalculator insertionCalculator;
|
||||
|
||||
Vehicle vehicle;
|
||||
Vehicle vehicle;
|
||||
|
||||
@Before
|
||||
public void doBefore(){
|
||||
routingCosts = CostFactory.createManhattanCosts();
|
||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").addCapacityDimension(0, 2).setCostPerDistance(1).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("0,0")).setType(type).build();
|
||||
activityInsertionCostsCalculator = new LocalActivityInsertionCostsCalculator(routingCosts, activityCosts, mock(StateManager.class));
|
||||
createInsertionCalculator(hardRouteLevelConstraint);
|
||||
@Before
|
||||
public void doBefore() {
|
||||
routingCosts = CostFactory.createManhattanCosts();
|
||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").addCapacityDimension(0, 2).setCostPerDistance(1).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("0,0")).setType(type).build();
|
||||
activityInsertionCostsCalculator = new LocalActivityInsertionCostsCalculator(routingCosts, activityCosts, mock(StateManager.class));
|
||||
createInsertionCalculator(hardRouteLevelConstraint);
|
||||
vehicleRoutingProblem = mock(VehicleRoutingProblem.class);
|
||||
}
|
||||
}
|
||||
|
||||
private void createInsertionCalculator(HardRouteConstraint hardRouteLevelConstraint) {
|
||||
ConstraintManager constraintManager = new ConstraintManager(mock(VehicleRoutingProblem.class), mock(RouteAndActivityStateGetter.class));
|
||||
constraintManager.addConstraint(hardRouteLevelConstraint);
|
||||
insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager);
|
||||
}
|
||||
private void createInsertionCalculator(HardRouteConstraint hardRouteLevelConstraint) {
|
||||
ConstraintManager constraintManager = new ConstraintManager(mock(VehicleRoutingProblem.class), mock(RouteAndActivityStateGetter.class));
|
||||
constraintManager.addConstraint(hardRouteLevelConstraint);
|
||||
insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenCalculatingInsertionCostsOfShipment_itShouldReturnCorrectCostValue(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
@Test
|
||||
public void whenCalculatingInsertionCostsOfShipment_itShouldReturnCorrectCostValue() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
JobActivityFactory activityFactory = mock(JobActivityFactory.class);
|
||||
List<AbstractActivity> activities = new ArrayList<AbstractActivity>();
|
||||
activities.add(new PickupShipment(shipment));
|
||||
activities.add(new DeliverShipment(shipment));
|
||||
when(activityFactory.createActivities(shipment)).thenReturn(activities);
|
||||
insertionCalculator.setJobActivityFactory(activityFactory);
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(40.0,iData.getInsertionCost(),0.05);
|
||||
}
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(40.0, iData.getInsertionCost(), 0.05);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenCalculatingInsertionIntoExistingRoute_itShouldReturnCorrectCosts(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
when(vehicleRoutingProblem.copyAndGetActivities(shipment)).thenReturn(getTourActivities(shipment));
|
||||
new Inserter(new InsertionListeners(), vehicleRoutingProblem).insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route);
|
||||
@Test
|
||||
public void whenCalculatingInsertionIntoExistingRoute_itShouldReturnCorrectCosts() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
when(vehicleRoutingProblem.copyAndGetActivities(shipment)).thenReturn(getTourActivities(shipment));
|
||||
new Inserter(new InsertionListeners(), vehicleRoutingProblem).insertJob(shipment, new InsertionData(0, 0, 0, vehicle, null), route);
|
||||
|
||||
JobActivityFactory activityFactory = mock(JobActivityFactory.class);
|
||||
List<AbstractActivity> activities = new ArrayList<AbstractActivity>();
|
||||
|
|
@ -134,11 +134,11 @@ public class ShipmentInsertionCalculatorTest {
|
|||
when(activityFactory.createActivities(shipment2)).thenReturn(activities);
|
||||
insertionCalculator.setJobActivityFactory(activityFactory);
|
||||
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(0.0,iData.getInsertionCost(),0.05);
|
||||
assertEquals(1,iData.getPickupInsertionIndex());
|
||||
assertEquals(2,iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.05);
|
||||
assertEquals(1, iData.getPickupInsertionIndex());
|
||||
assertEquals(2, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
private List<AbstractActivity> getTourActivities(Shipment shipment) {
|
||||
List<AbstractActivity> acts = new ArrayList<AbstractActivity>();
|
||||
|
|
@ -150,20 +150,20 @@ public class ShipmentInsertionCalculatorTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingShipmentInRouteWithNotEnoughCapacity_itShouldReturnNoInsertion(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
public void whenInsertingShipmentInRouteWithNotEnoughCapacity_itShouldReturnNoInsertion() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
when(vehicleRoutingProblem.copyAndGetActivities(shipment)).thenReturn(getTourActivities(shipment));
|
||||
new Inserter(new InsertionListeners(), vehicleRoutingProblem).insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route);
|
||||
createInsertionCalculator(new HardRouteConstraint() {
|
||||
new Inserter(new InsertionListeners(), vehicleRoutingProblem).insertJob(shipment, new InsertionData(0, 0, 0, vehicle, null), route);
|
||||
createInsertionCalculator(new HardRouteConstraint() {
|
||||
|
||||
@Override
|
||||
public boolean fulfilled(JobInsertionContext insertionContext) {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public boolean fulfilled(JobInsertionContext insertionContext) {
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
JobActivityFactory activityFactory = mock(JobActivityFactory.class);
|
||||
List<AbstractActivity> activities = new ArrayList<AbstractActivity>();
|
||||
|
|
@ -173,23 +173,23 @@ public class ShipmentInsertionCalculatorTest {
|
|||
insertionCalculator.setJobActivityFactory(activityFactory);
|
||||
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment2, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(InsertionData.createEmptyInsertionData(),iData);
|
||||
assertEquals(InsertionData.createEmptyInsertionData(), iData);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void whenInsertingThirdShipment_itShouldCalcCorrectVal(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment3 = Shipment.Builder.newInstance("s3").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,0").build()).setDeliveryLocation(Location.newInstance("9,10")).build();
|
||||
@Test
|
||||
public void whenInsertingThirdShipment_itShouldCalcCorrectVal() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment3 = Shipment.Builder.newInstance("s3").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,0").build()).setDeliveryLocation(Location.newInstance("9,10")).build();
|
||||
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
when(vehicleRoutingProblem.copyAndGetActivities(shipment)).thenReturn(getTourActivities(shipment));
|
||||
when(vehicleRoutingProblem.copyAndGetActivities(shipment2)).thenReturn(getTourActivities(shipment2));
|
||||
Inserter inserter = new Inserter(new InsertionListeners(),vehicleRoutingProblem );
|
||||
inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null),route);
|
||||
Inserter inserter = new Inserter(new InsertionListeners(), vehicleRoutingProblem);
|
||||
inserter.insertJob(shipment, new InsertionData(0, 0, 0, vehicle, null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0, 1, 2, vehicle, null), route);
|
||||
|
||||
JobActivityFactory activityFactory = mock(JobActivityFactory.class);
|
||||
List<AbstractActivity> activities = new ArrayList<AbstractActivity>();
|
||||
|
|
@ -198,23 +198,23 @@ public class ShipmentInsertionCalculatorTest {
|
|||
when(activityFactory.createActivities(shipment3)).thenReturn(activities);
|
||||
insertionCalculator.setJobActivityFactory(activityFactory);
|
||||
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(0.0,iData.getInsertionCost(),0.05);
|
||||
assertEquals(0,iData.getPickupInsertionIndex());
|
||||
assertEquals(1,iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.05);
|
||||
assertEquals(0, iData.getPickupInsertionIndex());
|
||||
assertEquals(1, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingThirdShipment_itShouldCalcCorrectVal2(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment3 = Shipment.Builder.newInstance("s3").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,0").build()).setDeliveryLocation(Location.newInstance("9,9")).build();
|
||||
@Test
|
||||
public void whenInsertingThirdShipment_itShouldCalcCorrectVal2() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment3 = Shipment.Builder.newInstance("s3").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,0").build()).setDeliveryLocation(Location.newInstance("9,9")).build();
|
||||
when(vehicleRoutingProblem.copyAndGetActivities(shipment)).thenReturn(getTourActivities(shipment));
|
||||
when(vehicleRoutingProblem.copyAndGetActivities(shipment2)).thenReturn(getTourActivities(shipment2));
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
Inserter inserter = new Inserter(new InsertionListeners(), vehicleRoutingProblem);
|
||||
inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null),route);
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
Inserter inserter = new Inserter(new InsertionListeners(), vehicleRoutingProblem);
|
||||
inserter.insertJob(shipment, new InsertionData(0, 0, 0, vehicle, null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0, 1, 2, vehicle, null), route);
|
||||
|
||||
JobActivityFactory activityFactory = mock(JobActivityFactory.class);
|
||||
List<AbstractActivity> activities = new ArrayList<AbstractActivity>();
|
||||
|
|
@ -225,78 +225,78 @@ public class ShipmentInsertionCalculatorTest {
|
|||
|
||||
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, null, Double.MAX_VALUE);
|
||||
assertEquals(2.0,iData.getInsertionCost(),0.05);
|
||||
assertEquals(0,iData.getPickupInsertionIndex());
|
||||
assertEquals(1,iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
assertEquals(2.0, iData.getInsertionCost(), 0.05);
|
||||
assertEquals(0, iData.getPickupInsertionIndex());
|
||||
assertEquals(1, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInstertingShipmentWithLoadConstraintWhereCapIsNotSufficient_capConstraintsAreFulfilled(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment3 = Shipment.Builder.newInstance("s3").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,0").build()).setDeliveryLocation(Location.newInstance("9,9")).build();
|
||||
@Test
|
||||
public void whenInstertingShipmentWithLoadConstraintWhereCapIsNotSufficient_capConstraintsAreFulfilled() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("10,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment3 = Shipment.Builder.newInstance("s3").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,0").build()).setDeliveryLocation(Location.newInstance("9,9")).build();
|
||||
|
||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(shipment).addJob(shipment2).addJob(shipment3).build();
|
||||
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
route.setVehicleAndDepartureTime(vehicle, 0.0);
|
||||
route.setVehicleAndDepartureTime(vehicle, 0.0);
|
||||
|
||||
Inserter inserter = new Inserter(new InsertionListeners(), vrp);
|
||||
inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route);
|
||||
Inserter inserter = new Inserter(new InsertionListeners(), vrp);
|
||||
inserter.insertJob(shipment, new InsertionData(0, 0, 0, vehicle, null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0, 1, 2, vehicle, null), route);
|
||||
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
stateManager.updateLoadStates();
|
||||
stateManager.informInsertionStarts(Arrays.asList(route), null);
|
||||
stateManager.updateLoadStates();
|
||||
stateManager.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager);
|
||||
constraintManager.addConstraint(new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager),Priority.CRITICAL);
|
||||
constraintManager.addConstraint(new ShipmentPickupsFirstConstraint(),Priority.CRITICAL);
|
||||
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
||||
constraintManager.addConstraint(new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager), Priority.CRITICAL);
|
||||
constraintManager.addConstraint(new ShipmentPickupsFirstConstraint(), Priority.CRITICAL);
|
||||
|
||||
ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator,
|
||||
constraintManager);
|
||||
ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator,
|
||||
constraintManager);
|
||||
insertionCalculator.setJobActivityFactory(vrp.getJobActivityFactory());
|
||||
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, DriverImpl.noDriver(), Double.MAX_VALUE);
|
||||
assertTrue(iData instanceof InsertionData.NoInsertionFound);
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, DriverImpl.noDriver(), Double.MAX_VALUE);
|
||||
assertTrue(iData instanceof InsertionData.NoInsertionFound);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingServiceWhileNoCapIsAvailable_itMustReturnNoInsertionData(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
@Test
|
||||
public void whenInsertingServiceWhileNoCapIsAvailable_itMustReturnNoInsertionData() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("0,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2").addSizeDimension(0, 1).setPickupLocation(Location.Builder.newInstance().setId("10,10").build()).setDeliveryLocation(Location.newInstance("0,0")).build();
|
||||
|
||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(shipment).addJob(shipment2).build();
|
||||
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
route.setVehicleAndDepartureTime(vehicle, 0.0);
|
||||
route.setVehicleAndDepartureTime(vehicle, 0.0);
|
||||
|
||||
Inserter inserter = new Inserter(new InsertionListeners(), vrp);
|
||||
Inserter inserter = new Inserter(new InsertionListeners(), vrp);
|
||||
|
||||
inserter.insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0,1,2,vehicle,null), route);
|
||||
inserter.insertJob(shipment, new InsertionData(0, 0, 0, vehicle, null), route);
|
||||
inserter.insertJob(shipment2, new InsertionData(0, 1, 2, vehicle, null), route);
|
||||
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
stateManager.updateLoadStates();
|
||||
stateManager.informInsertionStarts(Arrays.asList(route), null);
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
stateManager.updateLoadStates();
|
||||
stateManager.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager);
|
||||
constraintManager.addLoadConstraint();
|
||||
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
||||
constraintManager.addLoadConstraint();
|
||||
|
||||
stateManager.informInsertionStarts(Arrays.asList(route), null);
|
||||
stateManager.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
JobCalculatorSwitcher switcher = new JobCalculatorSwitcher();
|
||||
ServiceInsertionCalculator serviceInsertionCalc = new ServiceInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager);
|
||||
ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager);
|
||||
switcher.put(Pickup.class, serviceInsertionCalc);
|
||||
switcher.put(Service.class, serviceInsertionCalc);
|
||||
switcher.put(Shipment.class, insertionCalculator);
|
||||
JobCalculatorSwitcher switcher = new JobCalculatorSwitcher();
|
||||
ServiceInsertionCalculator serviceInsertionCalc = new ServiceInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager);
|
||||
ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, constraintManager);
|
||||
switcher.put(Pickup.class, serviceInsertionCalc);
|
||||
switcher.put(Service.class, serviceInsertionCalc);
|
||||
switcher.put(Shipment.class, insertionCalculator);
|
||||
|
||||
// Service service = Service.Builder.newInstance("pick", 1).setLocationId("5,5").build();
|
||||
Pickup service = (Pickup)Pickup.Builder.newInstance("pick").addSizeDimension(0, 1).setLocation(Location.newInstance("5,5")).build();
|
||||
Pickup service = (Pickup) Pickup.Builder.newInstance("pick").addSizeDimension(0, 1).setLocation(Location.newInstance("5,5")).build();
|
||||
|
||||
JobActivityFactory activityFactory = mock(JobActivityFactory.class);
|
||||
List<AbstractActivity> activities = new ArrayList<AbstractActivity>();
|
||||
|
|
@ -308,8 +308,8 @@ public class ShipmentInsertionCalculatorTest {
|
|||
InsertionData iData = switcher.getInsertionData(route, service, vehicle, 0, DriverImpl.noDriver(), Double.MAX_VALUE);
|
||||
// routeActVisitor.visit(route);
|
||||
|
||||
assertEquals(3, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
assertEquals(3, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,209 +50,207 @@ import static org.junit.Assert.assertEquals;
|
|||
import static org.mockito.Mockito.mock;
|
||||
|
||||
|
||||
|
||||
|
||||
public class TestCalculatesServiceInsertion {
|
||||
|
||||
ServiceInsertionCalculator serviceInsertion;
|
||||
ServiceInsertionCalculator serviceInsertion;
|
||||
|
||||
VehicleRoutingTransportCosts costs;
|
||||
VehicleRoutingTransportCosts costs;
|
||||
|
||||
VehicleImpl vehicle;
|
||||
VehicleImpl vehicle;
|
||||
|
||||
VehicleImpl newVehicle;
|
||||
VehicleImpl newVehicle;
|
||||
|
||||
private Service first;
|
||||
private Service first;
|
||||
|
||||
private Service third;
|
||||
private Service third;
|
||||
|
||||
private Service second;
|
||||
private Service second;
|
||||
|
||||
private StateManager states;
|
||||
private StateManager states;
|
||||
|
||||
private NoDriver driver;
|
||||
private NoDriver driver;
|
||||
|
||||
private VehicleRoutingProblem vrp;
|
||||
|
||||
@Before
|
||||
public void setup(){
|
||||
@Before
|
||||
public void setup() {
|
||||
|
||||
VehicleType t1 = VehicleTypeImpl.Builder.newInstance("t1").addCapacityDimension(0, 1000).setCostPerDistance(1.0).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("vehicle").setLatestArrival(100.0).setStartLocation(Location.newInstance("0,0")).setType(t1).build();
|
||||
VehicleType t1 = VehicleTypeImpl.Builder.newInstance("t1").addCapacityDimension(0, 1000).setCostPerDistance(1.0).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("vehicle").setLatestArrival(100.0).setStartLocation(Location.newInstance("0,0")).setType(t1).build();
|
||||
|
||||
VehicleType t2 = VehicleTypeImpl.Builder.newInstance("t2").addCapacityDimension(0, 1000).setCostPerDistance(2.0).build();
|
||||
newVehicle = VehicleImpl.Builder.newInstance("newVehicle").setLatestArrival(100.0).setStartLocation(Location.newInstance("0,0")).setType(t2).build();
|
||||
VehicleType t2 = VehicleTypeImpl.Builder.newInstance("t2").addCapacityDimension(0, 1000).setCostPerDistance(2.0).build();
|
||||
newVehicle = VehicleImpl.Builder.newInstance("newVehicle").setLatestArrival(100.0).setStartLocation(Location.newInstance("0,0")).setType(t2).build();
|
||||
|
||||
driver = DriverImpl.noDriver();
|
||||
driver = DriverImpl.noDriver();
|
||||
|
||||
final Locations locations = new Locations(){
|
||||
final Locations locations = new Locations() {
|
||||
|
||||
@Override
|
||||
public Coordinate getCoord(String id) {
|
||||
//assume: locationId="x,y"
|
||||
String[] splitted = id.split(",");
|
||||
return Coordinate.newInstance(Double.parseDouble(splitted[0]),
|
||||
Double.parseDouble(splitted[1]));
|
||||
}
|
||||
@Override
|
||||
public Coordinate getCoord(String id) {
|
||||
//assume: locationId="x,y"
|
||||
String[] splitted = id.split(",");
|
||||
return Coordinate.newInstance(Double.parseDouble(splitted[0]),
|
||||
Double.parseDouble(splitted[1]));
|
||||
}
|
||||
|
||||
};
|
||||
costs = new AbstractForwardVehicleRoutingTransportCosts() {
|
||||
};
|
||||
costs = new AbstractForwardVehicleRoutingTransportCosts() {
|
||||
|
||||
@Override
|
||||
public double getTransportTime(Location from, Location to,double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return ManhattanDistanceCalculator.calculateDistance(locations.getCoord(from.getId()), locations.getCoord(to.getId()));
|
||||
}
|
||||
@Override
|
||||
public double getTransportTime(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return ManhattanDistanceCalculator.calculateDistance(locations.getCoord(from.getId()), locations.getCoord(to.getId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getTransportCost(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return vehicle.getType().getVehicleCostParams().perDistanceUnit*ManhattanDistanceCalculator.calculateDistance(locations.getCoord(from.getId()), locations.getCoord(to.getId()));
|
||||
}
|
||||
};
|
||||
@Override
|
||||
public double getTransportCost(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return vehicle.getType().getVehicleCostParams().perDistanceUnit * ManhattanDistanceCalculator.calculateDistance(locations.getCoord(from.getId()), locations.getCoord(to.getId()));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
first = Service.Builder.newInstance("1").addSizeDimension(0, 0).setLocation(Location.newInstance("0,10")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
second = Service.Builder.newInstance("2").addSizeDimension(0, 0).setLocation(Location.newInstance("10,10")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
third = Service.Builder.newInstance("3").addSizeDimension(0, 0).setLocation(Location.newInstance("10,0")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
first = Service.Builder.newInstance("1").addSizeDimension(0, 0).setLocation(Location.newInstance("0,10")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
second = Service.Builder.newInstance("2").addSizeDimension(0, 0).setLocation(Location.newInstance("10,10")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
third = Service.Builder.newInstance("3").addSizeDimension(0, 0).setLocation(Location.newInstance("10,0")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
|
||||
Collection<Job> jobs = new ArrayList<Job>();
|
||||
jobs.add(first);
|
||||
jobs.add(third);
|
||||
jobs.add(second);
|
||||
Collection<Job> jobs = new ArrayList<Job>();
|
||||
jobs.add(first);
|
||||
jobs.add(third);
|
||||
jobs.add(second);
|
||||
|
||||
vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs)
|
||||
.addVehicle(vehicle).setRoutingCost(costs).build();
|
||||
vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs)
|
||||
.addVehicle(vehicle).setRoutingCost(costs).build();
|
||||
|
||||
states = new StateManager(vrp);
|
||||
states.updateLoadStates();
|
||||
states.updateTimeWindowStates();
|
||||
states = new StateManager(vrp);
|
||||
states.updateLoadStates();
|
||||
states.updateTimeWindowStates();
|
||||
|
||||
ConstraintManager cManager = new ConstraintManager(vrp,states);
|
||||
cManager.addLoadConstraint();
|
||||
cManager.addTimeWindowConstraint();
|
||||
ConstraintManager cManager = new ConstraintManager(vrp, states);
|
||||
cManager.addLoadConstraint();
|
||||
cManager.addTimeWindowConstraint();
|
||||
|
||||
VehicleRoutingActivityCosts actCosts = mock(VehicleRoutingActivityCosts.class);
|
||||
VehicleRoutingActivityCosts actCosts = mock(VehicleRoutingActivityCosts.class);
|
||||
|
||||
serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, actCosts), cManager);
|
||||
serviceInsertion.setJobActivityFactory(new JobActivityFactory() {
|
||||
serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, actCosts, states), cManager);
|
||||
serviceInsertion.setJobActivityFactory(new JobActivityFactory() {
|
||||
@Override
|
||||
public List<AbstractActivity> createActivities(Job job) {
|
||||
return vrp.copyAndGetActivities(job);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingTheFirstJobInAnEmptyTourWithVehicle_itCalculatesMarginalCostChanges(){
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
@Test
|
||||
public void whenInsertingTheFirstJobInAnEmptyTourWithVehicle_itCalculatesMarginalCostChanges() {
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(0, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(0, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingTheSecondJobInAnNonEmptyTourWithVehicle_itCalculatesMarginalCostChanges(){
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
@Test
|
||||
public void whenInsertingTheSecondJobInAnNonEmptyTourWithVehicle_itCalculatesMarginalCostChanges() {
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(0, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(0, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingThirdJobWithVehicle_itCalculatesMarginalCostChanges(){
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(third).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
@Test
|
||||
public void whenInsertingThirdJobWithVehicle_itCalculatesMarginalCostChanges() {
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(third).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(1, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(1, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingThirdJobWithNewVehicle_itCalculatesMarginalCostChanges(){
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(third).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
@Test
|
||||
public void whenInsertingThirdJobWithNewVehicle_itCalculatesMarginalCostChanges() {
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(third).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, second, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(1, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, second, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(1, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingASecondJobWithAVehicle_itCalculatesLocalMarginalCostChanges(){
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(second).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
@Test
|
||||
public void whenInsertingASecondJobWithAVehicle_itCalculatesLocalMarginalCostChanges() {
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(second).build();
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(2, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(2, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingASecondJobWithANewVehicle_itCalculatesLocalMarginalCostChanges(){
|
||||
@Test
|
||||
public void whenInsertingASecondJobWithANewVehicle_itCalculatesLocalMarginalCostChanges() {
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(second).build();
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(vehicle, driver).setJobActivityFactory(vrp.getJobActivityFactory()).addService(first).addService(second).build();
|
||||
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
states.informInsertionStarts(Arrays.asList(route), null);
|
||||
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, third, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(50.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(2, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
InsertionData iData = serviceInsertion.getInsertionData(route, third, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(50.0, iData.getInsertionCost(), 0.2);
|
||||
assertEquals(2, iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingJobAndCurrRouteIsEmpty_accessEggressCalcShouldReturnZero(){
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(VehicleImpl.createNoVehicle(), DriverImpl.noDriver()).build();
|
||||
AdditionalAccessEgressCalculator accessEgressCalc = new AdditionalAccessEgressCalculator(costs);
|
||||
Job job = Service.Builder.newInstance("1").addSizeDimension(0, 0).setLocation(Location.newInstance("1")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
JobInsertionContext iContex = new JobInsertionContext(route, job, newVehicle, mock(Driver.class), 0.0);
|
||||
assertEquals(0.0, accessEgressCalc.getCosts(iContex),0.01);
|
||||
}
|
||||
@Test
|
||||
public void whenInsertingJobAndCurrRouteIsEmpty_accessEggressCalcShouldReturnZero() {
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(VehicleImpl.createNoVehicle(), DriverImpl.noDriver()).build();
|
||||
AdditionalAccessEgressCalculator accessEgressCalc = new AdditionalAccessEgressCalculator(costs);
|
||||
Job job = Service.Builder.newInstance("1").addSizeDimension(0, 0).setLocation(Location.newInstance("1")).setTimeWindow(TimeWindow.newInstance(0.0, 100.0)).build();
|
||||
JobInsertionContext iContex = new JobInsertionContext(route, job, newVehicle, mock(Driver.class), 0.0);
|
||||
assertEquals(0.0, accessEgressCalc.getCosts(iContex), 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingJobAndCurrRouteAndVehicleHaveTheSameLocation_accessEggressCalcShouldReturnZero(){
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(newVehicle, DriverImpl.noDriver())
|
||||
.addService(first)
|
||||
.build();
|
||||
@Test
|
||||
public void whenInsertingJobAndCurrRouteAndVehicleHaveTheSameLocation_accessEggressCalcShouldReturnZero() {
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(newVehicle, DriverImpl.noDriver())
|
||||
.addService(first)
|
||||
.build();
|
||||
|
||||
AdditionalAccessEgressCalculator accessEgressCalc = new AdditionalAccessEgressCalculator(costs);
|
||||
JobInsertionContext iContex = new JobInsertionContext(route, first, newVehicle, mock(Driver.class), 0.0);
|
||||
assertEquals(0.0, accessEgressCalc.getCosts(iContex),0.01);
|
||||
}
|
||||
AdditionalAccessEgressCalculator accessEgressCalc = new AdditionalAccessEgressCalculator(costs);
|
||||
JobInsertionContext iContex = new JobInsertionContext(route, first, newVehicle, mock(Driver.class), 0.0);
|
||||
assertEquals(0.0, accessEgressCalc.getCosts(iContex), 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingJobAndCurrRouteAndNewVehicleHaveDifferentLocations_accessEggressCostsMustBeCorrect(){
|
||||
final Map<String,Coordinate> coords = new HashMap<String, Coordinate>();
|
||||
coords.put("oldV", Coordinate.newInstance(1, 0));
|
||||
coords.put("newV", Coordinate.newInstance(5, 0));
|
||||
coords.put("service", Coordinate.newInstance(0, 0));
|
||||
@Test
|
||||
public void whenInsertingJobAndCurrRouteAndNewVehicleHaveDifferentLocations_accessEggressCostsMustBeCorrect() {
|
||||
final Map<String, Coordinate> coords = new HashMap<String, Coordinate>();
|
||||
coords.put("oldV", Coordinate.newInstance(1, 0));
|
||||
coords.put("newV", Coordinate.newInstance(5, 0));
|
||||
coords.put("service", Coordinate.newInstance(0, 0));
|
||||
|
||||
AbstractForwardVehicleRoutingTransportCosts routingCosts = new AbstractForwardVehicleRoutingTransportCosts() {
|
||||
AbstractForwardVehicleRoutingTransportCosts routingCosts = new AbstractForwardVehicleRoutingTransportCosts() {
|
||||
|
||||
@Override
|
||||
public double getTransportTime(Location from, Location to,double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return getTransportCost(from, to, departureTime, driver, vehicle);
|
||||
}
|
||||
@Override
|
||||
public double getTransportTime(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return getTransportCost(from, to, departureTime, driver, vehicle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getTransportCost(Location from, Location to,double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return EuclideanDistanceCalculator.calculateDistance(coords.get(from.getId()), coords.get(to.getId()));
|
||||
}
|
||||
};
|
||||
Vehicle oldVehicle = VehicleImpl.Builder.newInstance("oldV").setStartLocation(Location.newInstance("oldV")).build();
|
||||
@Override
|
||||
public double getTransportCost(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return EuclideanDistanceCalculator.calculateDistance(coords.get(from.getId()), coords.get(to.getId()));
|
||||
}
|
||||
};
|
||||
Vehicle oldVehicle = VehicleImpl.Builder.newInstance("oldV").setStartLocation(Location.newInstance("oldV")).build();
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(oldVehicle, DriverImpl.noDriver())
|
||||
.addService(Service.Builder.newInstance("service").addSizeDimension(0, 0).setLocation(Location.newInstance("service")).build())
|
||||
.build();
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(oldVehicle, DriverImpl.noDriver())
|
||||
.addService(Service.Builder.newInstance("service").addSizeDimension(0, 0).setLocation(Location.newInstance("service")).build())
|
||||
.build();
|
||||
|
||||
Vehicle newVehicle = VehicleImpl.Builder.newInstance("newV").setStartLocation(Location.newInstance("newV")).build();
|
||||
Vehicle newVehicle = VehicleImpl.Builder.newInstance("newV").setStartLocation(Location.newInstance("newV")).build();
|
||||
|
||||
AdditionalAccessEgressCalculator accessEgressCalc = new AdditionalAccessEgressCalculator(routingCosts);
|
||||
Job job = Service.Builder.newInstance("service2").addSizeDimension(0, 0).setLocation(Location.newInstance("service")).build();
|
||||
JobInsertionContext iContex = new JobInsertionContext(route, job, newVehicle, mock(Driver.class), 0.0);
|
||||
assertEquals(8.0, accessEgressCalc.getCosts(iContex),0.01);
|
||||
}
|
||||
AdditionalAccessEgressCalculator accessEgressCalc = new AdditionalAccessEgressCalculator(routingCosts);
|
||||
Job job = Service.Builder.newInstance("service2").addSizeDimension(0, 0).setLocation(Location.newInstance("service")).build();
|
||||
JobInsertionContext iContex = new JobInsertionContext(route, job, newVehicle, mock(Driver.class), 0.0);
|
||||
assertEquals(8.0, accessEgressCalc.getCosts(iContex), 0.01);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,364 +49,364 @@ import static org.mockito.Mockito.when;
|
|||
|
||||
public class TestLocalActivityInsertionCostsCalculator {
|
||||
|
||||
VehicleRoutingTransportCosts tpCosts;
|
||||
VehicleRoutingTransportCosts tpCosts;
|
||||
|
||||
VehicleRoutingActivityCosts actCosts;
|
||||
VehicleRoutingActivityCosts actCosts;
|
||||
|
||||
LocalActivityInsertionCostsCalculator calc;
|
||||
LocalActivityInsertionCostsCalculator calc;
|
||||
|
||||
Vehicle vehicle;
|
||||
Vehicle vehicle;
|
||||
|
||||
VehicleRoute route;
|
||||
VehicleRoute route;
|
||||
|
||||
JobInsertionContext jic;
|
||||
JobInsertionContext jic;
|
||||
|
||||
@Before
|
||||
public void doBefore(){
|
||||
@Before
|
||||
public void doBefore() {
|
||||
|
||||
vehicle = mock(Vehicle.class);
|
||||
route = mock(VehicleRoute.class);
|
||||
when(route.isEmpty()).thenReturn(false);
|
||||
when(route.getVehicle()).thenReturn(vehicle);
|
||||
vehicle = mock(Vehicle.class);
|
||||
route = mock(VehicleRoute.class);
|
||||
when(route.isEmpty()).thenReturn(false);
|
||||
when(route.getVehicle()).thenReturn(vehicle);
|
||||
|
||||
jic = mock(JobInsertionContext.class);
|
||||
when(jic.getRoute()).thenReturn(route);
|
||||
when(jic.getNewVehicle()).thenReturn(vehicle);
|
||||
when(vehicle.getType()).thenReturn(VehicleTypeImpl.Builder.newInstance("type").build());
|
||||
jic = mock(JobInsertionContext.class);
|
||||
when(jic.getRoute()).thenReturn(route);
|
||||
when(jic.getNewVehicle()).thenReturn(vehicle);
|
||||
when(vehicle.getType()).thenReturn(VehicleTypeImpl.Builder.newInstance("type").build());
|
||||
|
||||
tpCosts = mock(VehicleRoutingTransportCosts.class);
|
||||
when(tpCosts.getTransportCost(loc("i"), loc("j"), 0.0, null, vehicle)).thenReturn(2.0);
|
||||
when(tpCosts.getTransportTime(loc("i"), loc("j"), 0.0, null, vehicle)).thenReturn(0.0);
|
||||
when(tpCosts.getTransportCost(loc("i"), loc("k"), 0.0, null, vehicle)).thenReturn(3.0);
|
||||
when(tpCosts.getTransportTime(loc("i"), loc("k"), 0.0, null, vehicle)).thenReturn(0.0);
|
||||
when(tpCosts.getTransportCost(loc("k"), loc("j"), 0.0, null, vehicle)).thenReturn(3.0);
|
||||
when(tpCosts.getTransportTime(loc("k"), loc("j"), 0.0, null, vehicle)).thenReturn(0.0);
|
||||
tpCosts = mock(VehicleRoutingTransportCosts.class);
|
||||
when(tpCosts.getTransportCost(loc("i"), loc("j"), 0.0, null, vehicle)).thenReturn(2.0);
|
||||
when(tpCosts.getTransportTime(loc("i"), loc("j"), 0.0, null, vehicle)).thenReturn(0.0);
|
||||
when(tpCosts.getTransportCost(loc("i"), loc("k"), 0.0, null, vehicle)).thenReturn(3.0);
|
||||
when(tpCosts.getTransportTime(loc("i"), loc("k"), 0.0, null, vehicle)).thenReturn(0.0);
|
||||
when(tpCosts.getTransportCost(loc("k"), loc("j"), 0.0, null, vehicle)).thenReturn(3.0);
|
||||
when(tpCosts.getTransportTime(loc("k"), loc("j"), 0.0, null, vehicle)).thenReturn(0.0);
|
||||
|
||||
actCosts = mock(VehicleRoutingActivityCosts.class);
|
||||
calc = new LocalActivityInsertionCostsCalculator(tpCosts, actCosts, mock(StateManager.class));
|
||||
}
|
||||
actCosts = mock(VehicleRoutingActivityCosts.class);
|
||||
calc = new LocalActivityInsertionCostsCalculator(tpCosts, actCosts, mock(StateManager.class));
|
||||
}
|
||||
|
||||
private Location loc(String i) {
|
||||
return Location.Builder.newInstance().setId(i).build();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingActBetweenTwoRouteActs_itCalcsMarginalTpCosts(){
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
TourActivity nextAct = mock(TourActivity.class);
|
||||
when(nextAct.getLocation()).thenReturn(loc("j"));
|
||||
when(nextAct.getIndex()).thenReturn(1);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
public void whenInsertingActBetweenTwoRouteActs_itCalcsMarginalTpCosts() {
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
TourActivity nextAct = mock(TourActivity.class);
|
||||
when(nextAct.getLocation()).thenReturn(loc("j"));
|
||||
when(nextAct.getIndex()).thenReturn(1);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
|
||||
when(vehicle.isReturnToDepot()).thenReturn(true);
|
||||
when(vehicle.isReturnToDepot()).thenReturn(true);
|
||||
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(4.0,costs,0.01);
|
||||
}
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(4.0, costs, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingActBetweenLastActAndEnd_itCalcsMarginalTpCosts(){
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
End nextAct = End.newInstance("j", 0.0, 0.0);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
@Test
|
||||
public void whenInsertingActBetweenLastActAndEnd_itCalcsMarginalTpCosts() {
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
End nextAct = End.newInstance("j", 0.0, 0.0);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
|
||||
when(vehicle.isReturnToDepot()).thenReturn(true);
|
||||
when(vehicle.isReturnToDepot()).thenReturn(true);
|
||||
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(4.0,costs,0.01);
|
||||
}
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(4.0, costs, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingActBetweenTwoRouteActsAndRouteIsOpen_itCalcsMarginalTpCosts(){
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
TourActivity nextAct = mock(TourActivity.class);
|
||||
when(nextAct.getLocation()).thenReturn(loc("j"));
|
||||
when(nextAct.getIndex()).thenReturn(1);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
@Test
|
||||
public void whenInsertingActBetweenTwoRouteActsAndRouteIsOpen_itCalcsMarginalTpCosts() {
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
TourActivity nextAct = mock(TourActivity.class);
|
||||
when(nextAct.getLocation()).thenReturn(loc("j"));
|
||||
when(nextAct.getIndex()).thenReturn(1);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
|
||||
when(vehicle.isReturnToDepot()).thenReturn(false);
|
||||
when(vehicle.isReturnToDepot()).thenReturn(false);
|
||||
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(4.0,costs,0.01);
|
||||
}
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(4.0, costs, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingActBetweenLastActAndEndAndRouteIsOpen_itCalculatesTpCostsFromPrevToNewAct(){
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
End nextAct = End.newInstance("j", 0.0, 0.0);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
@Test
|
||||
public void whenInsertingActBetweenLastActAndEndAndRouteIsOpen_itCalculatesTpCostsFromPrevToNewAct() {
|
||||
TourActivity prevAct = mock(TourActivity.class);
|
||||
when(prevAct.getLocation()).thenReturn(loc("i"));
|
||||
when(prevAct.getIndex()).thenReturn(1);
|
||||
End nextAct = End.newInstance("j", 0.0, 0.0);
|
||||
TourActivity newAct = mock(TourActivity.class);
|
||||
when(newAct.getLocation()).thenReturn(loc("k"));
|
||||
when(newAct.getIndex()).thenReturn(1);
|
||||
|
||||
when(vehicle.isReturnToDepot()).thenReturn(false);
|
||||
when(vehicle.isReturnToDepot()).thenReturn(false);
|
||||
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(3.0,costs,0.01);
|
||||
}
|
||||
double costs = calc.getCosts(jic, prevAct, nextAct, newAct, 0.0);
|
||||
assertEquals(3.0, costs, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10,0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(60, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0)).setTimeWindow(TimeWindow.newInstance(40,80)).build();
|
||||
@Test
|
||||
public void test() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(60, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 80)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(), new StateManager(mock(VehicleRoutingProblem.class)));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), new StateManager(mock(VehicleRoutingProblem.class)));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(50.,c,0.01);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(50., c, 0.01);
|
||||
|
||||
/*
|
||||
new: dist = 90 & wait = 0
|
||||
new: dist = 90 & wait = 0
|
||||
old: dist = 30 & wait = 10
|
||||
c = new - old = 90 - 40 = 50
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewBetweenStartAndAct_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewBetweenStartAndAct_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(10, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0))
|
||||
.setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(10, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0))
|
||||
.setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
|
||||
Start prevAct = new Start(Location.newInstance(0,0),0,100);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
Start prevAct = new Start(Location.newInstance(0, 0), 0, 100);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),new StateManager(vrp));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,0);
|
||||
assertEquals(-10.,c,0.01);
|
||||
}
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), new StateManager(vrp));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 0);
|
||||
assertEquals(-10., c, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewBetweenStartAndAct2_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewBetweenStartAndAct2_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(10, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0))
|
||||
.setTimeWindow(TimeWindow.newInstance(140,150)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(10, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0))
|
||||
.setTimeWindow(TimeWindow.newInstance(140, 150)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(newS).addJob(nextS).addVehicle(v2).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(newS).addJob(nextS).addVehicle(v2).build();
|
||||
|
||||
Start prevAct = new Start(Location.newInstance(0,0),0,100);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
Start prevAct = new Start(Location.newInstance(0, 0), 0, 100);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v2).setJobActivityFactory(vrp.getJobActivityFactory()).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v2,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(), new StateManager(vrp));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,0);
|
||||
assertEquals(-10.,c,0.01);
|
||||
}
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v2).setJobActivityFactory(vrp.getJobActivityFactory()).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v2, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), new StateManager(vrp));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 0);
|
||||
assertEquals(-10., c, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewInEmptyRoute_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
@Test
|
||||
public void whenAddingNewInEmptyRoute_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(10, 0)).setTimeWindow(TimeWindow.newInstance(100, 150)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(10, 0)).setTimeWindow(TimeWindow.newInstance(100, 150)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(newS).addVehicle(v).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(newS).addVehicle(v).build();
|
||||
|
||||
Start prevAct = new Start(Location.newInstance(0,0),0,100);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
End nextAct = new End(Location.newInstance(0,0),0,100);
|
||||
Start prevAct = new Start(Location.newInstance(0, 0), 0, 100);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
End nextAct = new End(Location.newInstance(0, 0), 0, 100);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),new StateManager(vrp) );
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,0);
|
||||
assertEquals(110.,c,0.01);
|
||||
}
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), new StateManager(vrp));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 0);
|
||||
assertEquals(110., c, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewBetweenTwoActs_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewBetweenTwoActs_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0)).setTimeWindow(TimeWindow.newInstance(40,50)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),new StateManager(vrp) );
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(-10.,c,0.01);
|
||||
}
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), new StateManager(vrp));
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(-10., c, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10,0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100, 120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0)).setTimeWindow(TimeWindow.newInstance(40,500)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100, 120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 500)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),new StateManager(vrp) );
|
||||
calc.setSolutionCompletenessRatio(0.5);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(35.,c,0.01);
|
||||
}
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), new StateManager(vrp));
|
||||
calc.setSolutionCompletenessRatio(0.5);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(35., c, 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs2_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs2_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
// VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setHasVariableDepartureTime(true).setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10,0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100,120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0)).setTimeWindow(TimeWindow.newInstance(40,500)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100, 120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 500)).build();
|
||||
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40,0)).setTimeWindow(TimeWindow.newInstance(400,500)).build();
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40, 0)).setTimeWindow(TimeWindow.newInstance(400, 500)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(afterNextS).addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(afterNextS).addJob(prevS).addJob(newS).addJob(nextS).addVehicle(v).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).build();
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).build();
|
||||
|
||||
StateManager stateManager = getStateManager(vrp,route);
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(-10.,c,0.01);
|
||||
//
|
||||
//old: dist: 0, waiting: 10 + 350 = 360
|
||||
//new: dist: 0, waiting: 80 + 270 = 350
|
||||
}
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(-10., c, 0.01);
|
||||
//
|
||||
//old: dist: 0, waiting: 10 + 350 = 360
|
||||
//new: dist: 0, waiting: 80 + 270 = 350
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs3_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs3_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
// VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setHasVariableDepartureTime(true).setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10,0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100, 120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 500)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100, 120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 500)).build();
|
||||
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40,0)).setTimeWindow(TimeWindow.newInstance(80, 500)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(40,0)).setTimeWindow(TimeWindow.newInstance(100, 500)).build();
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40, 0)).setTimeWindow(TimeWindow.newInstance(80, 500)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(40, 0)).setTimeWindow(TimeWindow.newInstance(100, 500)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(20.,c,0.01);
|
||||
//start-delay = new - old = 120 - 40 = 80 > future waiting time savings = 30 + 20 + 10
|
||||
//ref: 10 + 50 + 20 = 80
|
||||
//new: 80 - 10 - 30 - 20 = 20
|
||||
/*
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(20., c, 0.01);
|
||||
//start-delay = new - old = 120 - 40 = 80 > future waiting time savings = 30 + 20 + 10
|
||||
//ref: 10 + 50 + 20 = 80
|
||||
//new: 80 - 10 - 30 - 20 = 20
|
||||
/*
|
||||
w(new) + w(next) - w_old(next) - min{start_delay(next),future_waiting}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs4_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs4_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
// VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setHasVariableDepartureTime(true).setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10,0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100,120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0)).setTimeWindow(TimeWindow.newInstance(40,500)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100, 120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 500)).build();
|
||||
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40,0)).setTimeWindow(TimeWindow.newInstance(80,500)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(50,0)).setTimeWindow(TimeWindow.newInstance(100,500)).build();
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40, 0)).setTimeWindow(TimeWindow.newInstance(80, 500)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(50, 0)).setTimeWindow(TimeWindow.newInstance(100, 500)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(30.,c,0.01);
|
||||
//ref: 10 + 30 + 10 = 50
|
||||
//new: 50 - 50 = 0
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(30., c, 0.01);
|
||||
//ref: 10 + 30 + 10 = 50
|
||||
//new: 50 - 50 = 0
|
||||
|
||||
/*
|
||||
activity start time delay at next act = start-time-old - start-time-new is always bigger than subsequent waiting time savings
|
||||
|
|
@ -415,38 +415,38 @@ public class TestLocalActivityInsertionCostsCalculator {
|
|||
old = 10 + 30 + 10 = 50
|
||||
new = 80 + 0 - 10 - min{80,40} = 30
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs4WithVarStart_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs4WithVarStart_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
// VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setHasVariableDepartureTime(true).setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10,0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100,120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0)).setTimeWindow(TimeWindow.newInstance(40,500)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(100, 120)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 500)).build();
|
||||
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40,0)).setTimeWindow(TimeWindow.newInstance(80,500)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(50,0)).setTimeWindow(TimeWindow.newInstance(100,500)).build();
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40, 0)).setTimeWindow(TimeWindow.newInstance(80, 500)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(50, 0)).setTimeWindow(TimeWindow.newInstance(100, 500)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(30.,c,0.01);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(30., c, 0.01);
|
||||
/*
|
||||
activity start time delay at next act = start-time-old - start-time-new is always bigger than subsequent waiting time savings
|
||||
*/
|
||||
|
|
@ -456,38 +456,38 @@ public class TestLocalActivityInsertionCostsCalculator {
|
|||
new - old = 80 - 40 = 40
|
||||
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs3WithVarStart_itShouldCalcInsertionCostsCorrectly(){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
@Test
|
||||
public void whenAddingNewWithTWBetweenTwoActs3WithVarStart_itShouldCalcInsertionCostsCorrectly() {
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("t").setCostPerWaitingTime(1.).build();
|
||||
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
VehicleImpl v = VehicleImpl.Builder.newInstance("v").setType(type).setStartLocation(Location.newInstance(0, 0)).build();
|
||||
// VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setHasVariableDepartureTime(true).setType(type).setStartLocation(Location.newInstance(0,0)).build();
|
||||
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10,0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(50,70)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30,0)).setTimeWindow(TimeWindow.newInstance(40,70)).build();
|
||||
Service prevS = Service.Builder.newInstance("prev").setLocation(Location.newInstance(10, 0)).build();
|
||||
Service newS = Service.Builder.newInstance("new").setServiceTime(10).setTimeWindow(TimeWindow.newInstance(50, 70)).setLocation(Location.newInstance(20, 0)).build();
|
||||
Service nextS = Service.Builder.newInstance("next").setLocation(Location.newInstance(30, 0)).setTimeWindow(TimeWindow.newInstance(40, 70)).build();
|
||||
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40,0)).setTimeWindow(TimeWindow.newInstance(50,100)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(50,0)).setTimeWindow(TimeWindow.newInstance(100,500)).build();
|
||||
Service afterNextS = Service.Builder.newInstance("afterNext").setLocation(Location.newInstance(40, 0)).setTimeWindow(TimeWindow.newInstance(50, 100)).build();
|
||||
Service afterAfterNextS = Service.Builder.newInstance("afterAfterNext").setLocation(Location.newInstance(50, 0)).setTimeWindow(TimeWindow.newInstance(100, 500)).build();
|
||||
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(v).addJob(prevS).addJob(newS).addJob(nextS)
|
||||
.addJob(afterNextS).addJob(afterAfterNextS).build();
|
||||
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
TourActivity prevAct = vrp.getActivities(prevS).get(0);
|
||||
TourActivity newAct = vrp.getActivities(newS).get(0);
|
||||
TourActivity nextAct = vrp.getActivities(nextS).get(0);
|
||||
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route,newS,v,null,0.);
|
||||
VehicleRoute route = VehicleRoute.Builder.newInstance(v).setJobActivityFactory(vrp.getJobActivityFactory()).addService(prevS).addService(nextS).addService(afterNextS).addService(afterAfterNextS).build();
|
||||
JobInsertionContext context = new JobInsertionContext(route, newS, v, null, 0.);
|
||||
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
StateManager stateManager = getStateManager(vrp, route);
|
||||
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(),new WaitingTimeCosts(),stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context,prevAct,nextAct,newAct,10);
|
||||
assertEquals(-10.,c,0.01);
|
||||
LocalActivityInsertionCostsCalculator calc = new LocalActivityInsertionCostsCalculator(CostFactory.createEuclideanCosts(), new WaitingTimeCosts(), stateManager);
|
||||
calc.setSolutionCompletenessRatio(1.);
|
||||
double c = calc.getCosts(context, prevAct, nextAct, newAct, 10);
|
||||
assertEquals(-10., c, 0.01);
|
||||
/*
|
||||
activity start time delay at next act = start-time-old - start-time-new is always bigger than subsequent waiting time savings
|
||||
*/
|
||||
|
|
@ -495,19 +495,15 @@ public class TestLocalActivityInsertionCostsCalculator {
|
|||
old = 10 + 40 = 50
|
||||
new = 30 + 10 = 40
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private StateManager getStateManager(VehicleRoutingProblem vrp, VehicleRoute route) {
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts()));
|
||||
stateManager.addStateUpdater(new UpdateVehicleDependentPracticalTimeWindows(stateManager,vrp.getTransportCosts()));
|
||||
stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager,vrp.getTransportCosts()));
|
||||
stateManager.informInsertionStarts(Arrays.asList(route),new ArrayList<Job>());
|
||||
return stateManager;
|
||||
}
|
||||
private StateManager getStateManager(VehicleRoutingProblem vrp, VehicleRoute route) {
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts()));
|
||||
stateManager.addStateUpdater(new UpdateVehicleDependentPracticalTimeWindows(stateManager, vrp.getTransportCosts()));
|
||||
stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager, vrp.getTransportCosts()));
|
||||
stateManager.informInsertionStarts(Arrays.asList(route), new ArrayList<Job>());
|
||||
return stateManager;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ public class TestMixedServiceAndShipmentsProblemOnRouteLevel {
|
|||
Shipment shipment4 = Shipment.Builder.newInstance("4").addSizeDimension(0, 1).setPickupLocation(TestUtils.loc(Coordinate.newInstance(15, 13))).setDeliveryLocation(TestUtils.loc(Coordinate.newInstance(14, 11))).build();
|
||||
|
||||
/*
|
||||
* build deliveries, (implicitly picked up in the depot)
|
||||
* build deliveries, (implicitly picked up in the depot)
|
||||
* 1: (4,8)
|
||||
* 2: (4,12)
|
||||
* 3: (16,8)
|
||||
|
|
@ -103,7 +103,7 @@ public class TestMixedServiceAndShipmentsProblemOnRouteLevel {
|
|||
|
||||
@Test
|
||||
public void whenHavingOnlyServicesInOneProblem_andInsertionShouldBeMadeOnRouteLevel_itShouldAssertTrue() {
|
||||
/* get a vehicle type-builder and build a type with the typeId "vehicleType" and a capacity of 2
|
||||
/* get a vehicle type-builder and build a type with the typeId "vehicleType" and a capacity of 2
|
||||
*/
|
||||
VehicleTypeImpl.Builder vehicleTypeBuilder = VehicleTypeImpl.Builder.newInstance("vehicleType").addCapacityDimension(0, 2);
|
||||
VehicleType vehicleType = vehicleTypeBuilder.build();
|
||||
|
|
|
|||
|
|
@ -34,33 +34,25 @@ public class VehicleImplTest {
|
|||
Vehicle v = VehicleImpl.Builder.newInstance("v").build();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingSkills_theyShouldBeAddedCorrectly(){
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")).setType(type1).setEndLocation(Location.newInstance("start"))
|
||||
.addSkill("drill").addSkill("screwdriver").build();
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("screwdriver"));
|
||||
}
|
||||
@Test
|
||||
public void whenAddingSkills_theyShouldBeAddedCorrectly() {
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")).setType(type1).setEndLocation(Location.newInstance("start"))
|
||||
.addSkill("drill").addSkill("screwdriver").build();
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("screwdriver"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")).setType(type1).setEndLocation(Location.newInstance("start"))
|
||||
.addSkill("drill").addSkill("screwdriver").build();
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("dRill"));
|
||||
assertTrue(v.getSkills().containsSkill("ScrewDriver"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")).setType(type1).setEndLocation(Location.newInstance("start"))
|
||||
.addSkill("drill").build();
|
||||
assertFalse(v.getSkills().containsSkill("ScrewDriver"));
|
||||
}
|
||||
@Test
|
||||
public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly() {
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")).setType(type1).setEndLocation(Location.newInstance("start"))
|
||||
.addSkill("drill").addSkill("screwdriver").build();
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("dRill"));
|
||||
assertTrue(v.getSkills().containsSkill("ScrewDriver"));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
|
|
@ -221,26 +213,6 @@ public class VehicleImplTest {
|
|||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void whenAddingSkills_theyShouldBeAddedCorrectly() {
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")).setType(type1).setEndLocation(Location.newInstance("start"))
|
||||
.addSkill("drill").addSkill("screwdriver").build();
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("screwdriver"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly() {
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("start")).setType(type1).setEndLocation(Location.newInstance("start"))
|
||||
.addSkill("drill").addSkill("screwdriver").build();
|
||||
assertTrue(v.getSkills().containsSkill("drill"));
|
||||
assertTrue(v.getSkills().containsSkill("dRill"));
|
||||
assertTrue(v.getSkills().containsSkill("ScrewDriver"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly() {
|
||||
VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||
|
|
|
|||
|
|
@ -1,255 +1,256 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<problem xmlns="http://www.w3schools.com"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
||||
<problemType>
|
||||
<fleetSize>FINITE</fleetSize>
|
||||
</problemType>
|
||||
<vehicles>
|
||||
<vehicle>
|
||||
<id>v3</id>
|
||||
<typeId>vehType2</typeId>
|
||||
<startLocation>
|
||||
<id>startLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>endLoc</id>
|
||||
<coord x="1000.0" y="2000.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
||||
<problemType>
|
||||
<fleetSize>FINITE</fleetSize>
|
||||
</problemType>
|
||||
<vehicles>
|
||||
<vehicle>
|
||||
<id>v3</id>
|
||||
<typeId>vehType2</typeId>
|
||||
<startLocation>
|
||||
<id>startLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>endLoc</id>
|
||||
<coord x="1000.0" y="2000.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v2</id>
|
||||
<typeId>vehType2</typeId>
|
||||
<startLocation>
|
||||
<id>depotLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>depotLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>false</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v4</id>
|
||||
<typeId>vehType2</typeId>
|
||||
<startLocation>
|
||||
<id>startLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>endLoc</id>
|
||||
<coord x="1000.0" y="2000.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v5</id>
|
||||
<typeId>vehType3</typeId>
|
||||
<startLocation>
|
||||
<id>startLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>endLoc</id>
|
||||
<coord x="1000.0" y="2000.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v1</id>
|
||||
<typeId>vehType</typeId>
|
||||
<startLocation>
|
||||
<id>depotLoc2</id>
|
||||
<coord x="100.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>depotLoc2</id>
|
||||
<coord x="100.0" y="100.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
</vehicles>
|
||||
<vehicleTypes>
|
||||
<type>
|
||||
<id>vehType</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">20</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>0.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
<type>
|
||||
<id>vehType2</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">200</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>0.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
<type>
|
||||
<id>vehType3</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">100</dimension>
|
||||
<dimension index="1">1000</dimension>
|
||||
<dimension index="2">10000</dimension>
|
||||
<dimension index="3">0</dimension>
|
||||
<dimension index="4">0</dimension>
|
||||
<dimension index="5">0</dimension>
|
||||
<dimension index="6">0</dimension>
|
||||
<dimension index="7">0</dimension>
|
||||
<dimension index="8">0</dimension>
|
||||
<dimension index="9">0</dimension>
|
||||
<dimension index="10">100000</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>0.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
</vehicleTypes>
|
||||
<services>
|
||||
<service id="1" type="service">
|
||||
<location>
|
||||
<id>j(1,5)</id>
|
||||
<coord x="10.0" y="10.0"/>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>10.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v2</id>
|
||||
<typeId>vehType2</typeId>
|
||||
<startLocation>
|
||||
<id>depotLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>depotLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<end>4000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
<service id="2" type="service">
|
||||
<location>
|
||||
<id>i(3,9)</id>
|
||||
<coord x="10.0" y="10.0"/>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>0.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>false</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v4</id>
|
||||
<typeId>vehType2</typeId>
|
||||
<startLocation>
|
||||
<id>startLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>endLoc</id>
|
||||
<coord x="1000.0" y="2000.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v5</id>
|
||||
<typeId>vehType3</typeId>
|
||||
<startLocation>
|
||||
<id>startLoc</id>
|
||||
<coord x="10.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>endLoc</id>
|
||||
<coord x="1000.0" y="2000.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
<vehicle>
|
||||
<id>v1</id>
|
||||
<typeId>vehType</typeId>
|
||||
<startLocation>
|
||||
<id>depotLoc2</id>
|
||||
<coord x="100.0" y="100.0"/>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>depotLoc2</id>
|
||||
<coord x="100.0" y="100.0"/>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1000.0</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
</vehicles>
|
||||
<vehicleTypes>
|
||||
<type>
|
||||
<id>vehType</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">20</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>0.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
<type>
|
||||
<id>vehType2</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">200</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>0.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
<type>
|
||||
<id>vehType3</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">100</dimension>
|
||||
<dimension index="1">1000</dimension>
|
||||
<dimension index="2">10000</dimension>
|
||||
<dimension index="3">0</dimension>
|
||||
<dimension index="4">0</dimension>
|
||||
<dimension index="5">0</dimension>
|
||||
<dimension index="6">0</dimension>
|
||||
<dimension index="7">0</dimension>
|
||||
<dimension index="8">0</dimension>
|
||||
<dimension index="9">0</dimension>
|
||||
<dimension index="10">100000</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>0.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
</vehicleTypes>
|
||||
<services>
|
||||
<service id="1" type="service">
|
||||
<location>
|
||||
<id>j(1,5)</id>
|
||||
<coord x="10.0" y="10.0"/>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>10.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>4000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
<service id="2" type="service">
|
||||
<location>
|
||||
<end>4000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
</services>
|
||||
<shipments>
|
||||
<shipment id="3">
|
||||
<pickup>
|
||||
<location>
|
||||
<id>i(3,9)</id>
|
||||
<coord x="10.0" y="10.0"/>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>0.0</duration>
|
||||
<timeWindows>
|
||||
</location>
|
||||
<duration>10.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>4000.0</end>
|
||||
<start>1000.0</start>
|
||||
<end>4000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
</services>
|
||||
<shipments>
|
||||
<shipment id="3">
|
||||
<pickup>
|
||||
<location>
|
||||
<id>i(3,9)</id>
|
||||
<coord x="10.0" y="10.0"/>
|
||||
</location>
|
||||
<duration>10.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>1000.0</start>
|
||||
<end>4000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</pickup>
|
||||
<delivery>
|
||||
<location>
|
||||
<id>i(9,9)</id>
|
||||
<coord x="10.0" y="0.0"/>
|
||||
</location>
|
||||
<duration>100.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>6000.0</start>
|
||||
<end>10000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</delivery>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">10</dimension>
|
||||
</capacity-dimensions>
|
||||
</shipment>
|
||||
<shipment id="4">
|
||||
<pickup>
|
||||
<location>
|
||||
<id>[x=10.0][y=10.0]</id>
|
||||
<coord x="10.0" y="10.0"/>
|
||||
</location>
|
||||
<duration>0.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>1000.0</start>
|
||||
<end>4000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</pickup>
|
||||
<delivery>
|
||||
<location>
|
||||
<id>[x=10.0][y=0.0]</id>
|
||||
<coord x="10.0" y="0.0"/>
|
||||
</location>
|
||||
<duration>100.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>6000.0</start>
|
||||
<end>10000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</delivery>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">10</dimension>
|
||||
</capacity-dimensions>
|
||||
</shipment>
|
||||
</shipments>
|
||||
<initialRoutes>
|
||||
<route>
|
||||
<driverId>noDriver</driverId>
|
||||
<vehicleId>v1</vehicleId>
|
||||
<start>10.0</start>
|
||||
<act type="pickupShipment">
|
||||
<shipmentId>4</shipmentId>
|
||||
<arrTime>0.0</arrTime>
|
||||
<endTime>0.0</endTime>
|
||||
</act>
|
||||
<act type="deliverShipment">
|
||||
<shipmentId>4</shipmentId>
|
||||
<arrTime>0.0</arrTime>
|
||||
<endTime>0.0</endTime>
|
||||
</act>
|
||||
<end>0.0</end>
|
||||
</route>
|
||||
</initialRoutes>
|
||||
</timeWindows>
|
||||
</pickup>
|
||||
<delivery>
|
||||
<location>
|
||||
<id>i(9,9)</id>
|
||||
<coord x="10.0" y="0.0"/>
|
||||
</location>
|
||||
<duration>100.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>6000.0</start>
|
||||
<end>10000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</delivery>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">10</dimension>
|
||||
</capacity-dimensions>
|
||||
</shipment>
|
||||
<shipment id="4">
|
||||
<pickup>
|
||||
<location>
|
||||
<id>[x=10.0][y=10.0]</id>
|
||||
<coord x="10.0" y="10.0"/>
|
||||
</location>
|
||||
<duration>0.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>1000.0</start>
|
||||
<end>4000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</pickup>
|
||||
<delivery>
|
||||
<location>
|
||||
<id>[x=10.0][y=0.0]</id>
|
||||
<coord x="10.0" y="0.0"/>
|
||||
</location>
|
||||
<duration>100.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>6000.0</start>
|
||||
<end>10000.0</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</delivery>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">10</dimension>
|
||||
</capacity-dimensions>
|
||||
</shipment>
|
||||
</shipments>
|
||||
<initialRoutes>
|
||||
<route>
|
||||
<driverId>noDriver</driverId>
|
||||
<vehicleId>v1</vehicleId>
|
||||
<start>10.0</start>
|
||||
<act type="pickupShipment">
|
||||
<shipmentId>4</shipmentId>
|
||||
<arrTime>0.0</arrTime>
|
||||
<endTime>0.0</endTime>
|
||||
</act>
|
||||
<act type="deliverShipment">
|
||||
<shipmentId>4</shipmentId>
|
||||
<arrTime>0.0</arrTime>
|
||||
<endTime>0.0</endTime>
|
||||
</act>
|
||||
<end>0.0</end>
|
||||
</route>
|
||||
</initialRoutes>
|
||||
</problem>
|
||||
|
|
|
|||
|
|
@ -1,90 +1,91 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<problem xmlns="http://www.w3schools.com"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
||||
<problemType>
|
||||
<fleetSize>INFINITE</fleetSize>
|
||||
</problemType>
|
||||
<vehicles>
|
||||
<vehicle>
|
||||
<id>v1</id>
|
||||
<typeId>vehType</typeId>
|
||||
<startLocation>
|
||||
<id>loc</id>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>loc</id>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
||||
<problemType>
|
||||
<fleetSize>INFINITE</fleetSize>
|
||||
</problemType>
|
||||
<vehicles>
|
||||
<vehicle>
|
||||
<id>v1</id>
|
||||
<typeId>vehType</typeId>
|
||||
<startLocation>
|
||||
<id>loc</id>
|
||||
</startLocation>
|
||||
<endLocation>
|
||||
<id>loc</id>
|
||||
</endLocation>
|
||||
<timeSchedule>
|
||||
<start>0.0</start>
|
||||
<end>1.7976931348623157E308</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
</vehicles>
|
||||
<vehicleTypes>
|
||||
<type>
|
||||
<id>vehType</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">20</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>1.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
</vehicleTypes>
|
||||
<services>
|
||||
<service id="1" type="service">
|
||||
<location>
|
||||
<id>loc</id>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>2.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>1.7976931348623157E308</end>
|
||||
</timeSchedule>
|
||||
<returnToDepot>true</returnToDepot>
|
||||
</vehicle>
|
||||
</vehicles>
|
||||
<vehicleTypes>
|
||||
<type>
|
||||
<id>vehType</id>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">20</dimension>
|
||||
</capacity-dimensions>
|
||||
<costs>
|
||||
<fixed>0.0</fixed>
|
||||
<distance>1.0</distance>
|
||||
<time>0.0</time>
|
||||
</costs>
|
||||
</type>
|
||||
</vehicleTypes>
|
||||
<services>
|
||||
<service id="1" type="service">
|
||||
<location>
|
||||
<id>loc</id>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>2.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>1.7976931348623157E308</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
<service id="2" type="service">
|
||||
<location>
|
||||
<id>loc2</id>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>4.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>1.7976931348623157E308</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
</services>
|
||||
<solutions>
|
||||
<solution>
|
||||
<cost>10.0</cost>
|
||||
<routes>
|
||||
<route>
|
||||
<driverId>noDriver</driverId>
|
||||
<vehicleId>v1</vehicleId>
|
||||
<start>0.0</start>
|
||||
<act type="service">
|
||||
<serviceId>1</serviceId>
|
||||
<arrTime>0.0</arrTime>
|
||||
<endTime>0.0</endTime>
|
||||
</act>
|
||||
<end>0.0</end>
|
||||
</route>
|
||||
</routes>
|
||||
<unassignedJobs>
|
||||
<job id="2"/>
|
||||
</unassignedJobs>
|
||||
</solution>
|
||||
</solutions>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
<service id="2" type="service">
|
||||
<location>
|
||||
<id>loc2</id>
|
||||
</location>
|
||||
<capacity-dimensions>
|
||||
<dimension index="0">1</dimension>
|
||||
</capacity-dimensions>
|
||||
<duration>4.0</duration>
|
||||
<timeWindows>
|
||||
<timeWindow>
|
||||
<start>0.0</start>
|
||||
<end>1.7976931348623157E308</end>
|
||||
</timeWindow>
|
||||
</timeWindows>
|
||||
</service>
|
||||
</services>
|
||||
<solutions>
|
||||
<solution>
|
||||
<cost>10.0</cost>
|
||||
<routes>
|
||||
<route>
|
||||
<driverId>noDriver</driverId>
|
||||
<vehicleId>v1</vehicleId>
|
||||
<start>0.0</start>
|
||||
<act type="service">
|
||||
<serviceId>1</serviceId>
|
||||
<arrTime>0.0</arrTime>
|
||||
<endTime>0.0</endTime>
|
||||
</act>
|
||||
<end>0.0</end>
|
||||
</route>
|
||||
</routes>
|
||||
<unassignedJobs>
|
||||
<job id="2"/>
|
||||
</unassignedJobs>
|
||||
</solution>
|
||||
</solutions>
|
||||
</problem>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue