1 package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2
3 import org.djunits.value.vdouble.scalar.Length;
4 import org.djunits.value.vdouble.scalar.Speed;
5 import org.djutils.exceptions.Try;
6 import org.opentrafficsim.base.parameters.ParameterException;
7 import org.opentrafficsim.base.parameters.ParameterTypeDouble;
8 import org.opentrafficsim.base.parameters.ParameterTypeLength;
9 import org.opentrafficsim.base.parameters.ParameterTypeSpeed;
10 import org.opentrafficsim.base.parameters.ParameterTypes;
11 import org.opentrafficsim.base.parameters.Parameters;
12 import org.opentrafficsim.core.gtu.perception.EgoPerception;
13 import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
14 import org.opentrafficsim.core.network.LateralDirectionality;
15 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
16 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
17 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable;
18 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
19 import org.opentrafficsim.road.gtu.lane.perception.categories.InfrastructurePerception;
20 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.NeighborsPerception;
21 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGtu;
22 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
23 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Desire;
24 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.LmrsParameters;
25 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Tailgating;
26 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.VoluntaryIncentive;
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public class IncentiveSocioSpeed implements VoluntaryIncentive
42 {
43
44
45 protected static final ParameterTypeDouble RHO = Tailgating.RHO;
46
47
48 protected static final ParameterTypeDouble SOCIO = LmrsParameters.SOCIO;
49
50
51 protected static final ParameterTypeSpeed VCONG = ParameterTypes.VCONG;
52
53
54 protected static final ParameterTypeSpeed VGAIN = LmrsParameters.VGAIN;
55
56
57 protected static final ParameterTypeLength LOOKAHEAD = ParameterTypes.LOOKAHEAD;
58
59 @Override
60 public final Desire determineDesire(final Parameters parameters, final LanePerception perception,
61 final CarFollowingModel carFollowingModel, final Desire mandatoryDesire, final Desire voluntaryDesire)
62 throws ParameterException, OperationalPlanException
63 {
64 double dLeft = 0;
65 double dRight = 0;
66 Speed vCong = parameters.getParameter(VCONG);
67 Speed ownSpeed = perception.getPerceptionCategoryOrNull(EgoPerception.class).getSpeed();
68 if (ownSpeed.gt(vCong))
69 {
70 double sigma = parameters.getParameter(SOCIO);
71 NeighborsPerception neighbors = perception.getPerceptionCategory(NeighborsPerception.class);
72 InfrastructurePerception infra = perception.getPerceptionCategory(InfrastructurePerception.class);
73 boolean leftLane = infra.getLegalLaneChangePossibility(RelativeLane.CURRENT, LateralDirectionality.LEFT).si > 0.0;
74 boolean rightLane = infra.getLegalLaneChangePossibility(RelativeLane.CURRENT, LateralDirectionality.RIGHT).si > 0.0;
75
76 if (rightLane && mandatoryDesire.right() >= 0.0)
77 {
78 PerceptionCollectable<HeadwayGtu, LaneBasedGtu> followers = neighbors.getFollowers(RelativeLane.CURRENT);
79 if (!followers.isEmpty())
80 {
81 double rho = parameters.getParameter(RHO);
82 HeadwayGtu follower = followers.first();
83 double rhoFollower = follower.getParameters().getParameter(RHO);
84 if (rhoFollower * sigma > rho)
85 {
86 dRight = rhoFollower * sigma;
87 }
88 }
89 }
90
91 if (leftLane && mandatoryDesire.left() <= 0.0)
92 {
93 PerceptionCollectable<HeadwayGtu, LaneBasedGtu> followers = neighbors.getFollowers(RelativeLane.LEFT);
94 if (followers != null && !followers.isEmpty())
95 {
96 double rho;
97 PerceptionCollectable<HeadwayGtu, LaneBasedGtu> leaders = neighbors.getLeaders(RelativeLane.LEFT);
98 if (leaders != null && !leaders.isEmpty())
99 {
100 HeadwayGtu leader = leaders.first();
101 Speed vDes = Try.assign(() -> perception.getGtu().getDesiredSpeed(),
102 "Could not obtain GTU from perception.");
103 Speed vGain = parameters.getParameter(VGAIN);
104 Length x0 = parameters.getParameter(LOOKAHEAD);
105 rho = Tailgating.socialPressure(ownSpeed, vCong, vDes, leader.getSpeed(), vGain, leader.getDistance(),
106 x0);
107 }
108 else
109 {
110 rho = 0.0;
111 }
112 HeadwayGtu follower = followers.first();
113 Speed vGainFollower = follower.getParameters().getParameter(VGAIN);
114 Length x0Follower = follower.getParameters().getParameter(LOOKAHEAD);
115 double rhoFollower = Tailgating.socialPressure(follower.getSpeed(), vCong, follower.getDesiredSpeed(),
116 ownSpeed, vGainFollower, follower.getDistance(), x0Follower);
117 if (rhoFollower * sigma > rho)
118 {
119 dLeft = -rhoFollower * sigma;
120 }
121 }
122 }
123 }
124 return new Desire(dLeft, dRight);
125 }
126
127 @Override
128 public final String toString()
129 {
130 return "IncentiveSocioSpeed";
131 }
132
133 }