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
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
49 @Override
50 public final String getName()
51 {
52 return "IDM+multi";
53 }
54
55
56 @Override
57 public final String getLongName()
58 {
59 return "Intelligent Driver Model+ with multi-leader anticipation.";
60 }
61
62
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
76
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)
87 {
88 cumulVehicleLengths += leader.getLength().si;
89 }
90 }
91 return new Acceleration(aIntMulti < aFree.si ? aIntMulti : aFree.si, AccelerationUnit.SI);
92 }
93
94 }