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

Merge remote-tracking branch 'choose_remote_name/relaxAPI' into

PickupAndDelivery

Conflicts:
	jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java
	jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java
	jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java
	jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java
	jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java
	jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java
	jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java
	jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java
This commit is contained in:
oblonski 2013-11-11 20:54:45 +01:00
commit d2151f3e1f
51 changed files with 323 additions and 627 deletions

View file

@ -52,7 +52,7 @@ public class BuildCVRPAlgoFromScratchTest {
vrp = builder.build();
final StateManager stateManager = new StateManager();
HardActivityLevelConstraint hardActLevelConstraint = new HardActivityLevelConstraint() {
HardActivityStateLevelConstraint hardActLevelConstraint = new HardActivityStateLevelConstraint() {
@Override
public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
@ -62,7 +62,10 @@ public class BuildCVRPAlgoFromScratchTest {
ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts());
ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardLoadConstraint(stateManager), hardActLevelConstraint);
ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new LoadConstraint(stateManager), hardActLevelConstraint);
VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
JobInsertionCostsCalculator finalServiceInsertion = new VehicleTypeDependentJobInsertionCalculator(fleetManager, serviceInsertion);

View file

@ -61,13 +61,14 @@ public class BuildPDVRPAlgoFromScratchTest {
final StateManager stateManager = new StateManager();
ConstraintManager actLevelConstraintAccumulator = new ConstraintManager();
actLevelConstraintAccumulator.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager));
actLevelConstraintAccumulator.addConstraint(new HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
ConstraintManager actLevelConstraintAccumulator = new ConstraintManager(vrp,stateManager);
actLevelConstraintAccumulator.addConstraint(new ServiceLoadActivityLevelConstraint(stateManager));
actLevelConstraintAccumulator.addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts()));
ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts());
ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager), actLevelConstraintAccumulator);
ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new ServiceLoadRouteLevelConstraint(stateManager), actLevelConstraintAccumulator);
// CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager));
@ -110,15 +111,15 @@ public class BuildPDVRPAlgoFromScratchTest {
final RouteActivityVisitor iterateForward = new RouteActivityVisitor();
iterateForward.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
iterateForward.addActivityVisitor(new UpdateEarliestStartTimeWindowAtActLocations(stateManager, vrp.getTransportCosts()));
iterateForward.addActivityVisitor(new UpdateCostsAtAllLevels(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
// iterateForward.addActivityVisitor(new UpdateEarliestStartTime(stateManager, vrp.getTransportCosts()));
iterateForward.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
iterateForward.addActivityVisitor(new UpdateOccuredDeliveriesAtActivityLevel(stateManager));
iterateForward.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
iterateForward.addActivityVisitor(new UpdateOccuredDeliveries(stateManager));
iterateForward.addActivityVisitor(new UpdateLoads(stateManager));
final ReverseRouteActivityVisitor iterateBackward = new ReverseRouteActivityVisitor();
iterateBackward.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
iterateBackward.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager));
iterateBackward.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts()));
iterateBackward.addActivityVisitor(new UpdateFuturePickups(stateManager));
InsertionStartsListener loadVehicleInDepot = new InsertionStartsListener() {
@ -175,7 +176,6 @@ public class BuildPDVRPAlgoFromScratchTest {
// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size());
vra.addInitialSolution(iniSolution);
vra.setNuOfIterations(10000);
vra.setPrematureBreak(1000);

View file

@ -77,11 +77,11 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
final StateManager stateManager = new StateManager();
ConstraintManager constraintManager = new ConstraintManager();
constraintManager.addConstraint(new HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
constraintManager.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager));
ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager);
constraintManager.addTimeWindowConstraint();
constraintManager.addLoadConstraint();
constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager,true));
constraintManager.addConstraint(new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager));
ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts());
@ -135,15 +135,14 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
final RouteActivityVisitor iterateForward = new RouteActivityVisitor();
iterateForward.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
iterateForward.addActivityVisitor(new UpdateEarliestStartTimeWindowAtActLocations(stateManager, vrp.getTransportCosts()));
iterateForward.addActivityVisitor(new UpdateCostsAtAllLevels(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
iterateForward.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
iterateForward.addActivityVisitor(new UpdateOccuredDeliveriesAtActivityLevel(stateManager));
iterateForward.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
iterateForward.addActivityVisitor(new UpdateOccuredDeliveries(stateManager));
iterateForward.addActivityVisitor(new UpdateLoads(stateManager));
final ReverseRouteActivityVisitor iterateBackward = new ReverseRouteActivityVisitor();
iterateBackward.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
iterateBackward.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager));
iterateBackward.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts()));
iterateBackward.addActivityVisitor(new UpdateFuturePickups(stateManager));
JobInsertedListener updateWhenJobHasBeenInserted = new JobInsertedListener() {
@ -169,8 +168,7 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
vra.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager));
bestInsertion.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
bestInsertion.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
bestInsertion.addListener(new UpdateLoads(stateManager));
bestInsertion.addListener(updateWhenJobHasBeenInserted);
bestInsertion.addListener(updateRoutesWhenInsertionStarts);

