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:
commit
d2151f3e1f
51 changed files with 323 additions and 627 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
23
jsprit-core/src/test/java/algorithms/LoadConstraint.java
Normal file
23
jsprit-core/src/test/java/algorithms/LoadConstraint.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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){
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue