View Javadoc
1   package org.opentrafficsim.demo.conflict;
2   
3   import java.awt.Dimension;
4   import java.io.Serializable;
5   import java.net.URL;
6   import java.rmi.RemoteException;
7   import java.util.ArrayList;
8   import java.util.LinkedHashMap;
9   import java.util.LinkedHashSet;
10  import java.util.List;
11  import java.util.Map;
12  import java.util.Set;
13  
14  import javax.naming.NamingException;
15  
16  import org.djunits.unit.AccelerationUnit;
17  import org.djunits.unit.DurationUnit;
18  import org.djunits.unit.FrequencyUnit;
19  import org.djunits.unit.LengthUnit;
20  import org.djunits.unit.SpeedUnit;
21  import org.djunits.value.vdouble.scalar.Acceleration;
22  import org.djunits.value.vdouble.scalar.Duration;
23  import org.djunits.value.vdouble.scalar.Frequency;
24  import org.djunits.value.vdouble.scalar.Length;
25  import org.djunits.value.vdouble.scalar.Speed;
26  import org.djunits.value.vdouble.scalar.Time;
27  import org.djutils.io.URLResource;
28  import org.opentrafficsim.base.parameters.ParameterException;
29  import org.opentrafficsim.base.parameters.ParameterSet;
30  import org.opentrafficsim.base.parameters.ParameterTypes;
31  import org.opentrafficsim.base.parameters.Parameters;
32  import org.opentrafficsim.core.distributions.Generator;
33  import org.opentrafficsim.core.distributions.ProbabilityException;
34  import org.opentrafficsim.core.dsol.AbstractOTSModel;
35  import org.opentrafficsim.core.dsol.OTSAnimator;
36  import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
37  import org.opentrafficsim.core.gtu.GTUCharacteristics;
38  import org.opentrafficsim.core.gtu.GTUDirectionality;
39  import org.opentrafficsim.core.gtu.GTUException;
40  import org.opentrafficsim.core.gtu.GTUType;
41  import org.opentrafficsim.core.idgenerator.IdGenerator;
42  import org.opentrafficsim.core.network.Node;
43  import org.opentrafficsim.core.network.route.Route;
44  import org.opentrafficsim.core.parameters.ParameterFactory;
45  import org.opentrafficsim.demo.conflict.BusStreetDemo.BusStreetModel;
46  import org.opentrafficsim.draw.core.OTSDrawingException;
47  import org.opentrafficsim.road.gtu.generator.GeneratorPositions;
48  import org.opentrafficsim.road.gtu.generator.LaneBasedGTUGenerator;
49  import org.opentrafficsim.road.gtu.generator.LaneBasedGTUGenerator.RoomChecker;
50  import org.opentrafficsim.road.gtu.generator.TTCRoomChecker;
51  import org.opentrafficsim.road.gtu.generator.characteristics.LaneBasedGTUCharacteristics;
52  import org.opentrafficsim.road.gtu.generator.characteristics.LaneBasedGTUCharacteristicsGenerator;
53  import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
54  import org.opentrafficsim.road.gtu.lane.VehicleModel;
55  import org.opentrafficsim.road.gtu.lane.perception.categories.DirectBusStopPerception;
56  import org.opentrafficsim.road.gtu.lane.tactical.LaneBasedTacticalPlannerFactory;
57  import org.opentrafficsim.road.gtu.lane.tactical.following.AbstractIDM;
58  import org.opentrafficsim.road.gtu.lane.tactical.following.IDMPlus;
59  import org.opentrafficsim.road.gtu.lane.tactical.lmrs.AccelerationBusStop;
60  import org.opentrafficsim.road.gtu.lane.tactical.lmrs.DefaultLMRSPerceptionFactory;
61  import org.opentrafficsim.road.gtu.lane.tactical.lmrs.IncentiveBusStop;
62  import org.opentrafficsim.road.gtu.lane.tactical.lmrs.LMRS;
63  import org.opentrafficsim.road.gtu.lane.tactical.pt.BusSchedule;
64  import org.opentrafficsim.road.gtu.lane.tactical.util.ConflictUtil;
65  import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Cooperation;
66  import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.GapAcceptance;
67  import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.LmrsParameters;
68  import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Synchronization;
69  import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Tailgating;
70  import org.opentrafficsim.road.gtu.strategical.LaneBasedStrategicalPlanner;
71  import org.opentrafficsim.road.gtu.strategical.LaneBasedStrategicalPlannerFactory;
72  import org.opentrafficsim.road.gtu.strategical.route.LaneBasedStrategicalRoutePlannerFactory;
73  import org.opentrafficsim.road.network.OTSRoadNetwork;
74  import org.opentrafficsim.road.network.factory.xml.parser.XmlNetworkLaneParser;
75  import org.opentrafficsim.road.network.lane.CrossSectionLink;
76  import org.opentrafficsim.road.network.lane.DirectedLanePosition;
77  import org.opentrafficsim.road.network.lane.Lane;
78  import org.opentrafficsim.road.network.lane.object.BusStop;
79  import org.opentrafficsim.swing.gui.OTSAnimationPanel;
80  import org.opentrafficsim.swing.gui.OTSSimulationApplication;
81  
82  import nl.tudelft.simulation.dsol.SimRuntimeException;
83  import nl.tudelft.simulation.jstats.streams.MersenneTwister;
84  import nl.tudelft.simulation.jstats.streams.StreamInterface;
85  import nl.tudelft.simulation.language.DSOLException;
86  
87  /**
88   * <p>
89   * Copyright (c) 2013-2022 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
90   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
91   * <p>
92   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 11 dec. 2016 <br>
93   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
94   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
95   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
96   */
97  public class BusStreetDemo extends OTSSimulationApplication<BusStreetModel>
98  {
99      /** */
100     private static final long serialVersionUID = 20161211L;
101 
102     /**
103      * Create a CrossingTrafficLights Swing application.
104      * @param title String; the title of the Frame
105      * @param panel OTSAnimationPanel; the tabbed panel to display
106      * @param model BusStreetModel; the model
107      * @throws OTSDrawingException on animation error
108      */
109     public BusStreetDemo(final String title, final OTSAnimationPanel panel, final BusStreetModel model)
110             throws OTSDrawingException
111     {
112         super(model, panel);
113         OTSRoadNetwork network = model.getNetwork();
114         System.out.println(network.getLinkMap());
115     }
116 
117     /**
118      * Main program.
119      * @param args String[]; the command line arguments (not used)
120      */
121     public static void main(final String[] args)
122     {
123         demo(true);
124     }
125 
126     /**
127      * Start the demo.
128      * @param exitOnClose boolean; when running stand-alone: true; when running as part of a demo: false
129      */
130     public static void demo(final boolean exitOnClose)
131     {
132         try
133         {
134             OTSAnimator simulator = new OTSAnimator("BusStreetDemo");
135             BusStreetModel busModel = new BusStreetModel(simulator);
136             simulator.initialize(Time.ZERO, Duration.ZERO, Duration.instantiateSI(3600.0), busModel);
137             OTSAnimationPanel animationPanel = new OTSAnimationPanel(busModel.getNetwork().getExtent(), new Dimension(800, 600),
138                     simulator, busModel, DEFAULT_COLORER, busModel.getNetwork());
139             BusStreetDemo app = new BusStreetDemo("Bus street demo", animationPanel, busModel);
140             app.setExitOnClose(exitOnClose);
141             animationPanel.enableSimulationControlButtons();
142         }
143         catch (SimRuntimeException | NamingException | RemoteException | OTSDrawingException | DSOLException exception)
144         {
145             exception.printStackTrace();
146         }
147     }
148 
149     /**
150      * The simulation model.
151      */
152     public static class BusStreetModel extends AbstractOTSModel
153     {
154         /** */
155         private static final long serialVersionUID = 20161211L;
156 
157         /** The network. */
158         private OTSRoadNetwork network;
159 
160         /**
161          * @param simulator OTSSimulatorInterface; the simulator for this model
162          */
163         public BusStreetModel(final OTSSimulatorInterface simulator)
164         {
165             super(simulator);
166         }
167 
168         /** {@inheritDoc} */
169         @Override
170         public void constructModel() throws SimRuntimeException
171         {
172             Map<String, StreamInterface> streams = new LinkedHashMap<>();
173             streams.put("generation", new MersenneTwister(100L));
174             getStreamInformation().addStream("generation", streams.get("generation"));
175 
176             try
177             {
178                 URL xmlURL = URLResource.getResource("/resources/conflict/BusStreet.xml");
179                 this.network = new OTSRoadNetwork("BusStreet", true, getSimulator());
180                 XmlNetworkLaneParser.build(xmlURL, this.network, true);
181 
182                 // Add bus stops
183                 Lane lane = ((CrossSectionLink) this.network.getLink("B1B2")).getLanes().get(0);
184                 BusStop stop = new BusStop("Cafe Boszicht.1", lane, lane.getLength(), "Cafe Boszicht", this.simulator);
185                 Set<String> lines1 = new LinkedHashSet<>();
186                 lines1.add("1");
187                 stop.setLines(lines1);
188 
189                 lane = ((CrossSectionLink) this.network.getLink("C1C2")).getLanes().get(0);
190                 stop = new BusStop("Cafe Boszicht.2", lane, lane.getLength(), "Cafe Boszicht", this.simulator);
191                 Set<String> lines2 = new LinkedHashSet<>();
192                 lines2.add("2");
193                 stop.setLines(lines2);
194 
195                 lane = ((CrossSectionLink) this.network.getLink("EF")).getLanes().get(0);
196                 stop = new BusStop("Herberg De Deugd", lane, new Length(75.0, LengthUnit.SI), "Herberg De Deugd",
197                         this.simulator);
198                 stop.setLines(lines1);
199 
200                 lane = ((CrossSectionLink) this.network.getLink("FG")).getLanes().get(1);
201                 stop = new BusStop("De Vleeshoeve", lane, new Length(75.0, LengthUnit.SI), "De Vleeshoeve", this.simulator);
202                 Set<String> lines12 = new LinkedHashSet<>();
203                 lines12.add("1");
204                 lines12.add("2");
205                 stop.setLines(lines12);
206 
207                 lane = ((CrossSectionLink) this.network.getLink("GH")).getLanes().get(2);
208                 stop = new BusStop("Kippenboerderij De Scharrelaar", lane, new Length(50.0, LengthUnit.SI),
209                         "Kippenboerderij De Scharrelaar", this.simulator);
210                 stop.setLines(lines2);
211 
212                 lane = ((CrossSectionLink) this.network.getLink("I1I2")).getLanes().get(0);
213                 stop = new BusStop("Dorpshuys", lane, lane.getLength(), "Dorpshuys", this.simulator);
214                 stop.setLines(lines1);
215 
216                 lane = ((CrossSectionLink) this.network.getLink("K1K2")).getLanes().get(0);
217                 stop = new BusStop("De verkeerde afslag", lane, lane.getLength(), "De verkeerde afslag", this.simulator);
218                 stop.setLines(lines12);
219 
220                 makeGenerator(streams.get("generation"));
221 
222             }
223             catch (Exception exception)
224             {
225                 exception.printStackTrace();
226             }
227         }
228 
229         /** {@inheritDoc} */
230         @Override
231         public OTSRoadNetwork getNetwork()
232         {
233             return this.network;
234         }
235 
236         /**
237          * Make the generator.
238          * @param stream StreamInterface; random number stream
239          * @throws GTUException on exception
240          * @throws ParameterException on exception
241          * @throws ProbabilityException on exception
242          * @throws SimRuntimeException on exception
243          */
244         private void makeGenerator(final StreamInterface stream)
245                 throws GTUException, SimRuntimeException, ProbabilityException, ParameterException
246         {
247             Lane lane = ((CrossSectionLink) this.network.getLink("AB")).getLanes().get(0);
248             String id = lane.getId();
249             Set<DirectedLanePosition> initialLongitudinalPositions = new LinkedHashSet<>();
250             initialLongitudinalPositions
251                     .add(new DirectedLanePosition(lane, new Length(10.0, LengthUnit.SI), GTUDirectionality.DIR_PLUS));
252             Generator<Duration> headwayGenerator =
253                     new HeadwayGenerator(new Frequency(800, FrequencyUnit.PER_HOUR), this.simulator);
254             LaneBasedGTUCharacteristicsGenerator characteristicsGenerator =
255                     new CharacteristicsGenerator(this.simulator, new double[] {0.9, 0.06, 0.04}, this.network);
256             RoomChecker roomChecker = new TTCRoomChecker(new Duration(10.0, DurationUnit.SI));
257             LaneBasedGTUGenerator gen = new LaneBasedGTUGenerator(id, headwayGenerator, characteristicsGenerator,
258                     GeneratorPositions.create(initialLongitudinalPositions, stream), this.network, this.simulator, roomChecker,
259                     new IdGenerator(""));
260             gen.setInstantaneousLaneChange(true);
261         }
262 
263         /** {@inheritDoc} */
264         @Override
265         public Serializable getSourceId()
266         {
267             return "BusStreetModel";
268         }
269     }
270 
271     /**
272      * <p>
273      * Copyright (c) 2013-2022 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
274      * <br>
275      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
276      * <p>
277      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 29 jan. 2017 <br>
278      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
279      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
280      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
281      */
282     private static class HeadwayGenerator implements Generator<Duration>
283     {
284 
285         /** Demand level. */
286         private final Frequency demand;
287 
288         /** Simulator. */
289         private final OTSSimulatorInterface simulator;
290 
291         /**
292          * @param demand Frequency; demand
293          * @param simulator OTSSimulatorInterface; simulator
294          */
295         HeadwayGenerator(final Frequency demand, final OTSSimulatorInterface simulator)
296         {
297             this.demand = demand;
298             this.simulator = simulator;
299         }
300 
301         /** {@inheritDoc} */
302         @Override
303         public Duration draw() throws ProbabilityException, ParameterException
304         {
305             return new Duration(-Math.log(this.simulator.getModel().getStream("generation").nextDouble()) / this.demand.si,
306                     DurationUnit.SI);
307         }
308 
309     }
310 
311     /**
312      * <p>
313      * Copyright (c) 2013-2022 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
314      * <br>
315      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
316      * <p>
317      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 29 jan. 2017 <br>
318      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
319      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
320      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
321      */
322     public static class CharacteristicsGenerator implements LaneBasedGTUCharacteristicsGenerator
323     {
324 
325         /** Simulator. */
326         private final OTSSimulatorInterface simulator;
327 
328         /** Probabilities. */
329         private final double[] probabilities;
330 
331         /** Strategical planner factory. */
332         private final LaneBasedStrategicalPlannerFactory<LaneBasedStrategicalPlanner> plannerFactory;
333 
334         /** Route for car. */
335         private final Route carRouteN;
336 
337         /** Route for car. */
338         private final Route carRouteO;
339 
340         /** Nodes for bus, line 1. */
341         private final List<Node> busNodes1;
342 
343         /** Nodes for bus, line 2. */
344         private final List<Node> busNodes2;
345 
346         /** Short dwell time. */
347         private final Duration shortDwellTime = new Duration(15.0, DurationUnit.SI);
348 
349         /** Long dwell time. */
350         private final Duration longDwellTime = new Duration(60.0, DurationUnit.SI);
351 
352         /** The network. */
353         private OTSRoadNetwork network;
354 
355         /**
356          * @param simulator OTSSimulatorInterface; simulator
357          * @param probabilities double[]; probabilities
358          * @param network OTSRoadNetwork; network
359          */
360         public CharacteristicsGenerator(final OTSSimulatorInterface simulator, final double[] probabilities,
361                 final OTSRoadNetwork network)
362         {
363             this.simulator = simulator;
364             this.probabilities = probabilities;
365             this.network = network;
366             List<Node> carNodesN = new ArrayList<>();
367             carNodesN.add(network.getNode("A"));
368             carNodesN.add(network.getNode("B"));
369             carNodesN.add(network.getNode("C"));
370             carNodesN.add(network.getNode("D"));
371             carNodesN.add(network.getNode("E"));
372             carNodesN.add(network.getNode("F"));
373             carNodesN.add(network.getNode("G"));
374             carNodesN.add(network.getNode("H"));
375             carNodesN.add(network.getNode("I"));
376             carNodesN.add(network.getNode("J"));
377             carNodesN.add(network.getNode("K"));
378             carNodesN.add(network.getNode("L"));
379             carNodesN.add(network.getNode("M"));
380             List<Node> carNodesO = new ArrayList<>(carNodesN);
381             carNodesN.add(network.getNode("N"));
382             carNodesO.add(network.getNode("O"));
383             this.carRouteN = new Route("carN", carNodesN);
384             this.carRouteO = new Route("carO", carNodesO);
385             this.busNodes1 = new ArrayList<>();
386             this.busNodes1.add(network.getNode("A"));
387             this.busNodes1.add(network.getNode("B"));
388             this.busNodes1.add(network.getNode("B1"));
389             this.busNodes1.add(network.getNode("B2"));
390             this.busNodes1.add(network.getNode("D"));
391             this.busNodes1.add(network.getNode("E"));
392             this.busNodes1.add(network.getNode("F"));
393             this.busNodes1.add(network.getNode("G"));
394             this.busNodes1.add(network.getNode("H"));
395             this.busNodes1.add(network.getNode("I"));
396             this.busNodes1.add(network.getNode("I1"));
397             this.busNodes1.add(network.getNode("I2"));
398             this.busNodes1.add(network.getNode("J"));
399             this.busNodes1.add(network.getNode("K"));
400             this.busNodes1.add(network.getNode("K1"));
401             this.busNodes1.add(network.getNode("K2"));
402             this.busNodes1.add(network.getNode("L"));
403             this.busNodes1.add(network.getNode("M"));
404             this.busNodes1.add(network.getNode("N"));
405 
406             this.busNodes2 = new ArrayList<>();
407             this.busNodes2.add(network.getNode("A"));
408             this.busNodes2.add(network.getNode("B"));
409             this.busNodes2.add(network.getNode("C"));
410             this.busNodes2.add(network.getNode("C1"));
411             this.busNodes2.add(network.getNode("C2"));
412             this.busNodes2.add(network.getNode("E"));
413             this.busNodes2.add(network.getNode("F"));
414             this.busNodes2.add(network.getNode("G"));
415             this.busNodes2.add(network.getNode("H"));
416             this.busNodes2.add(network.getNode("I"));
417             this.busNodes2.add(network.getNode("J"));
418             this.busNodes2.add(network.getNode("K"));
419             this.busNodes2.add(network.getNode("K1"));
420             this.busNodes2.add(network.getNode("K2"));
421             this.busNodes2.add(network.getNode("K3"));
422             this.busNodes2.add(network.getNode("L"));
423             this.busNodes2.add(network.getNode("M"));
424             this.busNodes2.add(network.getNode("O"));
425 
426             this.plannerFactory =
427                     new LaneBasedStrategicalRoutePlannerFactory(new LMRSFactoryCarBus(), new ParameterFactoryCarBus());
428         }
429 
430         /** {@inheritDoc} */
431         @Override
432         public LaneBasedGTUCharacteristics draw() throws ProbabilityException, ParameterException, GTUException
433         {
434             double r = this.simulator.getModel().getStream("generation").nextDouble();
435             int classNum = r < this.probabilities[0] ? 0 : r < this.probabilities[0] + this.probabilities[1] ? 1 : 2;
436             r = this.simulator.getModel().getStream("generation").nextDouble();
437             GTUType gtuType;
438             Length length;
439             Length width;
440             Speed maximumSpeed;
441             Route route;
442             switch (classNum)
443             {
444                 case 0:
445                 {
446                     gtuType = new GTUType("CAR", this.network.getGtuType(GTUType.DEFAULTS.CAR));
447                     length = new Length(4.0, LengthUnit.SI);
448                     width = new Length(1.8, LengthUnit.SI);
449                     maximumSpeed = new Speed(200.0, SpeedUnit.KM_PER_HOUR);
450                     route = r < 0.5 ? this.carRouteN : this.carRouteO;
451                     break;
452                 }
453                 case 1:
454                 {
455                     gtuType = new GTUType("BUS1", this.network.getGtuType(GTUType.DEFAULTS.SCHEDULED_BUS));
456                     length = new Length(8.0, LengthUnit.SI);
457                     width = new Length(2.0, LengthUnit.SI);
458                     maximumSpeed = new Speed(100.0, SpeedUnit.KM_PER_HOUR);
459                     BusSchedule schedule = new BusSchedule("bus1." + this.simulator.getSimulatorTime(), this.busNodes1, "1");
460                     Time now = this.simulator.getSimulatorAbsTime();
461                     schedule.addBusStop("Cafe Boszicht.1", now.plus(new Duration(70.0, DurationUnit.SI)), this.longDwellTime,
462                             true);
463                     schedule.addBusStop("Herberg De Deugd", now.plus(new Duration(100.0, DurationUnit.SI)), this.shortDwellTime,
464                             false);
465                     schedule.addBusStop("De Vleeshoeve", now.plus(new Duration(120.0, DurationUnit.SI)), this.shortDwellTime,
466                             false);
467                     schedule.addBusStop("Dorpshuys", now.plus(new Duration(200.0, DurationUnit.SI)), this.longDwellTime, true);
468                     schedule.addBusStop("De verkeerde afslag", now.plus(new Duration(270.0, DurationUnit.SI)),
469                             this.longDwellTime, true);
470                     route = schedule;
471                     break;
472                 }
473                 case 2:
474                 {
475                     gtuType = new GTUType("BUS2", this.network.getGtuType(GTUType.DEFAULTS.SCHEDULED_BUS));
476                     length = new Length(12.0, LengthUnit.SI);
477                     width = new Length(2.0, LengthUnit.SI);
478                     maximumSpeed = new Speed(100.0, SpeedUnit.KM_PER_HOUR);
479                     BusSchedule schedule = new BusSchedule("bus2." + this.simulator.getSimulatorTime(), this.busNodes2, "2");
480                     Time now = this.simulator.getSimulatorAbsTime();
481                     schedule.addBusStop("Cafe Boszicht.2", now.plus(new Duration(80.0, DurationUnit.SI)), this.longDwellTime,
482                             true);
483                     schedule.addBusStop("De Vleeshoeve", now.plus(new Duration(110.0, DurationUnit.SI)), this.shortDwellTime,
484                             false);
485                     schedule.addBusStop("Kippenboerderij De Scharrelaar", now.plus(new Duration(180.0, DurationUnit.SI)),
486                             this.longDwellTime, false);
487                     schedule.addBusStop("De verkeerde afslag", now.plus(new Duration(260.0, DurationUnit.SI)),
488                             this.longDwellTime, true);
489                     route = schedule;
490                     break;
491                 }
492                 default:
493                     throw new RuntimeException("Reaching default of switch case.");
494             }
495 
496             GTUCharacteristics gtuCharacteristics = new GTUCharacteristics(gtuType, length, width, maximumSpeed,
497                     Acceleration.instantiateSI(3.0), Acceleration.instantiateSI(-8.0), length.times(0.5));
498 
499             return new LaneBasedGTUCharacteristics(gtuCharacteristics, this.plannerFactory, route, null, null,
500                     VehicleModel.MINMAX);
501         }
502 
503     }
504 
505     /**
506      * <p>
507      * Copyright (c) 2013-2022 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
508      * <br>
509      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
510      * <p>
511      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 29 jan. 2017 <br>
512      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
513      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
514      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
515      */
516     private static class LMRSFactoryCarBus implements LaneBasedTacticalPlannerFactory<LMRS>
517     {
518 
519         /** */
520         LMRSFactoryCarBus()
521         {
522         }
523 
524         /** {@inheritDoc} */
525         @Override
526         public final Parameters getParameters()
527         {
528             ParameterSet parameters = new ParameterSet();
529             parameters.setDefaultParameters(ParameterTypes.class);
530             parameters.setDefaultParameters(LmrsParameters.class);
531             parameters.setDefaultParameters(ConflictUtil.class);
532             parameters.setDefaultParameters(AbstractIDM.class);
533             return parameters;
534         }
535 
536         /** {@inheritDoc} */
537         @Override
538         public final LMRS create(final LaneBasedGTU gtu) throws GTUException
539         {
540             DefaultLMRSPerceptionFactory pFac = new DefaultLMRSPerceptionFactory();
541             LMRS lmrs = new LMRS(new IDMPlus(), gtu, pFac.generatePerception(gtu), Synchronization.PASSIVE, Cooperation.PASSIVE,
542                     GapAcceptance.INFORMED, Tailgating.NONE);
543             lmrs.setDefaultIncentives();
544             if (gtu.getGTUType().isOfType(GTUType.DEFAULTS.SCHEDULED_BUS))
545             {
546                 lmrs.addMandatoryIncentive(new IncentiveBusStop());
547                 lmrs.addAccelerationIncentive(new AccelerationBusStop());
548                 lmrs.getPerception().addPerceptionCategory(new DirectBusStopPerception(lmrs.getPerception()));
549             }
550             return lmrs;
551         }
552 
553     }
554 
555     /**
556      * <p>
557      * Copyright (c) 2013-2022 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
558      * <br>
559      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
560      * <p>
561      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 29 jan. 2017 <br>
562      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
563      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
564      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
565      */
566     private static class ParameterFactoryCarBus implements ParameterFactory
567     {
568 
569         /** */
570         ParameterFactoryCarBus()
571         {
572         }
573 
574         /** {@inheritDoc} */
575         @Override
576         public void setValues(final Parameters parameters, final GTUType gtuType) throws ParameterException
577         {
578 
579             parameters.setParameter(ParameterTypes.LOOKAHEAD, new Length(100.0, LengthUnit.METER));
580             if (gtuType.isOfType(GTUType.DEFAULTS.CAR))
581             {
582                 parameters.setParameter(LmrsParameters.VGAIN, new Speed(3.0, SpeedUnit.METER_PER_SECOND));
583             }
584             else if (gtuType.isOfType(GTUType.DEFAULTS.SCHEDULED_BUS))
585             {
586                 parameters.setParameter(ParameterTypes.A, new Acceleration(0.8, AccelerationUnit.METER_PER_SECOND_2));
587             }
588             else
589             {
590                 throw new RuntimeException("Unable to determine characteristics for GTU of type " + gtuType);
591             }
592 
593         }
594 
595     }
596 
597 }