MATSIM
ScoringParameters.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * CharyparNagelScoringParameters.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2009 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.core.scoring.functions;
22 
23 import org.matsim.api.core.v01.Scenario;
31 
32 import java.util.Map;
33 import java.util.TreeMap;
34 
35 public class ScoringParameters implements MatsimParameters {
36 
37  public final Map<String, ActivityUtilityParameters> utilParams;
38  public final Map<String, ModeUtilityParameters> modeParams;
39  public final double marginalUtilityOfWaiting_s;
40  public final double marginalUtilityOfLateArrival_s;
41  public final double marginalUtilityOfEarlyDeparture_s;
42  public final double marginalUtilityOfWaitingPt_s;
43  public final double marginalUtilityOfPerforming_s;
44  public final double utilityOfLineSwitch ;
45  public final double marginalUtilityOfMoney;
46  public final double abortedPlanScore;
47  public final boolean scoreActs;
48 
50 
51  public final double simulationPeriodInDays;
52 
54  final Map<String, ActivityUtilityParameters> utilParams,
55  final Map<String, ModeUtilityParameters> modeParams,
56  final double marginalUtilityOfWaiting_s,
57  final double marginalUtilityOfLateArrival_s,
58  final double marginalUtilityOfEarlyDeparture_s,
59  final double marginalUtilityOfWaitingPt_s,
60  final double marginalUtilityOfPerforming_s,
61  final double utilityOfLineSwitch,
62  final double marginalUtilityOfMoney,
63  final double abortedPlanScore,
64  final boolean scoreActs,
65  final boolean usingOldScoringBelowZeroUtilityDuration,
66  final double simulationPeriodInDays) {
67  this.utilParams = utilParams;
68  this.modeParams = modeParams;
69  this.marginalUtilityOfWaiting_s = marginalUtilityOfWaiting_s;
70  this.marginalUtilityOfLateArrival_s = marginalUtilityOfLateArrival_s;
71  this.marginalUtilityOfEarlyDeparture_s = marginalUtilityOfEarlyDeparture_s;
72  this.marginalUtilityOfWaitingPt_s = marginalUtilityOfWaitingPt_s;
73  this.marginalUtilityOfPerforming_s = marginalUtilityOfPerforming_s;
74  this.utilityOfLineSwitch = utilityOfLineSwitch;
75  this.marginalUtilityOfMoney = marginalUtilityOfMoney;
76  this.abortedPlanScore = abortedPlanScore;
77  this.scoreActs = scoreActs;
78  this.usingOldScoringBelowZeroUtilityDuration = usingOldScoringBelowZeroUtilityDuration;
79  this.simulationPeriodInDays = simulationPeriodInDays;
80  }
81 
82  public static final class Builder {
83  private final Map<String, ActivityUtilityParameters> utilParams;
84  private final Map<String, ModeUtilityParameters> modeParams;
85 
91  private double utilityOfLineSwitch;
92  private double marginalUtilityOfMoney;
93  private double abortedPlanScore;
94  private boolean scoreActs;
96  private double simulationPeriodInDays = 1.0;
97 
98  // This is an error-prone design. In the original design, there were defensive copies of the activity parameters for each individual
99  // person. So in situations where there are many activity parameters (e.g. for home_30, home_60, home_120, etc.), this resulted in
100  // N(activityTypes) x N(persons) many objects of type ActivityUtilityParameters, which became fairly large. Tilmann has now changed
101  // it such that the ActivityUtilityParameters can be externally set, meaning that one can externally program something that re-uses
102  // them. However, one still has to pass the embedding objects ScoringParameters and PlanCalcScoreConfig group, since one can also set
103  // things at that upper level. Conceptually, one _always_ makes a copy of PlanCalcScoreConfig group, but then partially fills it with
104  // references to already existing objects (i.e. the ActivityUtilityParameters). However, the code design does not make this very
105  // clear. kai, may'22
106 
107  @Deprecated
108  public Builder(
109  final Scenario scenario,
110  final Person person ) {
111  this(
112  scenario.getConfig().scoring(),
114  scenario.getConfig().scenario() );
115  }
116 
125  @Deprecated
126  public Builder(
127  final ScoringConfigGroup configGroup,
128  final ScoringConfigGroup.ScoringParameterSet scoringParameterSet,
129  final ScenarioConfigGroup scenarioConfig) {
130  this.simulationPeriodInDays = scenarioConfig.getSimulationPeriodInDays();
131 
132  this.usingOldScoringBelowZeroUtilityDuration = configGroup.isUsingOldScoringBelowZeroUtilityDuration() ;
133 
134  marginalUtilityOfWaiting_s = scoringParameterSet.getMarginalUtlOfWaiting_utils_hr() / 3600.0;
135  marginalUtilityOfLateArrival_s = scoringParameterSet.getLateArrival_utils_hr() / 3600.0;
136  marginalUtilityOfEarlyDeparture_s = scoringParameterSet.getEarlyDeparture_utils_hr() / 3600.0;
137  marginalUtilityOfWaitingPt_s = scoringParameterSet.getMarginalUtlOfWaitingPt_utils_hr() / 3600.0 ;
138  marginalUtilityOfPerforming_s = scoringParameterSet.getPerforming_utils_hr() / 3600.0;
139  utilityOfLineSwitch = scoringParameterSet.getUtilityOfLineSwitch() ;
140  marginalUtilityOfMoney = scoringParameterSet.getMarginalUtilityOfMoney() ;
141  scoreActs = marginalUtilityOfPerforming_s != 0 || marginalUtilityOfWaiting_s != 0 ||
142  marginalUtilityOfLateArrival_s != 0 || marginalUtilityOfEarlyDeparture_s != 0;
143 
144  utilParams = new TreeMap<>() ;
145  for (ActivityParams params : scoringParameterSet.getActivityParams()) {
147  utilParams.put(params.getActivityType(), factory.build() ) ;
148  }
149 
150  modeParams = new TreeMap<>() ;
151  Map<String, ScoringConfigGroup.ModeParams> modes = scoringParameterSet.getModes();
152  double worstMarginalUtilityOfTraveling_s = 0.0;
153  for (Map.Entry<String, ScoringConfigGroup.ModeParams> mode : modes.entrySet()) {
154  String modeName = mode.getKey();
155  ModeParams params = mode.getValue();
156  worstMarginalUtilityOfTraveling_s = Math.min(worstMarginalUtilityOfTraveling_s, params.getMarginalUtilityOfTraveling() / 3600. );
157  modeParams.put(modeName, new ModeUtilityParameters.Builder( params ).build() );
158  }
159 
160  abortedPlanScore = Math.min(
161  Math.min(marginalUtilityOfLateArrival_s, marginalUtilityOfEarlyDeparture_s),
162  Math.min(worstMarginalUtilityOfTraveling_s-marginalUtilityOfPerforming_s, marginalUtilityOfWaiting_s-marginalUtilityOfPerforming_s)
163  ) * 3600.0 * 24.0; // SCENARIO_DURATION
164  // TODO 24 has to be replaced by a variable like scenario_dur (see also other places below)
165  // This rather complicated definition has to do with the fact that exp(some_large_number) relatively quickly becomes Inf.
166  // In consequence, the abortedPlanScore needs to be more strongly negative than anything else, but not much more.
167  // kai, feb'12
168  // yyyy given that there is now this.simulationPeriodInDays, one could just multiply with that. Will probably fail a number
169  // of tests, thus I am not doing it right now. kai, may'22
170  }
171 
172 
180  public Builder(
181  final ScoringConfigGroup configGroup,
182  final ScoringConfigGroup.ScoringParameterSet scoringParameterSet,
183  Map<String, ActivityUtilityParameters> activityParams,
184  final ScenarioConfigGroup scenarioConfig) {
185  this.simulationPeriodInDays = scenarioConfig.getSimulationPeriodInDays();
186 
187  this.usingOldScoringBelowZeroUtilityDuration = configGroup.isUsingOldScoringBelowZeroUtilityDuration() ;
188 
189  marginalUtilityOfWaiting_s = scoringParameterSet.getMarginalUtlOfWaiting_utils_hr() / 3600.0;
190  marginalUtilityOfLateArrival_s = scoringParameterSet.getLateArrival_utils_hr() / 3600.0;
191  marginalUtilityOfEarlyDeparture_s = scoringParameterSet.getEarlyDeparture_utils_hr() / 3600.0;
192  marginalUtilityOfWaitingPt_s = scoringParameterSet.getMarginalUtlOfWaitingPt_utils_hr() / 3600.0 ;
193  marginalUtilityOfPerforming_s = scoringParameterSet.getPerforming_utils_hr() / 3600.0;
194  utilityOfLineSwitch = scoringParameterSet.getUtilityOfLineSwitch() ;
195  marginalUtilityOfMoney = scoringParameterSet.getMarginalUtilityOfMoney() ;
196  scoreActs = marginalUtilityOfPerforming_s != 0 || marginalUtilityOfWaiting_s != 0 ||
197  marginalUtilityOfLateArrival_s != 0 || marginalUtilityOfEarlyDeparture_s != 0;
198 
199  utilParams = activityParams;
200 
201  modeParams = new TreeMap<>() ;
202  Map<String, ScoringConfigGroup.ModeParams> modes = scoringParameterSet.getModes();
203  double worstMarginalUtilityOfTraveling_s = 0.0;
204  for (Map.Entry<String, ScoringConfigGroup.ModeParams> mode : modes.entrySet()) {
205  String modeName = mode.getKey();
206  ModeParams params = mode.getValue();
207  worstMarginalUtilityOfTraveling_s = Math.min(worstMarginalUtilityOfTraveling_s, params.getMarginalUtilityOfTraveling() / 3600. );
208  modeParams.put(modeName, new ModeUtilityParameters.Builder( params ).build() );
209  }
210 
211  abortedPlanScore = Math.min(
212  Math.min(marginalUtilityOfLateArrival_s, marginalUtilityOfEarlyDeparture_s),
213  Math.min(worstMarginalUtilityOfTraveling_s-marginalUtilityOfPerforming_s, marginalUtilityOfWaiting_s-marginalUtilityOfPerforming_s)
214  ) * 3600.0 * 24.0; // SCENARIO_DURATION
215  // TODO 24 has to be replaced by a variable like scenario_dur (see also other places below)
216  // This rather complicated definition has to do with the fact that exp(some_large_number) relatively quickly becomes Inf.
217  // In consequence, the abortedPlanScore needs to be more strongly negative than anything else, but not much more.
218  // kai, feb'12
219  }
220 
221  public Builder setActivityParameters(String activityType, ActivityUtilityParameters params) {
222  this.utilParams.put( activityType , params );
223  return this;
224  }
225 
226  public ActivityUtilityParameters getActivityParameters(String activityType) {
227  return this.utilParams.get( activityType );
228  }
229 
230  public Builder setModeParameters(String mode, ModeUtilityParameters params) {
231  this.modeParams.put( mode , params );
232  return this;
233  }
234 
236  return this.modeParams.get( mode );
237  }
238 
239  public Builder setMarginalUtilityOfWaiting_s(double marginalUtilityOfWaiting_s) {
240  this.marginalUtilityOfWaiting_s = marginalUtilityOfWaiting_s;
241  return this;
242  }
243 
244  public Builder setMarginalUtilityOfLateArrival_s(double marginalUtilityOfLateArrival_s) {
245  this.marginalUtilityOfLateArrival_s = marginalUtilityOfLateArrival_s;
246  return this;
247  }
248 
249  public Builder setMarginalUtilityOfEarlyDeparture_s(double marginalUtilityOfEarlyDeparture_s) {
250  this.marginalUtilityOfEarlyDeparture_s = marginalUtilityOfEarlyDeparture_s;
251  return this;
252  }
253 
254  public Builder setMarginalUtilityOfWaitingPt_s(double marginalUtilityOfWaitingPt_s) {
255  this.marginalUtilityOfWaitingPt_s = marginalUtilityOfWaitingPt_s;
256  return this;
257  }
258 
259  public Builder setMarginalUtilityOfPerforming_s(double marginalUtilityOfPerforming_s) {
260  this.marginalUtilityOfPerforming_s = marginalUtilityOfPerforming_s;
261  return this;
262  }
263 
264  public Builder setUtilityOfLineSwitch(double utilityOfLineSwitch) {
265  this.utilityOfLineSwitch = utilityOfLineSwitch;
266  return this;
267  }
268 
269  public Builder setMarginalUtilityOfMoney(double marginalUtilityOfMoney) {
270  this.marginalUtilityOfMoney = marginalUtilityOfMoney;
271  return this;
272  }
273 
274  public Builder setAbortedPlanScore(double abortedPlanScore) {
275  this.abortedPlanScore = abortedPlanScore;
276  return this;
277  }
278 
279  public Builder setScoreActs(boolean scoreActs) {
280  this.scoreActs = scoreActs;
281  return this;
282  }
283 
284  public Builder setUsingOldScoringBelowZeroUtilityDuration(boolean usingOldScoringBelowZeroUtilityDuration) {
285  this.usingOldScoringBelowZeroUtilityDuration = usingOldScoringBelowZeroUtilityDuration;
286  return this;
287  }
288 
290  return new ScoringParameters(
291  utilParams,
292  modeParams,
293  marginalUtilityOfWaiting_s,
294  marginalUtilityOfLateArrival_s,
295  marginalUtilityOfEarlyDeparture_s,
296  marginalUtilityOfWaitingPt_s,
297  marginalUtilityOfPerforming_s,
298  utilityOfLineSwitch,
299  marginalUtilityOfMoney,
300  abortedPlanScore,
301  scoreActs,
302  usingOldScoringBelowZeroUtilityDuration,
303  this.simulationPeriodInDays);
304  }
305  }
306 }
Builder setMarginalUtilityOfWaitingPt_s(double marginalUtilityOfWaitingPt_s)
Builder setActivityParameters(String activityType, ActivityUtilityParameters params)
ActivityUtilityParameters getActivityParameters(String activityType)
Builder setUsingOldScoringBelowZeroUtilityDuration(boolean usingOldScoringBelowZeroUtilityDuration)
Builder setMarginalUtilityOfPerforming_s(double marginalUtilityOfPerforming_s)
final Map< String, ModeUtilityParameters > modeParams
Builder(final Scenario scenario, final Person person)
ScoringParameterSet getScoringParameters(String subpopulation)
final ScoringConfigGroup scoring()
Definition: Config.java:407
Builder setMarginalUtilityOfMoney(double marginalUtilityOfMoney)
Builder setMarginalUtilityOfEarlyDeparture_s(double marginalUtilityOfEarlyDeparture_s)
Builder setMarginalUtilityOfWaiting_s(double marginalUtilityOfWaiting_s)
Builder(final ScoringConfigGroup configGroup, final ScoringConfigGroup.ScoringParameterSet scoringParameterSet, Map< String, ActivityUtilityParameters > activityParams, final ScenarioConfigGroup scenarioConfig)
static String getSubpopulation(HasPlansAndId<?, ?> person)
final String getValue(final String param_name)
final Map< String, ActivityUtilityParameters > utilParams
final Map< String, ActivityUtilityParameters > utilParams
Builder setMarginalUtilityOfLateArrival_s(double marginalUtilityOfLateArrival_s)
ScenarioConfigGroup scenario()
Definition: Config.java:435
Builder(final ScoringConfigGroup configGroup, final ScoringConfigGroup.ScoringParameterSet scoringParameterSet, final ScenarioConfigGroup scenarioConfig)
ScoringParameters(final Map< String, ActivityUtilityParameters > utilParams, final Map< String, ModeUtilityParameters > modeParams, final double marginalUtilityOfWaiting_s, final double marginalUtilityOfLateArrival_s, final double marginalUtilityOfEarlyDeparture_s, final double marginalUtilityOfWaitingPt_s, final double marginalUtilityOfPerforming_s, final double utilityOfLineSwitch, final double marginalUtilityOfMoney, final double abortedPlanScore, final boolean scoreActs, final boolean usingOldScoringBelowZeroUtilityDuration, final double simulationPeriodInDays)
Builder setModeParameters(String mode, ModeUtilityParameters params)
final Map< String, ModeUtilityParameters > modeParams