View file

@ -150,7 +150,8 @@ public class GendreauPostOptTest {
activityCosts = new ExampleActivityCostFunction();
ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts), new HardLoadConstraint(states), new HardTimeWindowActivityLevelConstraint(states, cost));
ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts), new LoadConstraint(states), new TimeWindowConstraint(states, cost));

View file

@ -7,7 +7,7 @@ import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import algorithms.HardActivityLevelConstraint.ConstraintsStatus;
import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus;
import basics.Service;
import basics.Shipment;
import basics.route.DeliverShipment;

View file

@ -0,0 +1,23 @@
package algorithms;
import basics.Service;
class LoadConstraint implements HardRouteStateLevelConstraint{
private StateGetter states;
public LoadConstraint(StateGetter states) {
super();
this.states = states;
}
@Override
public boolean fulfilled(InsertionContext insertionContext) {
int currentLoad = (int) states.getRouteState(insertionContext.getRoute(), StateFactory.LOAD).toDouble();
Service service = (Service) insertionContext.getJob();
if(currentLoad + service.getCapacityDemand() > insertionContext.getNewVehicle().getCapacity()){
return false;
}
return true;
}
}

View file

@ -1,7 +1,10 @@
package algorithms;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
@ -9,7 +12,9 @@ import org.junit.Test;
import util.Coordinate;
import util.Locations;
import util.ManhattanCosts;
import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus;
import basics.Shipment;
import basics.VehicleRoutingProblem;
import basics.costs.VehicleRoutingActivityCosts;
import basics.costs.VehicleRoutingTransportCosts;
import basics.route.Driver;
@ -35,7 +40,7 @@ public class ShipmentInsertionCalculatorTest {
};
HardActivityLevelConstraint hardActivityLevelConstraint = new HardActivityLevelConstraint() {
HardActivityStateLevelConstraint hardActivityLevelConstraint = new HardActivityStateLevelConstraint() {
@Override
public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct,TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
@ -43,7 +48,7 @@ public class ShipmentInsertionCalculatorTest {
}
};
HardRouteLevelConstraint hardRouteLevelConstraint = new HardRouteLevelConstraint(){
HardRouteStateLevelConstraint hardRouteLevelConstraint = new HardRouteStateLevelConstraint(){
@Override
public boolean fulfilled(InsertionContext insertionContext) {
@ -78,7 +83,7 @@ public class ShipmentInsertionCalculatorTest {
createInsertionCalculator(hardRouteLevelConstraint);
}
private void createInsertionCalculator(HardRouteLevelConstraint hardRouteLevelConstraint) {
private void createInsertionCalculator(HardRouteStateLevelConstraint hardRouteLevelConstraint) {
insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, hardRouteLevelConstraint, hardActivityLevelConstraint);
}
@ -110,7 +115,7 @@ public class ShipmentInsertionCalculatorTest {
Shipment shipment2 = Shipment.Builder.newInstance("s2", 1).setPickupLocation("10,10").setDeliveryLocation("0,0").build();
VehicleRoute route = VehicleRoute.emptyRoute();
new Inserter(new InsertionListeners()).insertJob(shipment, new InsertionData(0,0,0,vehicle,null), route);
createInsertionCalculator(new HardRouteLevelConstraint() {
createInsertionCalculator(new HardRouteStateLevelConstraint() {
@Override
public boolean fulfilled(InsertionContext insertionContext) {
@ -177,10 +182,12 @@ public class ShipmentInsertionCalculatorTest {
StateManager stateManager = new StateManager();
RouteActivityVisitor routeActVisitor = new RouteActivityVisitor();
routeActVisitor.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
routeActVisitor.addActivityVisitor(new UpdateLoads(stateManager));
routeActVisitor.visit(route);
ConstraintManager constraintManager = new ConstraintManager();
VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class);
ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager);
constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager,true));
ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator,

View file

@ -43,13 +43,13 @@ class UpdateStates implements JobInsertedListener, InsertionStartsListener{
public UpdateStates(StateManager states, VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts) {
routeActivityVisitor = new RouteActivityVisitor();
routeActivityVisitor.addActivityVisitor(new UpdateActivityTimes(routingCosts));
routeActivityVisitor.addActivityVisitor(new UpdateCostsAtAllLevels(activityCosts, routingCosts, states));
routeActivityVisitor.addActivityVisitor(new UpdateLoadAtAllLevels(states));
routeActivityVisitor.addActivityVisitor(new UpdateVariableCosts(activityCosts, routingCosts, states));
routeActivityVisitor.addActivityVisitor(new UpdateLoads(states));
routeActivityVisitor.addActivityVisitor(new UpdateMaxLoad(states));
revRouteActivityVisitor = new ReverseRouteActivityVisitor();
revRouteActivityVisitor.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(states, routingCosts));
insertionListeners.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(states));
insertionListeners.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(states));
revRouteActivityVisitor.addActivityVisitor(new TimeWindowUpdater(states, routingCosts));
insertionListeners.addListener(new UpdateLoads(states));
// insertionListeners.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(states));
}
public void update(VehicleRoute route){

View file

@ -153,7 +153,7 @@ public class TestCalculatesServiceInsertion {
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts), new HardLoadConstraint(states), new HardTimeWindowActivityLevelConstraint(states, costs));
serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts), new LoadConstraint(states), new TimeWindowConstraint(states, costs));
stateUpdater = new UpdateStates(states, costs, activityCosts);

View file

@ -143,7 +143,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
ActivityInsertionCostsCalculator actInsertionCostCalculator = new RouteLevelActivityInsertionCostsEstimator(costs, activityCosts, states);
serviceInsertion = new ServiceInsertionOnRouteLevelCalculator(costs,activityCosts, actInsertionCostCalculator, new HardLoadConstraint(states), new HardTimeWindowActivityLevelConstraint(states, costs));
serviceInsertion = new ServiceInsertionOnRouteLevelCalculator(costs,activityCosts, actInsertionCostCalculator, new LoadConstraint(states), new TimeWindowConstraint(states, costs));
serviceInsertion.setNuOfActsForwardLooking(4);
serviceInsertion.setStates(states);

View file

@ -119,7 +119,7 @@ public class TestTourStateUpdaterWithService {
public void testCalculatedCost() {
updateStates.update(vehicleRoute);
assertEquals(40.0, states.getRouteState(vehicleRoute,StateFactory.COSTS).toDouble(), 0.05);
assertEquals(10, states.getRouteState(vehicleRoute, StateFactory.LOAD).toDouble(), 0.05);
assertEquals(10, states.getRouteState(vehicleRoute, StateFactory.LOAD_AT_END).toDouble(), 0.05);
}
@Test

View file

@ -0,0 +1,63 @@
package algorithms;
import java.util.Collection;
import algorithms.StateManager.StateImpl;
import basics.Job;
import basics.algo.InsertionEndsListener;
import basics.algo.InsertionStartsListener;
import basics.algo.JobInsertedListener;
import basics.costs.VehicleRoutingActivityCosts;
import basics.costs.VehicleRoutingTransportCosts;
import basics.route.RouteActivityVisitor;
import basics.route.VehicleRoute;
class UpdateCostsAtRouteLevel implements StateUpdater,JobInsertedListener, InsertionStartsListener, InsertionEndsListener{
private StateManager states;
private VehicleRoutingTransportCosts tpCosts;
private VehicleRoutingActivityCosts actCosts;
public UpdateCostsAtRouteLevel(StateManager states, VehicleRoutingTransportCosts tpCosts, VehicleRoutingActivityCosts actCosts) {
super();
this.states = states;
this.tpCosts = tpCosts;
this.actCosts = actCosts;
}
@Override
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
// inRoute.getVehicleRouteCostCalculator().addTransportCost(additionalCosts);
double oldCosts = states.getRouteState(inRoute, StateFactory.COSTS).toDouble();
oldCosts += additionalCosts;
states.putRouteState(inRoute, StateFactory.COSTS, new StateImpl(oldCosts));
}
@Override
public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
RouteActivityVisitor forwardInTime = new RouteActivityVisitor();
forwardInTime.addActivityVisitor(new UpdateVariableCosts(actCosts, tpCosts, states));
for(VehicleRoute route : vehicleRoutes){
forwardInTime.visit(route);
}
}
@Override
public void informInsertionEnds(Collection<VehicleRoute> vehicleRoutes) {
// IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(tpCosts);
// forwardInTime.addListener(new UpdateCostsAtAllLevels(actCosts, tpCosts, states));
for(VehicleRoute route : vehicleRoutes){
if(route.isEmpty()) continue;
route.getVehicleRouteCostCalculator().reset();
route.getVehicleRouteCostCalculator().addOtherCost(states.getRouteState(route, StateFactory.COSTS).toDouble());
route.getVehicleRouteCostCalculator().price(route.getVehicle());
// forwardInTime.iterate(route);
}
}
}

View file

@ -0,0 +1,54 @@
package algorithms;
import java.util.Collection;
import algorithms.StateManager.StateImpl;
import basics.Job;
import basics.Service;
import basics.algo.InsertionStartsListener;
import basics.algo.JobInsertedListener;
import basics.route.VehicleRoute;
/**
* Updates load at route level, i.e. modifies StateTypes.LOAD for each route.
*
* @author stefan
*
*/
class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsListener, StateUpdater{
private StateManager states;
/**
* Updates load at route level, i.e. modifies StateTypes.LOAD for each route.
*
* @author stefan
*
*/
public UpdateLoadAtRouteLevel(StateManager states) {
super();
this.states = states;
}
@Override
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
if(!(job2insert instanceof Service)){
return;
}
double oldLoad = states.getRouteState(inRoute, StateFactory.LOAD).toDouble();
states.putRouteState(inRoute, StateFactory.LOAD, StateFactory.createState(oldLoad + job2insert.getCapacityDemand()));
}
@Override
public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
for(VehicleRoute route : vehicleRoutes){
int load = 0;
for(Job j : route.getTourActivities().getJobs()){
load += j.getCapacityDemand();
}
states.putRouteState(route, StateFactory.LOAD, new StateImpl(load));
}
}
}