diff --git a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java b/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java index 42a041c8..c69ef325 100644 --- a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java +++ b/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java @@ -3,24 +3,65 @@ package algorithms; import java.util.ArrayList; import java.util.Collection; +import algorithms.ConstraintManager.Priority; import basics.route.TourActivity; class HardActivityLevelConstraintManager implements HardActivityStateLevelConstraint { - private Collection hardConstraints = new ArrayList(); + private Collection criticalConstraints = new ArrayList(); - public void addConstraint(HardActivityStateLevelConstraint constraint){ - hardConstraints.add(constraint); + private Collection highPrioConstraints = new ArrayList(); + + private Collection lowPrioConstraints = new ArrayList(); + + public void addConstraint(HardActivityStateLevelConstraint constraint, Priority priority){ + if(priority.equals(Priority.CRITICAL)){ + criticalConstraints.add(constraint); + } + else if(priority.equals(Priority.HIGH)){ + highPrioConstraints.add(constraint); + } + else{ + lowPrioConstraints.add(constraint); + } } @Override public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { - for(HardActivityStateLevelConstraint constraint : hardConstraints){ + ConstraintsStatus notFulfilled = null; + for(HardActivityStateLevelConstraint c : criticalConstraints){ + ConstraintsStatus status = c.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime); + if(status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK)){ + return status; + } + else{ + if(status.equals(ConstraintsStatus.NOT_FULFILLED)){ + notFulfilled = status; + } + } + } + if(notFulfilled != null) return notFulfilled; + + for(HardActivityStateLevelConstraint c : highPrioConstraints){ + ConstraintsStatus status = c.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime); + if(status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK)){ + return status; + } + else{ + if(status.equals(ConstraintsStatus.NOT_FULFILLED)){ + notFulfilled = status; + } + } + } + if(notFulfilled != null) return notFulfilled; + + for(HardActivityStateLevelConstraint constraint : lowPrioConstraints){ ConstraintsStatus status = constraint.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime); if(status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK) || status.equals(ConstraintsStatus.NOT_FULFILLED)){ return status; } } + return ConstraintsStatus.FULFILLED; } diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryShipmentActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryShipmentActivityLevelConstraint.java deleted file mode 100644 index d96c1e37..00000000 --- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryShipmentActivityLevelConstraint.java +++ /dev/null @@ -1,76 +0,0 @@ -package algorithms; - -import org.apache.log4j.Logger; - -import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus; -import basics.route.DeliverShipment; -import basics.route.PickupShipment; -import basics.route.Start; -import basics.route.TourActivity; - -public class HardPickupAndDeliveryShipmentActivityLevelConstraint implements HardActivityStateLevelConstraint { - - private static Logger logger = Logger.getLogger(HardPickupAndDeliveryShipmentActivityLevelConstraint.class); - - private StateManager stateManager; - - private boolean backhaul = false; - - public HardPickupAndDeliveryShipmentActivityLevelConstraint(StateManager stateManager) { - super(); - this.stateManager = stateManager; - } - - public HardPickupAndDeliveryShipmentActivityLevelConstraint(StateManager stateManager, boolean backhaul) { - super(); - this.stateManager = stateManager; - this.backhaul = backhaul; - } - - @Override - public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { -// logger.info(prevAct + " - " + newAct + " - " + nextAct); - if(!(newAct instanceof PickupShipment) && !(newAct instanceof DeliverShipment)){ - return ConstraintsStatus.FULFILLED; - } - if(backhaul){ - if(newAct instanceof PickupShipment && prevAct instanceof DeliverShipment){ -// logger.info("NOT_FULFILLED_BREAK"); - return ConstraintsStatus.NOT_FULFILLED_BREAK; } - if(newAct instanceof DeliverShipment && nextAct instanceof PickupShipment){ -// logger.info("NOT_FULFILLED"); - return ConstraintsStatus.NOT_FULFILLED; } - } - int loadAtPrevAct; -// int futurePicks; -// int pastDeliveries; - - if(prevAct instanceof Start){ - loadAtPrevAct = (int)stateManager.getRouteState(iFacts.getRoute(), StateFactory.LOAD_AT_BEGINNING).toDouble(); -// futurePicks = (int)stateManager.getRouteState(iFacts.getRoute(), StateTypes.LOAD).toDouble(); -// pastDeliveries = 0; - } - else{ - loadAtPrevAct = (int) stateManager.getActivityState(prevAct, StateFactory.LOAD).toDouble(); -// futurePicks = (int) stateManager.getActivityState(prevAct, StateTypes.FUTURE_PICKS).toDouble(); -// pastDeliveries = (int) stateManager.getActivityState(prevAct, StateTypes.PAST_DELIVERIES).toDouble(); - } - if(newAct instanceof PickupShipment){ - if(loadAtPrevAct + newAct.getCapacityDemand() > iFacts.getNewVehicle().getCapacity()){ -// logger.info("NOT_FULFILLED"); - return ConstraintsStatus.NOT_FULFILLED; - } - } - if(newAct instanceof DeliverShipment){ - if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) > iFacts.getNewVehicle().getCapacity()){ -// logger.info("NOT_FULFILLED_BREAK"); - return ConstraintsStatus.NOT_FULFILLED_BREAK; - } - - } -// logger.info("FULFILLED"); - return ConstraintsStatus.FULFILLED; - } - - -} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/PickupAndDeliverShipmentLoadActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/PickupAndDeliverShipmentLoadActivityLevelConstraint.java new file mode 100644 index 00000000..60c7ac8b --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/PickupAndDeliverShipmentLoadActivityLevelConstraint.java @@ -0,0 +1,66 @@ +package algorithms; + +import org.apache.log4j.Logger; + +import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus; +import basics.route.DeliverShipment; +import basics.route.PickupShipment; +import basics.route.Start; +import basics.route.TourActivity; + +/** + * Constraint that ensures capacity constraint at each activity. + * + *

This is critical to consistently calculate pd-problems with capacity constraints. Critical means + * that is MUST be visited. It also assumes that pd-activities are visited in the order they occur in a tour. + * + * @author schroeder + * + */ +public class PickupAndDeliverShipmentLoadActivityLevelConstraint implements HardActivityStateLevelConstraint { + + private static Logger logger = Logger.getLogger(PickupAndDeliverShipmentLoadActivityLevelConstraint.class); + + private StateManager stateManager; + + /** + * Constructs the constraint ensuring capacity constraint at each activity. + * + *

This is critical to consistently calculate pd-problems with capacity constraints. Critical means + * that is MUST be visited. It also assumes that pd-activities are visited in the order they occur in a tour. + * + * + * @param stateManager + */ + public PickupAndDeliverShipmentLoadActivityLevelConstraint(StateManager stateManager) { + super(); + this.stateManager = stateManager; + } + + @Override + public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + if(!(newAct instanceof PickupShipment) && !(newAct instanceof DeliverShipment)){ + return ConstraintsStatus.FULFILLED; + } + int loadAtPrevAct; + if(prevAct instanceof Start){ + loadAtPrevAct = (int)stateManager.getRouteState(iFacts.getRoute(), StateFactory.LOAD_AT_BEGINNING).toDouble(); + } + else{ + loadAtPrevAct = (int) stateManager.getActivityState(prevAct, StateFactory.LOAD).toDouble(); + } + if(newAct instanceof PickupShipment){ + if(loadAtPrevAct + newAct.getCapacityDemand() > iFacts.getNewVehicle().getCapacity()){ + return ConstraintsStatus.NOT_FULFILLED; + } + } + if(newAct instanceof DeliverShipment){ + if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) > iFacts.getNewVehicle().getCapacity()){ + return ConstraintsStatus.NOT_FULFILLED_BREAK; + } + } + return ConstraintsStatus.FULFILLED; + } + + +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java index 73a9f085..5ce70594 100644 --- a/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java +++ b/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java @@ -1,7 +1,7 @@ package algorithms; -import basics.route.DeliveryActivity; -import basics.route.PickupActivity; +import basics.route.DeliverService; +import basics.route.PickupService; import basics.route.ServiceActivity; import basics.route.Start; import basics.route.TourActivity; @@ -39,12 +39,12 @@ class ServiceLoadActivityLevelConstraint implements HardActivityStateLevelConstr futurePicks = (int) stateManager.getActivityState(prevAct, StateFactory.FUTURE_PICKS).toDouble(); pastDeliveries = (int) stateManager.getActivityState(prevAct, StateFactory.PAST_DELIVERIES).toDouble(); } - if(newAct instanceof PickupActivity || newAct instanceof ServiceActivity){ + if(newAct instanceof PickupService || newAct instanceof ServiceActivity){ if(loadAtPrevAct + newAct.getCapacityDemand() + futurePicks > iFacts.getNewVehicle().getCapacity()){ return ConstraintsStatus.NOT_FULFILLED; } } - if(newAct instanceof DeliveryActivity){ + if(newAct instanceof DeliverService){ if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) + pastDeliveries > iFacts.getNewVehicle().getCapacity()){ return ConstraintsStatus.NOT_FULFILLED; } diff --git a/jsprit-core/src/main/java/algorithms/ShipmentPickupsFirstConstraint.java b/jsprit-core/src/main/java/algorithms/ShipmentPickupsFirstConstraint.java new file mode 100644 index 00000000..971f3e27 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/ShipmentPickupsFirstConstraint.java @@ -0,0 +1,16 @@ +package algorithms; + +import basics.route.DeliverShipment; +import basics.route.PickupShipment; +import basics.route.TourActivity; + +public class ShipmentPickupsFirstConstraint implements HardActivityStateLevelConstraint { + + @Override + public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { + if(newAct instanceof DeliverShipment && nextAct instanceof PickupShipment){ return ConstraintsStatus.NOT_FULFILLED; } + if(newAct instanceof PickupShipment && prevAct instanceof DeliverShipment){ return ConstraintsStatus.NOT_FULFILLED_BREAK; } + return ConstraintsStatus.FULFILLED; + } + +} \ No newline at end of file diff --git a/jsprit-core/src/main/java/algorithms/UpdateFuturePickups.java b/jsprit-core/src/main/java/algorithms/UpdateFuturePickups.java index 7ebcfd8e..fa3d0850 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateFuturePickups.java +++ b/jsprit-core/src/main/java/algorithms/UpdateFuturePickups.java @@ -1,6 +1,6 @@ package algorithms; -import basics.route.PickupActivity; +import basics.route.PickupService; import basics.route.ReverseActivityVisitor; import basics.route.ServiceActivity; import basics.route.TourActivity; @@ -24,7 +24,7 @@ class UpdateFuturePickups implements ReverseActivityVisitor, StateUpdater { @Override public void visit(TourActivity act) { stateManager.putActivityState(act, StateFactory.FUTURE_PICKS, StateFactory.createState(futurePicks)); - if(act instanceof PickupActivity || act instanceof ServiceActivity){ + if(act instanceof PickupService || act instanceof ServiceActivity){ futurePicks += act.getCapacityDemand(); } assert futurePicks <= route.getVehicle().getCapacity() : "sum of pickups must not be > vehicleCap"; diff --git a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveries.java b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveries.java index a2cf8237..d4022c4f 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveries.java +++ b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveries.java @@ -1,7 +1,7 @@ package algorithms; import basics.route.ActivityVisitor; -import basics.route.DeliveryActivity; +import basics.route.DeliverService; import basics.route.TourActivity; import basics.route.VehicleRoute; @@ -22,7 +22,7 @@ class UpdateOccuredDeliveries implements ActivityVisitor, StateUpdater { @Override public void visit(TourActivity act) { - if(act instanceof DeliveryActivity){ + if(act instanceof DeliverService){ deliveries += Math.abs(act.getCapacityDemand()); } stateManager.putActivityState(act, StateFactory.PAST_DELIVERIES, StateFactory.createState(deliveries)); diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java index 85ea8752..120104f1 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java +++ b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java @@ -446,16 +446,8 @@ public class VehicleRoutingAlgorithms { */ //constraint manager ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); - constraintManager.addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts())); - - if(vrp.getProblemConstraints().contains(Constraint.DELIVERIES_FIRST)){ - constraintManager.addConstraint(new ServiceBackhaulConstraint()); - } - else{ - constraintManager.addConstraint(new ServiceLoadActivityLevelConstraint(stateManager)); - } - - constraintManager.addConstraint(new ServiceLoadRouteLevelConstraint(stateManager)); + constraintManager.addTimeWindowConstraint(); + constraintManager.addLoadConstraint(); //construct initial solution creator AlgorithmStartsListener createInitialSolution = createInitialSolution(config,vrp,vehicleFleetManager,stateManager,algorithmListeners,definedClasses,executorService,nuOfThreads,constraintManager); @@ -492,24 +484,15 @@ public class VehicleRoutingAlgorithms { /* * define stateUpdates */ - -// stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager)); -// stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager)); -// - - UpdateLoads loadUpdater = new UpdateLoads(stateManager); - stateManager.addListener(loadUpdater); - stateManager.addActivityVisitor(loadUpdater); - +// UpdateLoads loadUpdater = new UpdateLoads(stateManager); +// stateManager.addListener(loadUpdater); +// stateManager.addActivityVisitor(loadUpdater); stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts())); - - stateManager.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); - stateManager.addActivityVisitor(new UpdateOccuredDeliveries(stateManager)); - stateManager.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts())); - stateManager.addActivityVisitor(new UpdateFuturePickups(stateManager)); - +// stateManager.addActivityVisitor(new UpdateOccuredDeliveries(stateManager)); +// stateManager.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts())); +// stateManager.addActivityVisitor(new UpdateFuturePickups(stateManager)); metaAlgorithm.getSearchStrategyManager().addSearchStrategyModuleListener(stateManager); metaAlgorithm.getAlgorithmListeners().addListener(stateManager); diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java index 15154413..0df78be4 100644 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java @@ -23,6 +23,7 @@ import org.junit.Before; import org.junit.Test; import util.Solutions; +import algorithms.ConstraintManager.Priority; import algorithms.StateManager.StateImpl; import algorithms.acceptors.AcceptNewIfBetterThanWorst; import algorithms.selectors.SelectBest; @@ -62,8 +63,8 @@ public class BuildPDVRPAlgoFromScratchTest { final StateManager stateManager = new StateManager(); ConstraintManager actLevelConstraintAccumulator = new ConstraintManager(vrp,stateManager); - actLevelConstraintAccumulator.addConstraint(new ServiceLoadActivityLevelConstraint(stateManager)); - actLevelConstraintAccumulator.addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts())); + actLevelConstraintAccumulator.addConstraint(new ServiceLoadActivityLevelConstraint(stateManager),Priority.LOW); + actLevelConstraintAccumulator.addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts()),Priority.HIGH); ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts()); diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java index 353ed0ba..a13ee633 100644 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPWithShipmentsAlgoFromScratchTest.java @@ -80,7 +80,7 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest { ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); constraintManager.addTimeWindowConstraint(); constraintManager.addLoadConstraint(); - constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager,true)); +// constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager)); ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts()); @@ -176,7 +176,7 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest { // System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size()); vra.addInitialSolution(iniSolution); - vra.setNuOfIterations(1000); + vra.setNuOfIterations(100); // vra.setPrematureBreak(500); } diff --git a/jsprit-core/src/test/java/algorithms/HardPickupAndDeliveryShipmentActivityConstraintTest.java b/jsprit-core/src/test/java/algorithms/HardPickupAndDeliveryShipmentActivityConstraintTest.java index 75982219..9c5d86c6 100644 --- a/jsprit-core/src/test/java/algorithms/HardPickupAndDeliveryShipmentActivityConstraintTest.java +++ b/jsprit-core/src/test/java/algorithms/HardPickupAndDeliveryShipmentActivityConstraintTest.java @@ -23,7 +23,7 @@ public class HardPickupAndDeliveryShipmentActivityConstraintTest { Shipment shipment; - HardPickupAndDeliveryShipmentActivityLevelConstraint constraint; + PickupAndDeliverShipmentLoadActivityLevelConstraint constraint; InsertionContext iFacts; @@ -35,7 +35,7 @@ public class HardPickupAndDeliveryShipmentActivityConstraintTest { shipment = mock(Shipment.class); when(shipment.getCapacityDemand()).thenReturn(1); iFacts = new InsertionContext(null, null, vehicle, null, 0.0); - constraint = new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager); + constraint = new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager); } @Test diff --git a/jsprit-core/src/test/java/algorithms/ShipmentInsertionCalculatorTest.java b/jsprit-core/src/test/java/algorithms/ShipmentInsertionCalculatorTest.java index ff0ffb07..a683a577 100644 --- a/jsprit-core/src/test/java/algorithms/ShipmentInsertionCalculatorTest.java +++ b/jsprit-core/src/test/java/algorithms/ShipmentInsertionCalculatorTest.java @@ -12,6 +12,7 @@ import org.junit.Test; import util.Coordinate; import util.Locations; import util.ManhattanCosts; +import algorithms.ConstraintManager.Priority; import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus; import basics.Shipment; import basics.VehicleRoutingProblem; @@ -188,8 +189,9 @@ public class ShipmentInsertionCalculatorTest { VehicleRoutingProblem vrp = mock(VehicleRoutingProblem.class); ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); - - constraintManager.addConstraint(new HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager,true)); + constraintManager.addConstraint(new PickupAndDeliverShipmentLoadActivityLevelConstraint(stateManager),Priority.CRITICAL); + constraintManager.addConstraint(new ShipmentPickupsFirstConstraint(),Priority.CRITICAL); + ShipmentInsertionCalculator insertionCalculator = new ShipmentInsertionCalculator(routingCosts, activityInsertionCostsCalculator, hardRouteLevelConstraint, constraintManager); diff --git a/jsprit-core/src/test/resources/pdp_sol.xml b/jsprit-core/src/test/resources/pdp_sol.xml index 29b1096f..3ed7bcdb 100644 --- a/jsprit-core/src/test/resources/pdp_sol.xml +++ b/jsprit-core/src/test/resources/pdp_sol.xml @@ -2534,318 +2534,104 @@ - 828.9368669428338 + 828.936866942834 - 50.80359030264955 + 95.94313062205805 noDriver solomonVehicle 0.0 - 24 + 98 0.0 0.0 - 20 + 94 0.0 0.0 - 28 + 97 0.0 0.0 - 26 + 95 0.0 0.0 - 29 + 100 0.0 0.0 - 23 + 99 0.0 0.0 - 30 + 96 0.0 0.0 - 22 + 93 0.0 0.0 - 25 - 0.0 - 0.0 - - - 27 - 0.0 - 0.0 - - - 21 + 92 0.0 0.0 - 20 - 10.0 - 10.0 - - - 24 - 15.0 - 65.0 - - - 25 - 67.0 - 169.0 - - - 27 - 171.0 - 261.0 - - - 29 - 264.605551275464 - 358.0 - - - 30 - 363.0 - 449.0 - - - 28 - 452.0 - 546.0 - - - 26 - 548.0 - 622.0 - - - 23 - 625.0 - 732.0 - - - 22 - 735.0 - 812.0 - - - 21 - 814.0 - 914.0 - - 924.1980390271856 - - - 95.88470913081827 - noDriver - solomonVehicle - 0.0 - - 16 - 0.0 - 0.0 - - - 19 - 0.0 - 0.0 - - - 12 - 0.0 - 0.0 - - - 15 - 0.0 - 0.0 - - - 17 - 0.0 - 0.0 - - - 13 - 0.0 - 0.0 - - - 18 - 0.0 - 0.0 - - - 14 - 0.0 - 0.0 - - - 13 + 98 30.805843601498726 30.805843601498726 - 17 - 34.80584360149872 - 99.0 + 96 + 36.19100840863323 + 95.0 - 18 - 102.0 - 179.0 + 95 + 97.0 + 196.0 - 19 - 184.0 - 278.0 + 94 + 199.605551275464 + 285.0 - 15 - 283.0 - 384.0 + 92 + 288.605551275464 + 368.0 - 16 - 389.0 + 93 + 370.0 475.0 - 14 - 477.0 - 567.0 + 97 + 480.0 + 561.0 - 12 - 570.0 - 652.0 - - 690.0788655293195 - - - 76.06956532288787 - noDriver - solomonVehicle - 0.0 - - 83 - 0.0 - 0.0 - - - 87 - 0.0 - 0.0 - - - 85 - 0.0 - 0.0 - - - 88 - 0.0 - 0.0 - - - 86 - 0.0 - 0.0 - - - 90 - 0.0 - 0.0 - - - 91 - 0.0 - 0.0 - - - 89 - 0.0 - 0.0 - - - 84 - 0.0 - 0.0 - - - 82 - 0.0 - 0.0 + 100 + 566.0 + 647.0 - 90 - 20.615528128088304 - 20.615528128088304 + 99 + 652.0 + 743.0 - - 87 - 25.615528128088304 - 85.0 - - - 86 - 86.0 - 173.0 - - - 83 - 179.0 - 265.0 - - - 82 - 268.0 - 369.0 - - - 84 - 374.8309518948453 - 458.0 - - - 85 - 460.8284271247462 - 555.0 - - - 88 - 558.0 - 645.0 - - - 89 - 647.8284271247462 - 737.0 - - - 91 - 740.605551275464 - 836.0 - - 858.360679774998 + 776.5410196624969 59.403108723710105 @@ -2857,28 +2643,18 @@ 0.0 0.0 - - 62 - 0.0 - 0.0 - - - 61 - 0.0 - 0.0 - 74 0.0 0.0 - 67 + 62 0.0 0.0 - 64 + 65 0.0 0.0 @@ -2888,12 +2664,12 @@ 0.0 - 72 + 67 0.0 0.0 - 68 + 61 0.0 0.0 @@ -2903,7 +2679,17 @@ 0.0 - 65 + 64 + 0.0 + 0.0 + + + 68 + 0.0 + 0.0 + + + 72 0.0 0.0 @@ -2964,13 +2750,294 @@ 931.8113883008419 + + 95.88470913081827 + noDriver + solomonVehicle + 0.0 + + 17 + 0.0 + 0.0 + + + 12 + 0.0 + 0.0 + + + 14 + 0.0 + 0.0 + + + 15 + 0.0 + 0.0 + + + 18 + 0.0 + 0.0 + + + 19 + 0.0 + 0.0 + + + 13 + 0.0 + 0.0 + + + 16 + 0.0 + 0.0 + + + 13 + 30.805843601498726 + 30.805843601498726 + + + 17 + 34.80584360149872 + 99.0 + + + 18 + 102.0 + 179.0 + + + 19 + 184.0 + 278.0 + + + 15 + 283.0 + 384.0 + + + 16 + 389.0 + 475.0 + + + 14 + 477.0 + 567.0 + + + 12 + 570.0 + 652.0 + + 690.0788655293195 + + + 127.29748041459519 + noDriver + solomonVehicle + 0.0 + + 80 + 0.0 + 0.0 + + + 76 + 0.0 + 0.0 + + + 79 + 0.0 + 0.0 + + + 77 + 0.0 + 0.0 + + + 73 + 0.0 + 0.0 + + + 78 + 0.0 + 0.0 + + + 70 + 0.0 + 0.0 + + + 81 + 0.0 + 0.0 + + + 71 + 0.0 + 0.0 + + + 81 + 47.43416490252569 + 47.43416490252569 + + + 78 + 50.43416490252569 + 109.0 + + + 76 + 111.0 + 203.0 + + + 71 + 208.0 + 293.0 + + + 70 + 298.0 + 387.0 + + + 73 + 390.0 + 478.0 + + + 77 + 482.0 + 574.0 + + + 79 + 575.0 + 668.0 + + + 80 + 673.3851648071345 + 769.0 + + 820.478150704935 + + + 97.2271627850669 + noDriver + solomonVehicle + 0.0 + + 31 + 0.0 + 0.0 + + + 38 + 0.0 + 0.0 + + + 37 + 0.0 + 0.0 + + + 33 + 0.0 + 0.0 + + + 32 + 0.0 + 0.0 + + + 36 + 0.0 + 0.0 + + + 35 + 0.0 + 0.0 + + + 39 + 0.0 + 0.0 + + + 34 + 0.0 + 0.0 + + + 32 + 31.622776601683793 + 31.622776601683793 + + + 33 + 33.622776601683796 + 87.0 + + + 31 + 92.3851648071345 + 200.0 + + + 35 + 205.0 + 283.0 + + + 37 + 288.8309518948453 + 383.0 + + + 38 + 385.0 + 479.0 + + + 39 + 484.0 + 567.0 + + + 36 + 572.0 + 665.0 + + + 34 + 668.0 + 751.0 + + 783.3882694814033 + 101.88256760196126 noDriver solomonVehicle 0.0 - 53 + 56 0.0 0.0 @@ -2984,16 +3051,6 @@ 0.0 0.0 - - 58 - 0.0 - 0.0 - - - 56 - 0.0 - 0.0 - 59 0.0 @@ -3004,11 +3061,21 @@ 0.0 0.0 + + 58 + 0.0 + 0.0 + 60 0.0 0.0 + + 53 + 0.0 + 0.0 + 57 35.0 @@ -3052,131 +3119,111 @@ 686.0570962859163 - 59.618077542105574 + 76.06956532288787 noDriver solomonVehicle 0.0 - 3 + 87 0.0 0.0 - 10 + 86 0.0 0.0 - 75 + 84 0.0 0.0 - 2 + 83 0.0 0.0 - 9 + 90 0.0 0.0 - 11 + 91 0.0 0.0 - 6 + 82 0.0 0.0 - 5 + 85 0.0 0.0 - 7 + 89 0.0 0.0 - 1 - 0.0 - 0.0 - - - 8 - 0.0 - 0.0 - - - 4 + 88 0.0 0.0 - 5 - 15.132745950421556 - 15.132745950421556 + 90 + 20.615528128088304 + 20.615528128088304 - 3 - 16.13274595042156 - 65.0 + 87 + 25.615528128088304 + 85.0 - 7 - 67.0 - 170.0 + 86 + 86.0 + 173.0 - 8 - 172.82842712474618 - 255.0 + 83 + 179.0 + 265.0 - 10 - 258.605551275464 - 357.0 + 82 + 268.0 + 369.0 - 11 - 360.0 - 448.0 + 84 + 374.8309518948453 + 458.0 - 9 - 451.1622776601684 - 534.0 + 85 + 460.8284271247462 + 555.0 - 6 - 536.2360679774998 - 621.0 + 88 + 558.0 + 645.0 - 4 - 623.2360679774998 - 727.0 + 89 + 647.8284271247462 + 737.0 - 2 - 730.605551275464 - 825.0 + 91 + 740.605551275464 + 836.0 - - 1 - 827.0 - 912.0 - - - 75 - 915.0 - 997.0 - - 1012.8113883008419 + 858.360679774998 64.80747449698114 @@ -3184,27 +3231,17 @@ solomonVehicle 0.0 - 42 + 45 0.0 0.0 - 48 + 49 0.0 0.0 - 40 - 0.0 - 0.0 - - - 46 - 0.0 - 0.0 - - - 43 + 47 0.0 0.0 @@ -3214,7 +3251,32 @@ 0.0 - 47 + 46 + 0.0 + 0.0 + + + 44 + 0.0 + 0.0 + + + 43 + 0.0 + 0.0 + + + 42 + 0.0 + 0.0 + + + 40 + 0.0 + 0.0 + + + 52 0.0 0.0 @@ -3229,22 +3291,7 @@ 0.0 - 52 - 0.0 - 0.0 - - - 49 - 0.0 - 0.0 - - - 45 - 0.0 - 0.0 - - - 44 + 48 0.0 0.0 @@ -3316,295 +3363,248 @@ 1072.02775637732 - 127.29748041459519 + 50.80359030264955 noDriver solomonVehicle 0.0 - 78 + 20 0.0 0.0 - 80 + 21 0.0 0.0 - 81 + 23 0.0 0.0 - 70 + 27 0.0 0.0 - 71 + 30 0.0 0.0 - 77 + 25 0.0 0.0 - 76 + 24 0.0 0.0 - 79 + 26 0.0 0.0 - 73 + 28 + 0.0 + 0.0 + + + 29 + 0.0 + 0.0 + + + 22 0.0 0.0 - 81 - 47.43416490252569 - 47.43416490252569 + 20 + 10.0 + 10.0 - 78 - 50.43416490252569 - 109.0 + 24 + 15.0 + 65.0 - 76 - 111.0 - 203.0 + 25 + 67.0 + 169.0 - 71 - 208.0 - 293.0 + 27 + 171.0 + 261.0 - 70 - 298.0 - 387.0 + 29 + 264.605551275464 + 358.0 - 73 - 390.0 - 478.0 + 30 + 363.0 + 449.0 - 77 - 482.0 - 574.0 + 28 + 452.0 + 546.0 - 79 - 575.0 - 668.0 + 26 + 548.0 + 622.0 - 80 - 673.3851648071345 - 769.0 + 23 + 625.0 + 732.0 - 820.478150704935 + + 22 + 735.0 + 812.0 + + + 21 + 814.0 + 914.0 + + 924.1980390271856 - 95.94313062205805 + 59.618077542105574 noDriver solomonVehicle 0.0 - 94 + 8 0.0 0.0 - 100 + 7 0.0 0.0 - 97 + 4 0.0 0.0 - 98 + 2 0.0 0.0 - 93 + 5 0.0 0.0 - 92 + 10 0.0 0.0 - 96 + 3 0.0 0.0 - 95 + 75 0.0 0.0 - 99 - 0.0 - 0.0 - - - 98 - 30.805843601498726 - 30.805843601498726 - - - 96 - 36.19100840863323 - 95.0 - - - 95 - 97.0 - 196.0 - - - 94 - 199.605551275464 - 285.0 - - - 92 - 288.605551275464 - 368.0 - - - 93 - 370.0 - 475.0 - - - 97 - 480.0 - 561.0 - - - 100 - 566.0 - 647.0 - - - 99 - 652.0 - 743.0 - - 776.5410196624969 - - - 97.2271627850669 - noDriver - solomonVehicle - 0.0 - - 34 + 6 0.0 0.0 - 36 + 11 0.0 0.0 - 39 + 1 0.0 0.0 - 38 - 0.0 - 0.0 - - - 33 - 0.0 - 0.0 - - - 35 - 0.0 - 0.0 - - - 32 - 0.0 - 0.0 - - - 37 - 0.0 - 0.0 - - - 31 + 9 0.0 0.0 - 32 - 31.622776601683793 - 31.622776601683793 + 5 + 15.132745950421556 + 15.132745950421556 - 33 - 33.622776601683796 - 87.0 + 3 + 16.13274595042156 + 65.0 - 31 - 92.3851648071345 - 200.0 + 7 + 67.0 + 170.0 - 35 - 205.0 - 283.0 + 8 + 172.82842712474618 + 255.0 - 37 - 288.8309518948453 - 383.0 + 10 + 258.605551275464 + 357.0 - 38 - 385.0 - 479.0 + 11 + 360.0 + 448.0 - 39 - 484.0 - 567.0 + 9 + 451.1622776601684 + 534.0 - 36 - 572.0 - 665.0 + 6 + 536.2360679774998 + 621.0 - 34 - 668.0 - 751.0 + 4 + 623.2360679774998 + 727.0 - 783.3882694814033 + + 2 + 730.605551275464 + 825.0 + + + 1 + 827.0 + 912.0 + + + 75 + 915.0 + 997.0 + + 1012.8113883008419