View Javadoc
1   package org.opentrafficsim.road.gtu.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.perception.PerceptionIterable;
13  import org.opentrafficsim.road.gtu.perception.object.PerceivedObject;
14  
15  /**
16   * <p>
17   * Copyright (c) 2013-2026 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 Wouter Schakel
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 desired headway model
41       * @param desiredSpeedModel desired speed model
42       */
43      public IdmPlusMulti(final DesiredHeadwayModel desiredHeadwayModel, final DesiredSpeedModel desiredSpeedModel)
44      {
45          super(desiredHeadwayModel, desiredSpeedModel);
46      }
47  
48      @Override
49      public final String getName()
50      {
51          return "IDM+multi";
52      }
53  
54      @Override
55      public final String getLongName()
56      {
57          return "Intelligent Driver Model+ with multi-leader anticipation.";
58      }
59  
60      @Override
61      protected final Acceleration combineInteractionTerm(final Acceleration aFree, final Parameters parameters,
62              final Speed speed, final Speed desiredSpeed, final Length desiredHeadway,
63              final PerceptionIterable<? extends PerceivedObject> leaders) throws ParameterException
64      {
65          Acceleration a = parameters.getParameter(A);
66          double aIntMulti = Double.POSITIVE_INFINITY;
67          int i = 1;
68          double cumulVehicleLengths = 0;
69          int n = parameters.getParameter(NLEADERS);
70          for (PerceivedObject leader : leaders)
71          {
72              // desired headway is scaled to the i'th leader
73              // current headway is the sum of net headways (i.e. vehicle lengths of vehicles in between are subtracted)
74              double sRatio = dynamicDesiredHeadway(parameters, speed, desiredHeadway.times(i), leader.getSpeed()).si
75                      / (leader.getDistance().si - cumulVehicleLengths);
76              double aIntSingle = a.si * (1 - sRatio * sRatio);
77              aIntMulti = aIntMulti < aIntSingle ? aIntMulti : aIntSingle;
78              i++;
79              if (i > n)
80              {
81                  break;
82              }
83              if (leader.getLength() != null) // usage could be e.g. a dead-end
84              {
85                  cumulVehicleLengths += leader.getLength().si;
86              }
87          }
88          return new Acceleration(aIntMulti < aFree.si ? aIntMulti : aFree.si, AccelerationUnit.SI);
89      }
90  
91  }