IdmPlusMulti.java

  1. package org.opentrafficsim.road.gtu.lane.tactical.following;

  2. import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.ATLEASTONE;

  3. import org.djunits.unit.AccelerationUnit;
  4. import org.djunits.value.vdouble.scalar.Acceleration;
  5. import org.djunits.value.vdouble.scalar.Length;
  6. import org.djunits.value.vdouble.scalar.Speed;
  7. import org.opentrafficsim.base.parameters.ParameterException;
  8. import org.opentrafficsim.base.parameters.ParameterTypeInteger;
  9. import org.opentrafficsim.base.parameters.Parameters;
  10. import org.opentrafficsim.road.gtu.lane.perception.PerceptionIterable;
  11. import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;

  12. /**
  13.  * <p>
  14.  * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
  15.  * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
  16.  * </p>
  17.  * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
  18.  */

  19. public class IdmPlusMulti extends AbstractIdm
  20. {

  21.     /** Number of leaders considered parameter. */
  22.     public static final ParameterTypeInteger NLEADERS =
  23.             new ParameterTypeInteger("nLeaders", "Number of leaders in car-following model.", 2, ATLEASTONE);

  24.     /**
  25.      * Default constructor using default models for desired headway and desired speed.
  26.      */
  27.     public IdmPlusMulti()
  28.     {
  29.         super(HEADWAY, DESIRED_SPEED);
  30.     }

  31.     /**
  32.      * Constructor with modular models for desired headway and desired speed.
  33.      * @param desiredHeadwayModel DesiredHeadwayModel; desired headway model
  34.      * @param desiredSpeedModel DesiredSpeedModel; desired speed model
  35.      */
  36.     public IdmPlusMulti(final DesiredHeadwayModel desiredHeadwayModel, final DesiredSpeedModel desiredSpeedModel)
  37.     {
  38.         super(desiredHeadwayModel, desiredSpeedModel);
  39.     }

  40.     /** {@inheritDoc} */
  41.     @Override
  42.     public final String getName()
  43.     {
  44.         return "IDM+multi";
  45.     }

  46.     /** {@inheritDoc} */
  47.     @Override
  48.     public final String getLongName()
  49.     {
  50.         return "Intelligent Driver Model+ with multi-leader anticipation.";
  51.     }

  52.     /** {@inheritDoc} */
  53.     @Override
  54.     protected final Acceleration combineInteractionTerm(final Acceleration aFree, final Parameters parameters,
  55.             final Speed speed, final Speed desiredSpeed, final Length desiredHeadway,
  56.             final PerceptionIterable<? extends Headway> leaders) throws ParameterException
  57.     {
  58.         Acceleration a = parameters.getParameter(A);
  59.         double aIntMulti = Double.POSITIVE_INFINITY;
  60.         int i = 1;
  61.         double cumulVehicleLengths = 0;
  62.         int n = parameters.getParameter(NLEADERS);
  63.         for (Headway leader : leaders)
  64.         {
  65.             // desired headway is scaled to the i'th leader
  66.             // current headway is the sum of net headways (i.e. vehicle lengths of vehicles in between are subtracted)
  67.             double sRatio = dynamicDesiredHeadway(parameters, speed, desiredHeadway.times(i), leader.getSpeed()).si
  68.                     / (leader.getDistance().si - cumulVehicleLengths);
  69.             double aIntSingle = a.si * (1 - sRatio * sRatio);
  70.             aIntMulti = aIntMulti < aIntSingle ? aIntMulti : aIntSingle;
  71.             i++;
  72.             if (i > n)
  73.             {
  74.                 break;
  75.             }
  76.             if (leader.getLength() != null) // usage could be e.g. a dead-end
  77.             {
  78.                 cumulVehicleLengths += leader.getLength().si;
  79.             }
  80.         }
  81.         return new Acceleration(aIntMulti < aFree.si ? aIntMulti : aFree.si, AccelerationUnit.SI);
  82.     }

  83. }