mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
5dcbdeeefc
2 changed files with 118 additions and 16 deletions
|
|
@ -81,7 +81,7 @@ public class MaxDistanceConstraint implements HardActivityConstraint{
|
|||
double distancePrevAct2NewAct = distanceCalculator.getDistance(prevAct.getLocation(), newAct.getLocation(), iFacts.getNewDepTime(), iFacts.getNewVehicle());
|
||||
double distanceNewAct2nextAct = distanceCalculator.getDistance(newAct.getLocation(), nextAct.getLocation(), iFacts.getNewDepTime(), iFacts.getNewVehicle());
|
||||
double distancePrevAct2NextAct = distanceCalculator.getDistance(prevAct.getLocation(), nextAct.getLocation(), prevActDepTime, iFacts.getNewVehicle());
|
||||
if(routeIsEmpty) distancePrevAct2NextAct = 0;
|
||||
if(prevAct instanceof Start && nextAct instanceof End) distancePrevAct2NextAct = 0;
|
||||
if(nextAct instanceof End && !iFacts.getNewVehicle().isReturnToDepot()){
|
||||
distanceNewAct2nextAct = 0;
|
||||
distancePrevAct2NextAct = 0;
|
||||
|
|
@ -97,11 +97,19 @@ public class MaxDistanceConstraint implements HardActivityConstraint{
|
|||
TourActivity actBeforePickup;
|
||||
if(iIndexOfPickup > 0) actBeforePickup = iFacts.getRoute().getActivities().get(iIndexOfPickup-1);
|
||||
else actBeforePickup = new Start(iFacts.getNewVehicle().getStartLocation(),0,Double.MAX_VALUE);
|
||||
TourActivity actAfterPickup = iFacts.getRoute().getActivities().get(iIndexOfPickup);
|
||||
//ToDo account here fore End and returnToDepot
|
||||
TourActivity actAfterPickup;
|
||||
if (iIndexOfPickup < iFacts.getRoute().getActivities().size())
|
||||
actAfterPickup = iFacts.getRoute().getActivities().get(iIndexOfPickup);
|
||||
else
|
||||
actAfterPickup = nextAct;
|
||||
double distanceActBeforePickup2Pickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), pickup.getLocation(), actBeforePickup.getEndTime(), iFacts.getNewVehicle());
|
||||
double distancePickup2ActAfterPickup = distanceCalculator.getDistance(pickup.getLocation(), actAfterPickup.getLocation(), iFacts.getRelatedActivityContext().getEndTime(), iFacts.getNewVehicle());
|
||||
double distanceBeforePickup2AfterPickup = distanceCalculator.getDistance(actBeforePickup.getLocation(), actAfterPickup.getLocation(), actBeforePickup.getEndTime(), iFacts.getNewVehicle());
|
||||
if (routeIsEmpty) distanceBeforePickup2AfterPickup = 0;
|
||||
if (actAfterPickup instanceof End && !iFacts.getNewVehicle().isReturnToDepot()) {
|
||||
distancePickup2ActAfterPickup = 0;
|
||||
distanceBeforePickup2AfterPickup = 0;
|
||||
}
|
||||
additionalDistanceOfPickup = distanceActBeforePickup2Pickup + distancePickup2ActAfterPickup - distanceBeforePickup2AfterPickup;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import com.graphhopper.jsprit.core.problem.job.Delivery;
|
|||
import com.graphhopper.jsprit.core.problem.job.Job;
|
||||
import com.graphhopper.jsprit.core.problem.job.Pickup;
|
||||
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||
import com.graphhopper.jsprit.core.problem.misc.ActivityContext;
|
||||
import com.graphhopper.jsprit.core.problem.misc.JobInsertionContext;
|
||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||
import com.graphhopper.jsprit.core.problem.solution.route.activity.End;
|
||||
|
|
@ -260,4 +261,97 @@ vehicle2 (max distance): 180.0
|
|||
Assert.assertEquals(25d, total - stateManager.getActivityState(route.getActivities().get(4), vehicle2, traveledDistanceId, Double.class), 0.01);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingDeliverShipment_constraintShouldWork() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s")
|
||||
.setPickupLocation(Location.newInstance(0, 3))
|
||||
.setDeliveryLocation(Location.newInstance(4, 0))
|
||||
.build();
|
||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v")
|
||||
.setStartLocation(Location.newInstance(0, 0))
|
||||
.build();
|
||||
final VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance()
|
||||
.addJob(shipment)
|
||||
.addVehicle(vehicle)
|
||||
.build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
JobInsertionContext context = new JobInsertionContext(route, shipment, vehicle, null, 0);
|
||||
context.getAssociatedActivities().add(vrp.getActivities(shipment).get(0));
|
||||
context.getAssociatedActivities().add(vrp.getActivities(shipment).get(1));
|
||||
maxDistanceMap = new HashMap<>();
|
||||
maxDistanceMap.put(vehicle,12d);
|
||||
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
MaxDistanceConstraint maxDistanceConstraint =
|
||||
new MaxDistanceConstraint(stateManager, traveledDistanceId, new TransportDistance() {
|
||||
@Override
|
||||
public double getDistance(Location from, Location to, double departureTime, Vehicle vehicle) {
|
||||
return vrp.getTransportCosts().getTransportTime(from,to,departureTime, null, vehicle);
|
||||
}
|
||||
},maxDistanceMap);
|
||||
Assert.assertTrue(maxDistanceConstraint.fulfilled(context,
|
||||
new Start(vehicle.getStartLocation(), 0, Double.MAX_VALUE),
|
||||
vrp.getActivities(shipment).get(0),
|
||||
new End(vehicle.getEndLocation(), 0, Double.MAX_VALUE),
|
||||
0).equals(HardActivityConstraint.ConstraintsStatus.FULFILLED));
|
||||
|
||||
ActivityContext pickupContext = new ActivityContext();
|
||||
pickupContext.setArrivalTime(3);
|
||||
pickupContext.setEndTime(3);
|
||||
pickupContext.setInsertionIndex(0);
|
||||
context.setRelatedActivityContext(pickupContext);
|
||||
Assert.assertTrue(maxDistanceConstraint.fulfilled(context,
|
||||
vrp.getActivities(shipment).get(0),
|
||||
vrp.getActivities(shipment).get(1),
|
||||
new End(vehicle.getEndLocation(), 0, Double.MAX_VALUE),
|
||||
3).equals(HardActivityConstraint.ConstraintsStatus.FULFILLED));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenAddingDeliverShipmentWithVehDiffStartEndLocs_constraintShouldWork() {
|
||||
Shipment shipment = Shipment.Builder.newInstance("s")
|
||||
.setPickupLocation(Location.newInstance(0, 1))
|
||||
.setDeliveryLocation(Location.newInstance(4, 1))
|
||||
.build();
|
||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v")
|
||||
.setStartLocation(Location.newInstance(0, 0))
|
||||
.setEndLocation(Location.newInstance(0, 4))
|
||||
.build();
|
||||
final VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance()
|
||||
.addJob(shipment)
|
||||
.addVehicle(vehicle)
|
||||
.build();
|
||||
VehicleRoute route = VehicleRoute.emptyRoute();
|
||||
JobInsertionContext context = new JobInsertionContext(route, shipment, vehicle, null, 0);
|
||||
context.getAssociatedActivities().add(vrp.getActivities(shipment).get(0));
|
||||
context.getAssociatedActivities().add(vrp.getActivities(shipment).get(1));
|
||||
maxDistanceMap = new HashMap<>();
|
||||
maxDistanceMap.put(vehicle,10d);
|
||||
|
||||
StateManager stateManager = new StateManager(vrp);
|
||||
MaxDistanceConstraint maxDistanceConstraint =
|
||||
new MaxDistanceConstraint(stateManager, traveledDistanceId, new TransportDistance() {
|
||||
@Override
|
||||
public double getDistance(Location from, Location to, double departureTime, Vehicle vehicle) {
|
||||
return vrp.getTransportCosts().getTransportTime(from,to,departureTime, null, vehicle);
|
||||
}
|
||||
},maxDistanceMap);
|
||||
Assert.assertTrue(maxDistanceConstraint.fulfilled(context,
|
||||
new Start(vehicle.getStartLocation(), 0, Double.MAX_VALUE),
|
||||
vrp.getActivities(shipment).get(0),
|
||||
new End(vehicle.getEndLocation(), 0, Double.MAX_VALUE),
|
||||
0).equals(HardActivityConstraint.ConstraintsStatus.FULFILLED));
|
||||
|
||||
ActivityContext pickupContext = new ActivityContext();
|
||||
pickupContext.setArrivalTime(1);
|
||||
pickupContext.setEndTime(1);
|
||||
pickupContext.setInsertionIndex(0);
|
||||
context.setRelatedActivityContext(pickupContext);
|
||||
Assert.assertTrue(maxDistanceConstraint.fulfilled(context,
|
||||
vrp.getActivities(shipment).get(0),
|
||||
vrp.getActivities(shipment).get(1),
|
||||
new End(vehicle.getEndLocation(), 0, Double.MAX_VALUE),
|
||||
1).equals(HardActivityConstraint.ConstraintsStatus.FULFILLED));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue