private void logWarningsIfNecessary(final PlanCalcScoreConfigGroup cnScoringGroup) { if ( wrnCnt < 1 ) { wrnCnt++ ; if ( cnScoringGroup.getModes().get( mode ).getMonetaryDistanceRate() > 0. ) { log.warn("Monetary distance cost rate needs to be NEGATIVE to produce the normal " + "behavior; just found positive. Continuing anyway.") ; } final Set<String> monoSubpopKeyset = Collections.singleton( null ); if ( !cnScoringGroup.getScoringParametersPerSubpopulation().keySet().equals( monoSubpopKeyset ) ) { log.warn( "Scoring parameters are defined for different subpopulations." + " The routing disutility will only consider the ones of the default subpopulation."); log.warn( "This warning can safely be ignored if disutility of traveling only depends on travel time."); } } }
@Override public TravelDisutility createTravelDisutility( final TravelTime travelTime) { logWarningsIfNecessary( cnScoringGroup ); final PlanCalcScoreConfigGroup.ModeParams params = cnScoringGroup.getModes().get( mode ) ; if ( params == null ) { throw new NullPointerException( mode+" is not part of the valid mode parameters "+cnScoringGroup.getModes().keySet() ); } /* Usually, the travel-utility should be negative (it's a disutility) but the cost should be positive. Thus negate the utility.*/ final double marginalCostOfTime_s = (-params.getMarginalUtilityOfTraveling() / 3600.0) + (cnScoringGroup.getPerforming_utils_hr() / 3600.0); final double marginalCostOfDistance_m = - params.getMonetaryDistanceRate() * cnScoringGroup.getMarginalUtilityOfMoney() - params.getMarginalUtilityOfDistance() ; double normalization = 1; if ( sigma != 0. ) { normalization = 1. / Math.exp(this.sigma * this.sigma / 2); if (normalisationWrnCnt < 10) { normalisationWrnCnt++; log.info(" sigma: " + this.sigma + "; resulting normalization: " + normalization); } } return new RandomizingTimeDistanceTravelDisutility( travelTime, marginalCostOfTime_s, marginalCostOfDistance_m, normalization, sigma); }
public FreespeedTravelTimeAndDisutility(PlanCalcScoreConfigGroup cnScoringGroup){ this(cnScoringGroup.getModes().get(TransportMode.car).getMarginalUtilityOfTraveling() / 3600.0, cnScoringGroup.getPerforming_utils_hr() / 3600.0, // cnScoringGroup.getMarginalUtlOfDistanceCar()); cnScoringGroup.getModes().get(TransportMode.car).getMonetaryDistanceRate() *cnScoringGroup.getMarginalUtilityOfMoney()); }
if ( params.getMonetaryDistanceRate() > 0. ) { problem = true ; System.out.flush() ; log.error("found monetary distance rate for mode " + params.getMode() + " > 0. You probably want a value < 0 here.\n" ) ; if ( params.getMonetaryDistanceRate() < -0.01 ) { System.out.flush() ; log.error("found monetary distance rate for mode " + params.getMode() + " < -0.01. -0.01 per meter means -10 per km. You probably want to divide your value by 1000." ) ; if ( config.planCalcScore().getModes().get(TransportMode.car) != null && config.planCalcScore().getModes().get(TransportMode.car).getMonetaryDistanceRate() > 0 ) { problem = true ; if ( modeParamsPt!=null && modeParamsPt.getMonetaryDistanceRate() > 0 ) { problem = true ; System.out.flush() ;
Assert.assertEquals( "wrong monetaryDistanceCostRateCar "+msg, initialGroup.getModes().get(TransportMode.car).getMonetaryDistanceRate(), inputConfigGroup.getModes().get(TransportMode.car).getMonetaryDistanceRate(), 1e-7); Assert.assertEquals( "wrong monetaryDistanceCostRatePt "+msg, initialGroup.getModes().get(TransportMode.pt).getMonetaryDistanceRate(), inputConfigGroup.getModes().get(TransportMode.pt).getMonetaryDistanceRate(), 1e-7); Assert.assertEquals( Assert.assertEquals( "wrong monetaryDistanceRate "+msg, initialSettings.getMonetaryDistanceRate(), inputSettings.getMonetaryDistanceRate(), 1e-7 );
module.addParam( "marginalUtlOfDistance_"+mode , ""+settings.getMarginalUtilityOfDistance() ); module.addParam( "traveling_"+mode , ""+settings.getMarginalUtilityOfTraveling() ); module.addParam( "monetaryDistanceRate_"+mode , ""+settings.getMonetaryDistanceRate() );
pcsConfig.getModes().get(TransportMode.walk).getMonetaryDistanceRate() + pcsConfig.getModes().get(TransportMode.walk).getMarginalUtilityOfDistance(); pcsConfig.getModes().get(TransportMode.pt).getMonetaryDistanceRate() + pcsConfig.getModes().get(TransportMode.pt).getMarginalUtilityOfDistance();
public LeastCostPathCalculator asPathCalculator(PlanCalcScoreConfigGroup planCalcScoreConfigGroup) { final double betaWalkTT = planCalcScoreConfigGroup.getModes().get(TransportMode.walk).getMarginalUtilityOfTraveling() - planCalcScoreConfigGroup.getPerforming_utils_hr(); final double betaWalkTD = planCalcScoreConfigGroup.getModes().get(TransportMode.walk).getMarginalUtilityOfDistance(); final double betaPtTT = planCalcScoreConfigGroup.getModes().get(TransportMode.pt).getMarginalUtilityOfTraveling() - planCalcScoreConfigGroup.getPerforming_utils_hr(); final double betaPtTD = planCalcScoreConfigGroup.getMarginalUtilityOfMoney() * planCalcScoreConfigGroup.getModes().get(TransportMode.pt).getMonetaryDistanceRate(); final double constPt = planCalcScoreConfigGroup.getModes().get(TransportMode.pt).getConstant(); return new LeastCostPathCalculator() { @Override public Path calcLeastCostPath(Node fromNode, Node toNode, double starttime, Person person, Vehicle vehicle) { // travel time with pt: double ptTravelTime_h = getPtTravelTime_seconds(fromNode.getCoord(), toNode.getCoord()) / 3600.; // total walking time including (i) to get to pt stop and (ii) to get from destination pt stop to destination location: double ptTotalWalkTime_h = getTotalWalkTravelTime_seconds(fromNode.getCoord(), toNode.getCoord()) / 3600.; // total travel distance including walking and pt distance from/to origin/destination location: double ptTravelDistance_meter = getTotalWalkTravelDistance_meter(fromNode.getCoord(), toNode.getCoord()); // total walk distance including (i) to get to pt stop and (ii) to get from destination pt stop to destination location: double ptTotalWalkDistance_meter = getPtTravelDistance_meter(fromNode.getCoord(), toNode.getCoord()); return new Path( Arrays.asList(fromNode, toNode), Collections.<Link>emptyList(), getTotalTravelTime_seconds(fromNode.getCoord(), toNode.getCoord()), constPt + (ptTotalWalkTime_h * betaWalkTT) + (ptTravelTime_h * betaPtTT) + (ptTotalWalkDistance_meter * betaWalkTD) + (ptTravelDistance_meter * betaPtTD) ); } }; }
public NetworkModeAccessibilityExpContributionCalculator(final TravelTime travelTime, final TravelDisutilityFactory travelDisutilityFactory, final Scenario scenario, final Network network) { this.network = network; final PlanCalcScoreConfigGroup planCalcScoreConfigGroup = scenario.getConfig().planCalcScore(); this.scheme = (RoadPricingScheme) scenario.getScenarioElement( RoadPricingScheme.ELEMENT_NAME ); this.travelTime = travelTime; Gbl.assertNotNull(travelDisutilityFactory); TravelDisutility travelDisutility = travelDisutilityFactory.createTravelDisutility(travelTime); this.lcpt = new LeastCostPathTreeExtended(travelTime, travelDisutility, this.scheme); if ( planCalcScoreConfigGroup.getOrCreateModeParams(TransportMode.car).getMarginalUtilityOfDistance() != 0. ) { log.error( "marginal utility of distance for car different from zero but not used in accessibility computations"); } logitScaleParameter = planCalcScoreConfigGroup.getBrainExpBeta() ; betaCarTT = planCalcScoreConfigGroup.getModes().get(TransportMode.car).getMarginalUtilityOfTraveling() - planCalcScoreConfigGroup.getPerforming_utils_hr(); betaCarTD = planCalcScoreConfigGroup.getMarginalUtilityOfMoney() * planCalcScoreConfigGroup.getModes().get(TransportMode.car).getMonetaryDistanceRate(); betaCarTMC = - planCalcScoreConfigGroup.getMarginalUtilityOfMoney() ; constCar = planCalcScoreConfigGroup.getModes().get(TransportMode.car).getConstant(); betaWalkTT = planCalcScoreConfigGroup.getModes().get(TransportMode.walk).getMarginalUtilityOfTraveling() - planCalcScoreConfigGroup.getPerforming_utils_hr(); betaWalkTD = planCalcScoreConfigGroup.getModes().get(TransportMode.walk).getMarginalUtilityOfDistance(); this.walkSpeed_m_s = scenario.getConfig().plansCalcRoute().getTeleportedModeSpeeds().get(TransportMode.walk); }
public AccessibilityCalculator(Scenario scenario, ActivityFacilities measuringPoints, Network network) { this.network = network; this.measuringPoints = measuringPoints; this.acg = ConfigUtils.addOrGetModule(scenario.getConfig(), AccessibilityConfigGroup.GROUP_NAME, AccessibilityConfigGroup.class); this.cnScoringGroup = scenario.getConfig().planCalcScore(); if (cnScoringGroup.getOrCreateModeParams(TransportMode.car).getMarginalUtilityOfDistance() != 0.) { LOG.error("marginal utility of distance for car different from zero but not used in accessibility computations"); } if (cnScoringGroup.getOrCreateModeParams(TransportMode.pt).getMarginalUtilityOfDistance() != 0.) { LOG.error("marginal utility of distance for pt different from zero but not used in accessibility computations"); } if (cnScoringGroup.getOrCreateModeParams(TransportMode.bike).getMonetaryDistanceRate() != 0.) { LOG.error("monetary distance cost rate for bike different from zero but not used in accessibility computations"); } if (cnScoringGroup.getOrCreateModeParams(TransportMode.walk).getMonetaryDistanceRate() != 0.) { LOG.error("monetary distance cost rate for walk different from zero but not used in accessibility computations"); } this.walkSpeed_m_h = scenario.getConfig().plansCalcRoute().getTeleportedModeSpeeds().get(TransportMode.walk) * 3600.; }
public ConstantSpeedAccessibilityExpContributionCalculator(final String mode, Config config, Network network) { this.network = network; final PlanCalcScoreConfigGroup planCalcScoreConfigGroup = config.planCalcScore() ; if (planCalcScoreConfigGroup.getOrCreateModeParams(mode).getMonetaryDistanceRate() != 0.) { LOG.error("Monetary distance cost rate for " + mode + " different from zero, but not used in accessibility computations"); } logitScaleParameter = planCalcScoreConfigGroup.getBrainExpBeta(); if (config.plansCalcRoute().getTeleportedModeSpeeds().get(mode) == null) { LOG.error("No teleported mode speed for mode " + mode + " set."); } this.modeSpeed_m_h = config.plansCalcRoute().getTeleportedModeSpeeds().get(mode) * 3600.; final PlanCalcScoreConfigGroup.ModeParams modeParams = planCalcScoreConfigGroup.getOrCreateModeParams(mode); betaModeTT = modeParams.getMarginalUtilityOfTraveling() - planCalcScoreConfigGroup.getPerforming_utils_hr(); betaModeTD = modeParams.getMarginalUtilityOfDistance(); constMode = modeParams.getConstant(); betaWalkTT = planCalcScoreConfigGroup.getModes().get(TransportMode.walk).getMarginalUtilityOfTraveling() - planCalcScoreConfigGroup.getPerforming_utils_hr(); betaWalkTD = planCalcScoreConfigGroup.getModes().get(TransportMode.walk).getMarginalUtilityOfDistance(); this.walkSpeed_m_h = config.plansCalcRoute().getTeleportedModeSpeeds().get(TransportMode.walk) * 3600; }
BicycleTravelDisutility(BicycleConfigGroup bicycleConfigGroup, PlanCalcScoreConfigGroup cnScoringGroup, PlansCalcRouteConfigGroup plansCalcRouteConfigGroup, TravelTime timeCalculator, double normalization) { final PlanCalcScoreConfigGroup.ModeParams bicycleParams = cnScoringGroup.getModes().get("bicycle"); if (bicycleParams == null) { throw new NullPointerException("Bicycle is not part of the valid mode parameters " + cnScoringGroup.getModes().keySet()); } this.marginalCostOfDistance_m = -(bicycleParams.getMonetaryDistanceRate() * cnScoringGroup.getMarginalUtilityOfMoney()) - bicycleParams.getMarginalUtilityOfDistance(); this.marginalCostOfTime_s = -(bicycleParams.getMarginalUtilityOfTraveling() / 3600.0) + cnScoringGroup.getPerforming_utils_hr() / 3600.0; this.marginalCostOfInfrastructure_m = -(bicycleConfigGroup.getMarginalUtilityOfInfrastructure_m()); this.marginalCostOfComfort_m = -(bicycleConfigGroup.getMarginalUtilityOfComfort_m()); this.marginalCostOfGradient_m_100m = -(bicycleConfigGroup.getMarginalUtilityOfGradient_m_100m()); this.timeCalculator = timeCalculator; this.normalization = normalization; this.sigma = plansCalcRouteConfigGroup.getRoutingRandomness(); this.random = sigma != 0 ? MatsimRandom.getLocalInstance() : null; }
public Builder( PlanCalcScoreConfigGroup.ModeParams params ) { this.marginalUtilityOfTraveling_s = params.getMarginalUtilityOfTraveling() / 3600.0; this.marginalUtilityOfDistance_m = params.getMarginalUtilityOfDistance(); this.monetaryDistanceRate = params.getMonetaryDistanceRate(); this.constant = params.getConstant(); this.dailyMoneyConstant = params.getDailyMonetaryConstant(); this.dailyUtilityConstant = params.getDailyUtilityConstant(); }