1 package org.opentrafficsim.demo.sdm;
2
3 import java.util.LinkedHashSet;
4 import java.util.Set;
5
6 import org.djunits.value.vdouble.scalar.Acceleration;
7 import org.djunits.value.vdouble.scalar.Duration;
8 import org.opentrafficsim.base.parameters.ParameterException;
9 import org.opentrafficsim.base.parameters.ParameterSet;
10 import org.opentrafficsim.base.parameters.ParameterTypes;
11 import org.opentrafficsim.base.parameters.Parameters;
12 import org.opentrafficsim.core.gtu.GTUException;
13 import org.opentrafficsim.core.gtu.GTUType;
14 import org.opentrafficsim.core.gtu.perception.DirectEgoPerception;
15 import org.opentrafficsim.core.network.Node;
16 import org.opentrafficsim.core.parameters.ParameterFactoryByType;
17 import org.opentrafficsim.road.gtu.generator.od.StrategicalPlannerFactorySupplierOD;
18 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
19 import org.opentrafficsim.road.gtu.lane.perception.CategoricalLanePerception;
20 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
21 import org.opentrafficsim.road.gtu.lane.perception.PerceptionFactory;
22 import org.opentrafficsim.road.gtu.lane.perception.categories.AnticipationTrafficPerception;
23 import org.opentrafficsim.road.gtu.lane.perception.categories.DirectInfrastructurePerception;
24 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.Anticipation;
25 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.DirectNeighborsPerception;
26 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.Estimation;
27 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.HeadwayGtuType;
28 import org.opentrafficsim.road.gtu.lane.perception.mental.AdaptationHeadway;
29 import org.opentrafficsim.road.gtu.lane.perception.mental.AdaptationSituationalAwareness;
30 import org.opentrafficsim.road.gtu.lane.perception.mental.Fuller;
31 import org.opentrafficsim.road.gtu.lane.perception.mental.Fuller.BehavioralAdaptation;
32 import org.opentrafficsim.road.gtu.lane.perception.mental.Task;
33 import org.opentrafficsim.road.gtu.lane.perception.mental.TaskCarFollowing;
34 import org.opentrafficsim.road.gtu.lane.tactical.following.IDMPlusFactory;
35 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.AccelerationIncentive;
36 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.IncentiveKeep;
37 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.IncentiveRoute;
38 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.IncentiveSpeedWithCourtesy;
39 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.IncentiveStayRight;
40 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.LMRSFactory;
41 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Cooperation;
42 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.GapAcceptance;
43 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.MandatoryIncentive;
44 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Synchronization;
45 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Tailgating;
46 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.VoluntaryIncentive;
47 import org.opentrafficsim.road.gtu.strategical.LaneBasedStrategicalPlannerFactory;
48 import org.opentrafficsim.road.gtu.strategical.od.Category;
49 import org.opentrafficsim.road.gtu.strategical.route.LaneBasedStrategicalRoutePlannerFactory;
50 import org.opentrafficsim.road.network.OTSRoadNetwork;
51
52 import nl.tudelft.simulation.jstats.streams.StreamInterface;
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public class SdmStrategicalPlannerFactory implements StrategicalPlannerFactorySupplierOD
67 {
68
69
70 private final LaneBasedStrategicalPlannerFactory<?> carFactory;
71
72
73 private final LaneBasedStrategicalPlannerFactory<?> truckFactory;
74
75
76
77
78
79
80
81 @SuppressWarnings("synthetic-access")
82 SdmStrategicalPlannerFactory(final OTSRoadNetwork network, final StreamInterface stream, final SdmSimulation simulation)
83 {
84 ParameterFactoryByType paramFactory = new ParameterFactoryByType();
85
86 paramFactory.addParameter(Fuller.TC, simulation.getDoubleProperty("TC"));
87 paramFactory.addParameter(Fuller.TS_CRIT, simulation.getDoubleProperty("TS_CRIT"));
88 paramFactory.addParameter(Fuller.TS_MAX, simulation.getDoubleProperty("TS_MAX"));
89
90 paramFactory.addParameter(AdaptationSituationalAwareness.SA_MIN, simulation.getDoubleProperty("SA_MIN"));
91 paramFactory.addParameter(AdaptationSituationalAwareness.SA_MAX, simulation.getDoubleProperty("SA_MAX"));
92 paramFactory.addParameter(AdaptationSituationalAwareness.TR_MAX, simulation.getDurationProperty("TR_MAX"));
93
94 paramFactory.addParameter(AdaptationHeadway.BETA_T, simulation.getDoubleProperty("BETA_T"));
95
96 paramFactory.addParameter(ParameterTypes.DT, simulation.getDurationProperty("DT"));
97 paramFactory.addParameter(ParameterTypes.TMIN, simulation.getDurationProperty("TMIN"));
98 paramFactory.addParameter(ParameterTypes.TMAX, simulation.getDurationProperty("TMAX"));
99 paramFactory.addParameter(ParameterTypes.T, simulation.getDurationProperty("TMAX"));
100 paramFactory.addParameter(network.getGtuType(GTUType.DEFAULTS.CAR), ParameterTypes.A,
101 Acceleration.createSI(simulation.getDoubleProperty("A_CAR")));
102 paramFactory.addParameter(network.getGtuType(GTUType.DEFAULTS.TRUCK), ParameterTypes.A,
103 Acceleration.createSI(simulation.getDoubleProperty("A_TRUCK")));
104 paramFactory.addParameter(ParameterTypes.B, Acceleration.createSI(simulation.getDoubleProperty("B")));
105
106 Set<MandatoryIncentive> mandatoryIncentives = new LinkedHashSet<>();
107 mandatoryIncentives.add(new IncentiveRoute());
108 Set<VoluntaryIncentive> voluntaryIncentives = new LinkedHashSet<>();
109 voluntaryIncentives.add(new IncentiveSpeedWithCourtesy());
110 voluntaryIncentives.add(new IncentiveKeep());
111 Set<AccelerationIncentive> accelerationIncentives = new LinkedHashSet<>();
112
113 PerceptionFactory perceptionFactory = new SdmPerception();
114 this.carFactory = new LaneBasedStrategicalRoutePlannerFactory(new LMRSFactory(new IDMPlusFactory(stream),
115 perceptionFactory, Synchronization.ALIGN_GAP, Cooperation.PASSIVE, GapAcceptance.INFORMED, Tailgating.NONE,
116 mandatoryIncentives, voluntaryIncentives, accelerationIncentives), paramFactory);
117
118 voluntaryIncentives = new LinkedHashSet<>(voluntaryIncentives);
119 voluntaryIncentives.add(new IncentiveStayRight());
120 this.truckFactory = new LaneBasedStrategicalRoutePlannerFactory(new LMRSFactory(new IDMPlusFactory(stream),
121 perceptionFactory, Synchronization.ALIGN_GAP, Cooperation.PASSIVE, GapAcceptance.INFORMED, Tailgating.NONE,
122 mandatoryIncentives, voluntaryIncentives, accelerationIncentives), paramFactory);
123 }
124
125
126 @Override
127 public LaneBasedStrategicalPlannerFactory<?> getFactory(final Node origin, final Node destination, final Category category,
128 final StreamInterface randomStream) throws GTUException
129 {
130 if (category.get(GTUType.class).isOfType(GTUType.DEFAULTS.TRUCK))
131 {
132 return this.truckFactory;
133 }
134 return this.carFactory;
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
149 private class SdmPerception implements PerceptionFactory
150 {
151
152 @Override
153 public Parameters getParameters() throws ParameterException
154 {
155 ParameterSet params = new ParameterSet();
156 params.setDefaultParameters(Fuller.class);
157 params.setDefaultParameters(AdaptationSituationalAwareness.class);
158 params.setDefaultParameter(AdaptationHeadway.BETA_T);
159 params.setDefaultParameter(ParameterTypes.PERCEPTION);
160 params.setDefaultParameter(ParameterTypes.LOOKBACK);
161 params.setDefaultParameter(ParameterTypes.LOOKAHEAD);
162 params.setParameter(ParameterTypes.TR, Duration.ZERO);
163 return params;
164 }
165
166
167 @Override
168 public LanePerception generatePerception(final LaneBasedGTU gtu)
169 {
170 Set<Task> tasks = new LinkedHashSet<>();
171 tasks.add(new TaskCarFollowing());
172 Set<BehavioralAdaptation> adaptations = new LinkedHashSet<>();
173 adaptations.add(new AdaptationSituationalAwareness());
174 adaptations.add(new AdaptationHeadway());
175 CategoricalLanePerception perception = new CategoricalLanePerception(gtu, new Fuller(tasks, adaptations));
176 perception.addPerceptionCategory(new DirectEgoPerception<>(perception));
177 perception.addPerceptionCategory(new AnticipationTrafficPerception(perception));
178 perception.addPerceptionCategory(new DirectInfrastructurePerception(perception));
179 perception.addPerceptionCategory(new DirectNeighborsPerception(perception,
180 new HeadwayGtuType.PerceivedHeadwayGtuType(Estimation.UNDERESTIMATION, Anticipation.CONSTANT_SPEED)));
181 return perception;
182 }
183 }
184
185 }