IDMPlusMulti.java

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

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

  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-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
  15.  * BSD-style license. See <a href="http://opentrafficsim.org/docs/current/license.html">OpenTrafficSim License</a>.
  16.  * <p>
  17.  * @version $Revision$, $LastChangedDate$, by $Author$, initial version Apr 22, 2016 <br>
  18.  * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
  19.  */

  20. public class IDMPlusMulti extends AbstractIDM
  21. {

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

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

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

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

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

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

  81. }