View Javadoc
1   package org.opentrafficsim.road.gtu.lane.tactical.following;
2   
3   import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.ATLEASTONE;
4   
5   import org.djunits.unit.AccelerationUnit;
6   import org.djunits.value.vdouble.scalar.Acceleration;
7   import org.djunits.value.vdouble.scalar.Length;
8   import org.djunits.value.vdouble.scalar.Speed;
9   import org.opentrafficsim.base.parameters.ParameterException;
10  import org.opentrafficsim.base.parameters.ParameterTypeInteger;
11  import org.opentrafficsim.base.parameters.Parameters;
12  import org.opentrafficsim.road.gtu.lane.perception.PerceptionIterable;
13  import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;
14  
15  /**
16   * <p>
17   * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
18   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
19   * </p>
20   * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
21   */
22  
23  public class IdmPlusMulti extends AbstractIdm
24  {
25  
26      /** Number of leaders considered parameter. */
27      public static final ParameterTypeInteger NLEADERS =
28              new ParameterTypeInteger("nLeaders", "Number of leaders in car-following model.", 2, ATLEASTONE);
29  
30      /**
31       * Default constructor using default models for desired headway and desired speed.
32       */
33      public IdmPlusMulti()
34      {
35          super(HEADWAY, DESIRED_SPEED);
36      }
37  
38      /**
39       * Constructor with modular models for desired headway and desired speed.
40       * @param desiredHeadwayModel DesiredHeadwayModel; desired headway model
41       * @param desiredSpeedModel DesiredSpeedModel; desired speed model
42       */
43      public IdmPlusMulti(final DesiredHeadwayModel desiredHeadwayModel, final DesiredSpeedModel desiredSpeedModel)
44      {
45          super(desiredHeadwayModel, desiredSpeedModel);
46      }
47  
48      /** {@inheritDoc} */
49      @Override
50      public final String getName()
51      {
52          return "IDM+multi";
53      }
54  
55      /** {@inheritDoc} */
56      @Override
57      public final String getLongName()
58      {
59          return "Intelligent Driver Model+ with multi-leader anticipation.";
60      }
61  
62      /** {@inheritDoc} */
63      @Override
64      protected final Acceleration combineInteractionTerm(final Acceleration aFree, final Parameters parameters,
65              final Speed speed, final Speed desiredSpeed, final Length desiredHeadway,
66              final PerceptionIterable<? extends Headway> leaders) throws ParameterException
67      {
68          Acceleration a = parameters.getParameter(A);
69          double aIntMulti = Double.POSITIVE_INFINITY;
70          int i = 1;
71          double cumulVehicleLengths = 0;
72          int n = parameters.getParameter(NLEADERS);
73          for (Headway leader : leaders)
74          {
75              // desired headway is scaled to the i'th leader
76              // current headway is the sum of net headways (i.e. vehicle lengths of vehicles in between are subtracted)
77              double sRatio = dynamicDesiredHeadway(parameters, speed, desiredHeadway.times(i), leader.getSpeed()).si
78                      / (leader.getDistance().si - cumulVehicleLengths);
79              double aIntSingle = a.si * (1 - sRatio * sRatio);
80              aIntMulti = aIntMulti < aIntSingle ? aIntMulti : aIntSingle;
81              i++;
82              if (i > n)
83              {
84                  break;
85              }
86              if (leader.getLength() != null) // usage could be e.g. a dead-end
87              {
88                  cumulVehicleLengths += leader.getLength().si;
89              }
90          }
91          return new Acceleration(aIntMulti < aFree.si ? aIntMulti : aFree.si, AccelerationUnit.SI);
92      }
93  
94  }