View Javadoc
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   * Regular strategical planner with LMRS using Fuller perception.
56   * <p>
57   * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
58   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
59   * <p>
60   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 6 nov. 2018 <br>
61   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
62   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
63   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
64   */
65  
66  public class SdmStrategicalPlannerFactory implements StrategicalPlannerFactorySupplierOD
67  {
68  
69      /** Car factory. */
70      private final LaneBasedStrategicalPlannerFactory<?> carFactory;
71  
72      /** Truck factory. */
73      private final LaneBasedStrategicalPlannerFactory<?> truckFactory;
74  
75      /**
76       * Constructor.
77       * @param network the network
78       * @param stream StreamInterface; random number stream
79       * @param simulation SdmSimulation; simulation to obtain properties from
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         // accelerationIncentives.add(new AccelerationNoRightOvertake());
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     /** {@inheritDoc} */
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      * Factory for perception with Fuller.
139      * <p>
140      * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
141      * <br>
142      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
143      * <p>
144      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 6 nov. 2018 <br>
145      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
146      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
147      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
148      */
149     private class SdmPerception implements PerceptionFactory
150     {
151         /** {@inheritDoc} */
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         /** {@inheritDoc} */
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 }