@Override public double getStopStopTime(Id<TransitStopFacility> stopOId, Id<TransitStopFacility> stopDId, double time) { // ATTENTION! This could be optimized. Basically, we probably don't need to // route here. However, finding the travel time even on one route is not a // computationally efficient task, because the same transit stop id may occur // multiple times on the same route. TransitStopFacility originFacility = schedule.getFacilities().get(stopOId); TransitStopFacility destinationFacility = schedule.getFacilities().get(stopDId); List<Leg> legs = transitRouter.calcRoute(originFacility, destinationFacility, time, null); return legs.stream().mapToDouble(l -> l.getTravelTime()).sum(); }
/** * Just links to {@link TransitRouter#calcRoute(Facility, Facility, double, Person)}. * * @return the list of legs returned by the transit router. */ @Override public List<? extends PlanElement> calcRoute( final Facility fromFacility, final Facility toFacility, final double departureTime, final Person person) { List<Leg> baseTrip = router.calcRoute( fromFacility, toFacility, departureTime, person); // the previous approach was to return null when no trip was found and // not to replace the trip if so. // However, this makes the output of routing modules more tricky to handle. // Thus, every module should return a valid trip. When available, the "main // mode" flag should be put to the mode of the routing module. return baseTrip != null ? fillWithActivities(baseTrip, fromFacility, toFacility, departureTime, person) : walkRouter.calcRoute(fromFacility, toFacility, departureTime, person); }
/** * Tests that if only a single transfer-/walk-link is found, the router correctly only returns * on walk leg from start to end. */ @Test public void testSingleWalkOnly() { WalkFixture f = new WalkFixture(); f.routerConfig.setSearchRadius(0.8 * CoordUtils.calcEuclideanDistance(f.coord2, f.coord4)); f.routerConfig.setExtensionRadius(0.0); TransitRouter router = createTransitRouter(f.schedule, f.routerConfig, routerType); List<Leg> legs = router.calcRoute(new FakeFacility(f.coord2), new FakeFacility(f.coord4), 990, null); assertEquals(1, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); }
/** * Tests that if only exactly two transfer-/walk-link are found, the router correctly only returns * on walk leg from start to end. Differs from {@link #testSingleWalkOnly()} in that it tests for * the correct internal working when more than one walk links are returned. */ @Test public void testDoubleWalkOnly() { WalkFixture f = new WalkFixture(); f.routerConfig.setSearchRadius(0.8 * CoordUtils.calcEuclideanDistance(f.coord2, f.coord4)); f.routerConfig.setExtensionRadius(0.0); TransitRouter router = createTransitRouter(f.schedule, f.routerConfig, routerType); List<Leg> legs = router.calcRoute(new FakeFacility(f.coord2), new FakeFacility(f.coord6), 990, null); assertEquals(1, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); }
/** * In rare cases, Dijkstra may choose to go along two walk links to get from one location to another. * Test, that still only one walk leg with the correct start and end points/links is returned. */ @Test public void testDoubleWalk() { WalkFixture f = new WalkFixture(); f.routerConfig.setMarginalUtilityOfTravelTimePt_utl_s(-1.0 / 3600.0 - 6.0/3600.0); f.routerConfig.setUtilityOfLineSwitch_utl(0.2); // must be relatively low in this example, otherwise it's cheaper to walk the whole distance... TransitRouter router = createTransitRouter(f.schedule, f.routerConfig, routerType); List<Leg> legs = router.calcRoute(new FakeFacility(f.coord1), new FakeFacility(f.coord7), 990, null); assertEquals(5, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); assertEquals(TransportMode.pt, legs.get(1).getMode()); assertEquals(f.stop1.getId(), ((ExperimentalTransitRoute) legs.get(1).getRoute()).getAccessStopId()); assertEquals(f.stop2.getId(), ((ExperimentalTransitRoute) legs.get(1).getRoute()).getEgressStopId()); assertEquals(f.stop1.getLinkId(), legs.get(1).getRoute().getStartLinkId()); assertEquals(f.stop2.getLinkId(), legs.get(1).getRoute().getEndLinkId()); assertEquals(TransportMode.transit_walk, legs.get(2).getMode()); assertEquals(TransportMode.pt, legs.get(3).getMode()); assertEquals(f.stop2.getLinkId(), legs.get(2).getRoute().getStartLinkId()); assertEquals(f.stop6.getLinkId(), legs.get(2).getRoute().getEndLinkId()); assertEquals(f.stop6.getId(), ((ExperimentalTransitRoute) legs.get(3).getRoute()).getAccessStopId()); assertEquals(f.stop7.getId(), ((ExperimentalTransitRoute) legs.get(3).getRoute()).getEgressStopId()); assertEquals(f.stop6.getLinkId(), legs.get(3).getRoute().getStartLinkId()); assertEquals(f.stop7.getLinkId(), legs.get(3).getRoute().getEndLinkId()); assertEquals(TransportMode.transit_walk, legs.get(4).getMode()); }
@Test public void testFromToSameStop() { Fixture f = new Fixture(); f.init(); TransitRouterConfig trConfig = new TransitRouterConfig(f.scenario.getConfig()); TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); Coord fromCoord = new Coord((double) 3800, (double) 5100); Coord toCoord = new Coord((double) 4100, (double) 5050); List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 5.0*3600, null); assertEquals(1, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); double actualTravelTime = 0.0; for (Leg leg : legs) { actualTravelTime += leg.getTravelTime(); } double expectedTravelTime = CoordUtils.calcEuclideanDistance(fromCoord, toCoord) / trConfig.getBeelineWalkSpeed(); assertEquals(expectedTravelTime, actualTravelTime, MatsimTestCase.EPSILON); }
@Test public void testTransferWalkDistance(){ Fixture f = new Fixture(); f.init(); TransitRouterConfig config = new TransitRouterConfig(f.scenario.getConfig().planCalcScore(), f.scenario.getConfig().plansCalcRoute(), f.scenario.getConfig().transitRouter(), f.scenario.getConfig().vspExperimental()); TransitRouter router = createTransitRouter(f.schedule, config, routerType); Coord fromCoord = new Coord((double) 3800, (double) 5100); Coord toCoord = new Coord((double) 16100, (double) 10050); List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 6.0*3600, null); Leg leg1 = legs.get(1); ExperimentalTransitRoute route1 = (ExperimentalTransitRoute) leg1.getRoute(); Coord coord1 = f.schedule.getFacilities().get(route1.getEgressStopId()).getCoord(); Leg leg3 = legs.get(3); ExperimentalTransitRoute route3 = (ExperimentalTransitRoute) leg3.getRoute(); Coord coord3 = f.schedule.getFacilities().get(route3.getAccessStopId()).getCoord(); double beelineFactor = f.scenario.getConfig().plansCalcRoute().getModeRoutingParams().get(TransportMode.walk).getBeelineDistanceFactor(); assertEquals(CoordUtils.calcEuclideanDistance(coord1, coord3) * beelineFactor, legs.get(2).getRoute().getDistance(), MatsimTestCase.EPSILON); }
trConfig.setUtilityOfLineSwitch_utl(0); TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); List<Leg> legs = router.calcRoute(new FakeFacility(new Coord((double) 11900, (double) 5100)), new FakeFacility(new Coord((double) 24100, (double) 4950)), 6.0*3600 - 5.0*60, null); assertEquals(5, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); legs = router.calcRoute(new FakeFacility(new Coord((double) 11900, (double) 5100)), new FakeFacility(new Coord((double) 24100, (double) 4950)), 6.0*3600 - 5.0*60, null); assertEquals(3, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode());
assertEquals(0, trConfig.getAdditionalTransferTime(), 1e-8); TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); List<Leg> legs = router.calcRoute(new FakeFacility(new Coord((double) 11900, (double) 5100)), new FakeFacility(new Coord((double) 24100, (double) 4950)), 6.0*3600 - 5.0*60, null); assertEquals(5, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); legs = router.calcRoute(new FakeFacility(new Coord((double) 11900, (double) 5100)), new FakeFacility(new Coord((double) 24100, (double) 4950)), 6.0*3600 - 5.0*60, null); assertEquals(3, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode());
@Test public void testSingleLine() { Fixture f = new Fixture(); f.init(); TransitRouterConfig trConfig = new TransitRouterConfig(f.scenario.getConfig()); TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); Coord fromCoord = new Coord(3800, 5100); Coord toCoord = new Coord(16100, 5050); List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 5.0*3600, null); assertEquals(3, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); assertEquals(TransportMode.pt, legs.get(1).getMode()); assertEquals(TransportMode.transit_walk, legs.get(2).getMode()); assertTrue("expected TransitRoute in leg.", legs.get(1).getRoute() instanceof ExperimentalTransitRoute); ExperimentalTransitRoute ptRoute = (ExperimentalTransitRoute) legs.get(1).getRoute(); assertEquals(Id.create("0", TransitStopFacility.class), ptRoute.getAccessStopId()); assertEquals(Id.create("6", TransitStopFacility.class), ptRoute.getEgressStopId()); assertEquals(f.blueLine.getId(), ptRoute.getLineId()); assertEquals(Id.create("blue A > I", TransitRoute.class), ptRoute.getRouteId()); double actualTravelTime = 0.0; for (Leg leg : legs) { actualTravelTime += leg.getTravelTime(); } double expectedTravelTime = 29.0 * 60 + // agent takes the *:06 course, arriving in D at *:29 CoordUtils.calcEuclideanDistance(f.schedule.getFacilities().get(Id.create("6", TransitStopFacility.class)).getCoord(), toCoord) / trConfig.getBeelineWalkSpeed(); assertEquals(expectedTravelTime, actualTravelTime, MatsimTestCase.EPSILON); }
Coord fromCoord = f.fromFacility.getCoord(); Coord toCoord = f.toFacility.getCoord(); List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 7.0*3600 + 50*60, null); double legDuration = calcTripDuration(new ArrayList<PlanElement>(legs)); Assert.assertEquals(5, legs.size()); Coord fromCoord = f.fromFacility.getCoord(); Coord toCoord = f.toFacility.getCoord(); List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 7.0*3600 + 50*60, null); double legDuration = calcTripDuration(new ArrayList<PlanElement>(legs)); Assert.assertEquals(5, legs.size()); Coord fromCoord = f.fromFacility.getCoord(); Coord toCoord = f.toFacility.getCoord(); List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 7.0*3600 + 50*60, null); double legDuration = calcTripDuration(new ArrayList<PlanElement>(legs)); Assert.assertEquals(1, legs.size());
@Test public void testCoordFarAway() { Fixture f = new Fixture(); f.init(); final TransitRouterConfig trConfig = new TransitRouterConfig(f.scenario.getConfig().planCalcScore(), f.scenario.getConfig().plansCalcRoute(), f.scenario.getConfig().transitRouter(), f.scenario.getConfig().vspExperimental() ); TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); double x = +42000; double x1 = -2000; List<Leg> legs = router.calcRoute(new FakeFacility(new Coord(x1, (double) 0)), new FakeFacility(new Coord(x, (double) 0)), 5.5*3600, null); // should map to stops A and I assertEquals(3, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); assertEquals(TransportMode.pt, legs.get(1).getMode()); assertEquals(TransportMode.transit_walk, legs.get(2).getMode()); assertTrue("expected TransitRoute in leg.", legs.get(1).getRoute() instanceof ExperimentalTransitRoute); ExperimentalTransitRoute ptRoute = (ExperimentalTransitRoute) legs.get(1).getRoute(); assertEquals(Id.create("0", TransitStopFacility.class), ptRoute.getAccessStopId()); assertEquals(Id.create("16", TransitStopFacility.class), ptRoute.getEgressStopId()); assertEquals(f.blueLine.getId(), ptRoute.getLineId()); assertEquals(Id.create("blue A > I", TransitRoute.class), ptRoute.getRouteId()); }
@Test public void testDirectWalkCheaper() { Fixture f = new Fixture(); f.init(); TransitRouterConfig trConfig = new TransitRouterConfig(f.scenario.getConfig().planCalcScore(), f.scenario.getConfig().plansCalcRoute(), f.scenario.getConfig().transitRouter(), f.scenario.getConfig().vspExperimental()); TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); Coord fromCoord = new Coord((double) 4000, (double) 3000); Coord toCoord = new Coord((double) 8000, (double) 3000); List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 5.0*3600, null); assertEquals(1, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); double actualTravelTime = 0.0; for (Leg leg : legs) { actualTravelTime += leg.getTravelTime(); } double expectedTravelTime = CoordUtils.calcEuclideanDistance(fromCoord, toCoord) / trConfig.getBeelineWalkSpeed(); assertEquals(expectedTravelTime, actualTravelTime, MatsimTestCase.EPSILON); }
@Test public void testAfterMidnight() { Fixture f = new Fixture(); f.init(); TransitRouterConfig trConfig = new TransitRouterConfig(f.scenario.getConfig().planCalcScore(), f.scenario.getConfig().plansCalcRoute(), f.scenario.getConfig().transitRouter(), f.scenario.getConfig().vspExperimental()); trConfig.setBeelineWalkSpeed(0.1); // something very slow, so the agent does not walk over night TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); Coord toCoord = new Coord((double) 16100, (double) 5050); List<Leg> legs = router.calcRoute(new FakeFacility(new Coord((double) 3800, (double) 5100)), new FakeFacility(toCoord), 25.0*3600, null); assertEquals(3, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode()); assertEquals(TransportMode.pt, legs.get(1).getMode()); assertEquals(TransportMode.transit_walk, legs.get(2).getMode()); assertTrue("expected TransitRoute in leg.", legs.get(1).getRoute() instanceof ExperimentalTransitRoute); ExperimentalTransitRoute ptRoute = (ExperimentalTransitRoute) legs.get(1).getRoute(); assertEquals(Id.create("0", TransitStopFacility.class), ptRoute.getAccessStopId()); assertEquals(Id.create("6", TransitStopFacility.class), ptRoute.getEgressStopId()); assertEquals(f.blueLine.getId(), ptRoute.getLineId()); assertEquals(Id.create("blue A > I", TransitRoute.class), ptRoute.getRouteId()); double actualTravelTime = 0.0; for (Leg leg : legs) { actualTravelTime += leg.getTravelTime(); } double expectedTravelTime = 4*3600 + 29.0 * 60 + // arrival at 05:29 at D CoordUtils.calcEuclideanDistance(f.schedule.getFacilities().get(Id.create("6", TransitStopFacility.class)).getCoord(), toCoord) / trConfig.getBeelineWalkSpeed(); assertEquals(expectedTravelTime, actualTravelTime, MatsimTestCase.EPSILON); }
TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); Coord toCoord = new Coord((double) 16100, (double) 10050); List<Leg> legs = router.calcRoute(new FakeFacility(new Coord((double) 3800, (double) 5100)), new FakeFacility(toCoord), 6.0*3600, null); assertEquals(5, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode());
TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); Coord toCoord = new Coord((double) 28100, (double) 4950); List<Leg> legs = router.calcRoute(new FakeFacility( new Coord((double) 3800, (double) 5100)), new FakeFacility(toCoord), 5.0*3600 + 40.0*60, null); assertEquals(4, legs.size()); assertEquals(TransportMode.transit_walk, legs.get(0).getMode());
@Test public void testSingleLine_DifferentWaitingTime() { Fixture f = new Fixture(); f.init(); TransitRouterConfig trConfig = new TransitRouterConfig(f.scenario.getConfig().planCalcScore(), f.scenario.getConfig().plansCalcRoute(), f.scenario.getConfig().transitRouter(), f.scenario.getConfig().vspExperimental()); TransitRouter router = createTransitRouter(f.schedule, trConfig, routerType); Coord fromCoord = new Coord((double) 4000, (double) 5002); Coord toCoord = new Coord((double) 8000, (double) 5002); double inVehicleTime = 7.0*60; // travel time from A to B for (int min = 0; min < 30; min += 3) { List<Leg> legs = router.calcRoute(new FakeFacility(fromCoord), new FakeFacility(toCoord), 5.0*3600 + min*60, null); assertEquals(3, legs.size()); // walk-pt-walk double actualTravelTime = 0.0; for (Leg leg : legs) { actualTravelTime += leg.getTravelTime(); } double waitingTime = ((46 - min) % 20) * 60; // departures at *:06 and *:26 and *:46 assertEquals("expected different waiting time at 05:"+min, waitingTime, actualTravelTime - inVehicleTime, MatsimTestCase.EPSILON); } }