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
17
18
19
20
21
22
23 public class IdmPlusMulti extends AbstractIdm
24 {
25
26
27 public static final ParameterTypeInteger NLEADERS =
28 new ParameterTypeInteger("nLeaders", "Number of leaders in car-following model.", 2, ATLEASTONE);
29
30
31
32
33 public IdmPlusMulti()
34 {
35 super(HEADWAY, DESIRED_SPEED);
36 }
37
38
39
40
41
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
73
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)
84 {
85 cumulVehicleLengths += leader.getLength().si;
86 }
87 }
88 return new Acceleration(aIntMulti < aFree.si ? aIntMulti : aFree.si, AccelerationUnit.SI);
89 }
90
91 }