1 package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2
3 import java.util.SortedSet;
4
5 import org.djunits.value.vdouble.scalar.Length;
6 import org.djunits.value.vdouble.scalar.Speed;
7 import org.opentrafficsim.core.gtu.behavioralcharacteristics.BehavioralCharacteristics;
8 import org.opentrafficsim.core.gtu.behavioralcharacteristics.ParameterException;
9 import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
10 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
11 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
12 import org.opentrafficsim.road.gtu.lane.perception.categories.InfrastructurePerception;
13 import org.opentrafficsim.road.gtu.lane.perception.categories.NeighborsPerception;
14 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGTU;
15 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
16 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Desire;
17 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.LmrsParameters;
18 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.VoluntaryIncentive;
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public class IncentiveHierarchal implements VoluntaryIncentive
33 {
34
35
36 @Override
37 public final Desire determineDesire(final BehavioralCharacteristics behavioralCharacteristics,
38 final LanePerception perception, final CarFollowingModel carFollowingModel, final Desire mandatoryDesire,
39 final Desire voluntaryDesire) throws ParameterException, OperationalPlanException
40 {
41 double dLeft = 0;
42 double dRight = 0;
43 double hierarchy = behavioralCharacteristics.getParameter(LmrsParameters.HIERARCHY);
44 NeighborsPerception neighbors = perception.getPerceptionCategory(NeighborsPerception.class);
45 Speed vDes = carFollowingModel.desiredSpeed(behavioralCharacteristics,
46 perception.getPerceptionCategory(InfrastructurePerception.class).getSpeedLimitProspect(RelativeLane.CURRENT)
47 .getSpeedLimitInfo(Length.ZERO));
48
49 if (mandatoryDesire.getRight() >= 0.0)
50 {
51 SortedSet<HeadwayGTU> followers = neighbors.getFollowers(RelativeLane.CURRENT);
52 if (!followers.isEmpty())
53 {
54 HeadwayGTU follower = followers.first();
55 Speed vDesFollower = follower.getCarFollowingModel().desiredSpeed(follower.getBehavioralCharacteristics(),
56 follower.getSpeedLimitInfo());
57 if (vDes.lt(vDesFollower))
58 {
59 dRight = hierarchy;
60 }
61 }
62 }
63
64 if (mandatoryDesire.getLeft() <= 0.0)
65 {
66 SortedSet<HeadwayGTU> followers = neighbors.getFollowers(RelativeLane.LEFT);
67 if (!followers.isEmpty())
68 {
69 HeadwayGTU follower = followers.first();
70 Speed vDesFollower = follower.getCarFollowingModel().desiredSpeed(follower.getBehavioralCharacteristics(),
71 follower.getSpeedLimitInfo());
72 if (vDes.lt(vDesFollower))
73 {
74 dLeft = -hierarchy;
75 }
76 }
77 }
78 return new Desire(dLeft, dRight);
79 }
80
81
82 @Override
83 public final String toString()
84 {
85 return "IncentiveHierarchal";
86 }
87
88 }