mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
pdp
This commit is contained in:
parent
dfe25738bf
commit
e912979bbb
25 changed files with 30297 additions and 1169 deletions
|
|
@ -1,9 +1,7 @@
|
|||
package algorithms;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.awt.image.CropImageFilter;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
|
@ -11,7 +9,6 @@ import org.junit.Test;
|
|||
import util.Coordinate;
|
||||
import util.CrowFlyCosts;
|
||||
import util.Locations;
|
||||
import util.ManhattanCosts;
|
||||
import basics.Service;
|
||||
import basics.Shipment;
|
||||
|
||||
|
|
|
|||
|
|
@ -17,18 +17,17 @@
|
|||
package algorithms;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import util.Solutions;
|
||||
import algorithms.StateManager.StateImpl;
|
||||
import algorithms.acceptors.AcceptNewIfBetterThanWorst;
|
||||
import algorithms.selectors.SelectBest;
|
||||
import basics.Delivery;
|
||||
import basics.Job;
|
||||
import basics.Pickup;
|
||||
import basics.Service;
|
||||
import basics.Shipment;
|
||||
import basics.VehicleRoutingAlgorithm;
|
||||
|
|
@ -44,7 +43,6 @@ import basics.io.VrpXMLWriter;
|
|||
import basics.route.InfiniteFleetManagerFactory;
|
||||
import basics.route.ReverseRouteActivityVisitor;
|
||||
import basics.route.RouteActivityVisitor;
|
||||
import basics.route.TourActivity;
|
||||
import basics.route.VehicleFleetManager;
|
||||
import basics.route.VehicleRoute;
|
||||
|
||||
|
|
@ -56,6 +54,8 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
|
||||
static Logger log = Logger.getLogger(BuildPDVRPWithShipmentsAlgoFromScratchTest.class);
|
||||
|
||||
ExecutorService executorService;
|
||||
|
||||
@Before
|
||||
public void setup(){
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
ConstraintManager constraintManager = new ConstraintManager();
|
||||
constraintManager.addConstraint(new HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
|
||||
constraintManager.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager));
|
||||
constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager));
|
||||
constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager,true));
|
||||
constraintManager.addConstraint(new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager));
|
||||
|
||||
ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts());
|
||||
|
|
@ -98,8 +98,11 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
|
||||
BestInsertion bestInsertion = new BestInsertion(finalServiceInsertion);
|
||||
|
||||
RuinRadial radial = new RuinRadial(vrp, 0.15, new AvgJobDistance(vrp.getTransportCosts()));
|
||||
RuinRandom random = new RuinRandom(vrp, 0.25);
|
||||
executorService = Executors.newFixedThreadPool(2);;
|
||||
// BestInsertionConc bestInsertion = new BestInsertionConc(finalServiceInsertion, executorService, 2);
|
||||
|
||||
RuinRadial radial = new RuinRadial(vrp, 0.3, new AvgJobDistance(vrp.getTransportCosts()));
|
||||
RuinRandom random = new RuinRandom(vrp, 0.5);
|
||||
|
||||
SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() {
|
||||
|
||||
|
|
@ -142,63 +145,41 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
iterateBackward.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
|
||||
iterateBackward.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager));
|
||||
|
||||
JobInsertedListener updateWhenJobHasBeenInserted = new JobInsertedListener() {
|
||||
|
||||
@Override
|
||||
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
|
||||
iterateForward.visit(inRoute);
|
||||
iterateBackward.visit(inRoute);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
InsertionStartsListener loadVehicleInDepot = new InsertionStartsListener() {
|
||||
InsertionStartsListener updateRoutesWhenInsertionStarts = new InsertionStartsListener() {
|
||||
|
||||
@Override
|
||||
public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
|
||||
for(VehicleRoute route : vehicleRoutes){
|
||||
int loadAtDepot = 0;
|
||||
int loadAtEnd = 0;
|
||||
for(Job j : route.getTourActivities().getJobs()){
|
||||
if(j instanceof Delivery){
|
||||
loadAtDepot += j.getCapacityDemand();
|
||||
}
|
||||
if(j instanceof Pickup){
|
||||
loadAtEnd += j.getCapacityDemand();
|
||||
}
|
||||
}
|
||||
stateManager.putRouteState(route, StateFactory.LOAD_AT_BEGINNING, new StateImpl(loadAtDepot));
|
||||
stateManager.putRouteState(route, StateFactory.LOAD, new StateImpl(loadAtEnd));
|
||||
iterateForward.visit(route);
|
||||
iterateBackward.visit(route);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
vra.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager));
|
||||
|
||||
JobInsertedListener updateLoadAfterJobHasBeenInserted = new JobInsertedListener() {
|
||||
|
||||
@Override
|
||||
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
|
||||
// log.info("insert job " + job2insert.getClass().toString() + " job " + job2insert + "" + job2insert.getCapacityDemand() + " in route " + inRoute.getTourActivities());
|
||||
|
||||
if(job2insert instanceof Delivery){
|
||||
int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING).toDouble();
|
||||
// log.info("loadAtDepot="+loadAtDepot);
|
||||
stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING, new StateImpl(loadAtDepot + job2insert.getCapacityDemand()));
|
||||
}
|
||||
if(job2insert instanceof Pickup){
|
||||
int loadAtEnd = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_END).toDouble();
|
||||
// log.info("loadAtEnd="+loadAtEnd);
|
||||
stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_END, new StateImpl(loadAtEnd + job2insert.getCapacityDemand()));
|
||||
}
|
||||
iterateForward.visit(inRoute);
|
||||
iterateBackward.visit(inRoute);
|
||||
}
|
||||
};
|
||||
|
||||
bestInsertion.addListener(loadVehicleInDepot);
|
||||
bestInsertion.addListener(updateLoadAfterJobHasBeenInserted);
|
||||
bestInsertion.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
|
||||
bestInsertion.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
|
||||
bestInsertion.addListener(updateWhenJobHasBeenInserted);
|
||||
bestInsertion.addListener(updateRoutesWhenInsertionStarts);
|
||||
|
||||
VehicleRoutingProblemSolution iniSolution = new InsertionInitialSolutionFactory(bestInsertion, solutionCostCalculator).createSolution(vrp);
|
||||
// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size());
|
||||
vra.addInitialSolution(iniSolution);
|
||||
|
||||
vra.setNuOfIterations(100);
|
||||
vra.setPrematureBreak(100);
|
||||
vra.setNuOfIterations(1000);
|
||||
// vra.setPrematureBreak(500);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -206,20 +187,27 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
public void test(){
|
||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||
VehicleRoutingProblemSolution best = Solutions.getBest(solutions);
|
||||
System.out.println(best.getCost());
|
||||
for(VehicleRoute r : best.getRoutes()){
|
||||
System.out.println(r);
|
||||
System.out.println("#jobs="+r.getTourActivities().jobSize());
|
||||
System.out.println(r.getStart());
|
||||
for(TourActivity act : r.getTourActivities().getActivities()){
|
||||
System.out.println(act);
|
||||
}
|
||||
System.out.println(r.getEnd());
|
||||
}
|
||||
|
||||
executorService.shutdown();
|
||||
// Wait until all threads are finish
|
||||
// executorService.awaitTermination();
|
||||
|
||||
// for(VehicleRoute r : best.getRoutes()){
|
||||
// System.out.println(r);
|
||||
// System.out.println("#jobs="+r.getTourActivities().jobSize());
|
||||
// System.out.println(r.getStart());
|
||||
// for(TourActivity act : r.getTourActivities().getActivities()){
|
||||
// System.out.println(act);
|
||||
// }
|
||||
// System.out.println(r.getEnd());
|
||||
// }
|
||||
//
|
||||
System.out.println("total="+best.getCost());
|
||||
System.out.println("#routes="+best.getRoutes().size());
|
||||
|
||||
// for()
|
||||
|
||||
new VrpXMLWriter(vrp, solutions).write("src/test/resources/pd_solomon_c101_sol.xml");
|
||||
new VrpXMLWriter(vrp, solutions).write("src/test/resources/pdp_sol.xml");
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,82 @@
|
|||
package algorithms;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import algorithms.HardActivityLevelConstraint.ConstraintsStatus;
|
||||
import basics.Service;
|
||||
import basics.Shipment;
|
||||
import basics.route.DeliverShipment;
|
||||
import basics.route.PickupService;
|
||||
import basics.route.PickupShipment;
|
||||
import basics.route.Vehicle;
|
||||
|
||||
public class HardPickupAndDeliveryShipmentActivityConstraintTest {
|
||||
|
||||
Vehicle vehicle;
|
||||
|
||||
StateManager stateManager;
|
||||
|
||||
Shipment shipment;
|
||||
|
||||
HardPickupAndDeliveryShipmentActivityLevelConstraint constraint;
|
||||
|
||||
InsertionContext iFacts;
|
||||
|
||||
@Before
|
||||
public void doBefore(){
|
||||
vehicle = mock(Vehicle.class);
|
||||
when(vehicle.getCapacity()).thenReturn(2);
|
||||
stateManager = new StateManager();
|
||||
shipment = mock(Shipment.class);
|
||||
when(shipment.getCapacityDemand()).thenReturn(1);
|
||||
iFacts = new InsertionContext(null, null, vehicle, null, 0.0);
|
||||
constraint = new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenPickupActivityIsInsertedAndLoadIsSufficient_returnFullFilled(){
|
||||
PickupService pickupService = new PickupService(mock(Service.class));
|
||||
PickupService anotherService = new PickupService(mock(Service.class));
|
||||
PickupShipment pickupShipment = new PickupShipment(shipment);
|
||||
|
||||
assertEquals(ConstraintsStatus.FULFILLED,constraint.fulfilled(iFacts, pickupService, pickupShipment, anotherService, 0.0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenPickupActivityIsInsertedAndLoadIsNotSufficient_returnNOT_FullFilled(){
|
||||
PickupService pickupService = new PickupService(mock(Service.class));
|
||||
PickupService anotherService = new PickupService(mock(Service.class));
|
||||
PickupShipment pickupShipment = new PickupShipment(shipment);
|
||||
|
||||
stateManager.putActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(2));
|
||||
assertEquals(ConstraintsStatus.NOT_FULFILLED,constraint.fulfilled(iFacts, pickupService, pickupShipment, anotherService, 0.0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenDeliveryActivityIsInsertedAndLoadIsNotSufficient_returnNOT_FullFilled_BREAK(){
|
||||
PickupService pickupService = new PickupService(mock(Service.class));
|
||||
PickupService anotherService = new PickupService(mock(Service.class));
|
||||
DeliverShipment pickupShipment = new DeliverShipment(shipment);
|
||||
|
||||
stateManager.putActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(2));
|
||||
assertEquals(ConstraintsStatus.NOT_FULFILLED_BREAK,constraint.fulfilled(iFacts, pickupService, pickupShipment, anotherService, 0.0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenDeliveryActivityIsInsertedAndLoadIsSufficient_returnFullFilled(){
|
||||
PickupService pickupService = new PickupService(mock(Service.class));
|
||||
PickupService anotherService = new PickupService(mock(Service.class));
|
||||
DeliverShipment pickupShipment = new DeliverShipment(shipment);
|
||||
|
||||
stateManager.putActivityState(pickupService, StateFactory.LOAD, StateFactory.createState(1));
|
||||
assertEquals(ConstraintsStatus.FULFILLED,constraint.fulfilled(iFacts, pickupService, pickupShipment, anotherService, 0.0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package algorithms;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.Before;
|
||||
|
|
@ -8,11 +9,12 @@ import org.junit.Test;
|
|||
import util.Coordinate;
|
||||
import util.Locations;
|
||||
import util.ManhattanCosts;
|
||||
import algorithms.HardActivityLevelConstraint.ConstraintsStatus;
|
||||
import basics.Shipment;
|
||||
import basics.costs.VehicleRoutingActivityCosts;
|
||||
import basics.costs.VehicleRoutingTransportCosts;
|
||||
import basics.route.Driver;
|
||||
import basics.route.DriverImpl;
|
||||
import basics.route.RouteActivityVisitor;
|
||||
import basics.route.TourActivity;
|
||||
import basics.route.Vehicle;
|
||||
import basics.route.VehicleImpl;
|
||||
|
|
@ -70,7 +72,7 @@ public class ShipmentInsertionCalculatorTest {
|
|||
|
||||
};
|
||||
routingCosts = new ManhattanCosts(locations);
|
||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t", 1).setCostPerDistance(1).build();
|
||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t", 2).setCostPerDistance(1).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("v").setLocationId("0,0").setType(type).build();
|
||||
activityInsertionCostsCalculator = new LocalActivityInsertionCostsCalculator(routingCosts, activityCosts);
|
||||
createInsertionCalculator(hardRouteLevelConstraint);
|
||||
|
|
@ -156,4 +158,38 @@ public class ShipmentInsertionCalculatorTest {
|
|||
assertEquals(1,iData.getDeliveryInsertionIndex());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInstertingShipmentWithLoadConstraintWhereCapIsNotSufficient_capConstraintsAreFulfilled(){
|
||||
Shipment shipment = Shipment.Builder.newInstance("s", 1).setPickupLocation("0,10").setDeliveryLocation("10,0").build();
|
||||
Shipment shipment2 = Shipment.Builder.newInstance("s2", 1).setPickupLocation("10,10").setDeliveryLocation("0,0").build();
|
||||
Shipment shipment3 = Shipment.Builder.newInstance("s3", 1).setPickupLocation("0,0").setDeliveryLocation("9,9").build();
|
||||
|
||||
|
||||
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
route.setVehicle(vehicle, 0.0);
|
||||
|
||||
Inserter inserter = new Inserter(new InsertionListeners());
|
||||
|
||||
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();
|
||||
|
||||
RouteActivityVisitor routeActVisitor = new RouteActivityVisitor();
|
||||
routeActVisitor.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
|
||||
routeActVisitor.visit(route);
|
||||
|
||||
ConstraintManager constraintManager = new ConstraintManager();
|
||||
|
||||
constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager,true));
|
||||
ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator,
|
||||
hardRouteLevelConstraint, constraintManager);
|
||||
|
||||
|
||||
InsertionData iData = insertionCalculator.getInsertionData(route, shipment3, vehicle, 0.0, DriverImpl.noDriver(), Double.MAX_VALUE);
|
||||
assertTrue(iData instanceof InsertionData.NoInsertionFound);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ public class ShipmentTest {
|
|||
public void whenShipmentIsInstantiatedWithASizeOf10_theSizeShouldBe10(){
|
||||
Shipment one = Shipment.Builder.newInstance("s", 10).setPickupLocation("foo").
|
||||
setDeliveryLocation("foofoo").setPickupServiceTime(10).setDeliveryServiceTime(20).build();
|
||||
assertEquals(10,one.getSize());
|
||||
assertEquals(10,one.getCapacityDemand());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -44,7 +44,7 @@ public class ShipmentTest {
|
|||
.setDeliveryLocation("foofoo").setDeliveryServiceTime(20).setDeliveryCoord(Coordinate.newInstance(1, 1)).
|
||||
setDeliveryTimeWindow(TimeWindow.newInstance(1.0, 2.0)).build();
|
||||
assertEquals("s",one.getId());
|
||||
assertEquals(10,one.getSize());
|
||||
assertEquals(10,one.getCapacityDemand());
|
||||
assertEquals("foo",one.getPickupLocation());
|
||||
assertEquals(0,one.getPickupCoord().getX(),0.01);
|
||||
assertEquals(1.0,one.getPickupServiceTime(),0.01);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
25035
jsprit-core/src/test/resources/pdp.xml
Normal file
25035
jsprit-core/src/test/resources/pdp.xml
Normal file
File diff suppressed because it is too large
Load diff
3612
jsprit-core/src/test/resources/pdp_sol.xml
Normal file
3612
jsprit-core/src/test/resources/pdp_sol.xml
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue