View Javadoc
1   package org.opentrafficsim.road.gtu.lane.perception.mental;
2   
3   import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.POSITIVE;
4   import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.POSITIVEZERO;
5   
6   import org.djunits.value.vdouble.scalar.Duration;
7   import org.djutils.exceptions.Throw;
8   import org.opentrafficsim.base.parameters.ParameterException;
9   import org.opentrafficsim.base.parameters.ParameterTypeDouble;
10  import org.opentrafficsim.base.parameters.ParameterTypeDuration;
11  import org.opentrafficsim.base.parameters.ParameterTypes;
12  import org.opentrafficsim.base.parameters.Parameters;
13  import org.opentrafficsim.road.gtu.lane.perception.mental.Fuller.BehavioralAdaptation;
14  
15  /**
16   * Behavioral adaptation which sets parameters for situational awareness and reaction time.
17   * 
18   * <pre>
19   *      / SA_MAX,                                                                         taskSaturation &lt; TS_CRIT
20   * SA = | SA_MAX - (SA_MAX - SA_MIN) * (taskSaturation - TS_CRIT) / (TS_MAX - TS_CRIT),   TS_CRIT &lt;= taskSaturation &lt; TS_MAX 
21   *      \ SA_MIN,                                                                         taskSaturation &gt;= TS_MAX
22   * 
23   * TR = (S_MAX - SA) * TR_MAX
24   * </pre>
25   * <p>
26   * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
27   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
28   * <p>
29   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 5 apr. 2018 <br>
30   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
31   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
32   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
33   */
34  public class AdaptationSituationalAwareness implements BehavioralAdaptation
35  {
36  
37      /** Situational awareness. */
38      public static final ParameterTypeDouble SA = new ParameterTypeDouble("SA", "Situational awareness", 1.0, POSITIVEZERO);
39  
40      /** Minimum situational awareness. */
41      public static final ParameterTypeDouble SA_MIN =
42              new ParameterTypeDouble("SAmin", "Min. situational awareness", 0.5, POSITIVE)
43              {
44                  /** */
45                  private static final long serialVersionUID = 20180403L;
46  
47                  /** {@inheritDoc} */
48                  @Override
49                  public void check(final Double value, final Parameters params) throws ParameterException
50                  {
51                      Double saMax = params.getParameterOrNull(SA_MAX);
52                      Throw.when(saMax != null && value > saMax, ParameterException.class,
53                              "Value for SA_MIN should not be larger than SA_MAX.");
54                  }
55              };
56  
57      /** Maximum situational awareness. */
58      public static final ParameterTypeDouble SA_MAX =
59              new ParameterTypeDouble("SAmax", "Max. situational awareness", 1.0, POSITIVE)
60              {
61                  /** */
62                  private static final long serialVersionUID = 20180403L;
63  
64                  /** {@inheritDoc} */
65                  @Override
66                  public void check(final Double value, final Parameters params) throws ParameterException
67                  {
68                      Double saMin = params.getParameterOrNull(SA_MIN);
69                      Throw.when(saMin != null && value < saMin, ParameterException.class,
70                              "Value for SA_MAX should not be larger than SA_MIN.");
71                  }
72              };
73  
74      /** Maximum reaction time at 0 situational awareness. */
75      public static final ParameterTypeDuration TR_MAX =
76              new ParameterTypeDuration("TRmax", "Maximum reaction time", Duration.createSI(2.0), POSITIVE);
77  
78      /** {@inheritDoc} */
79      @Override
80      public void adapt(final Parameters parameters, final double taskSaturation) throws ParameterException
81      {
82          // situational awareness
83          double tsCrit = parameters.getParameter(Fuller.TS_CRIT);
84          double tsMax = parameters.getParameter(Fuller.TS_MAX);
85          double saMin = parameters.getParameter(SA_MIN);
86          double saMax = parameters.getParameter(SA_MAX);
87          double sa = taskSaturation < tsCrit ? saMax
88                  : (taskSaturation >= tsMax ? saMin : saMax - (saMax - saMin) * (taskSaturation - tsCrit) / (tsMax - tsCrit));
89          parameters.setParameter(SA, sa);
90          // reaction time
91          parameters.setParameter(ParameterTypes.TR, parameters.getParameter(TR_MAX).multiplyBy(saMax - sa));
92      }
93  
94  }