SUMO - Simulation of Urban MObility
MSCFModel_PWag2009.cpp
Go to the documentation of this file.
1 /****************************************************************************/
10 // Scalable model based on Krauss by Peter Wagner
11 /****************************************************************************/
12 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
13 // Copyright (C) 2010-2017 DLR (http://www.dlr.de/) and contributors
14 /****************************************************************************/
15 //
16 // This file is part of SUMO.
17 // SUMO is free software: you can redistribute it and/or modify
18 // it under the terms of the GNU General Public License as published by
19 // the Free Software Foundation, either version 3 of the License, or
20 // (at your option) any later version.
21 //
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #ifdef _MSC_VER
29 #include <windows_config.h>
30 #else
31 #include <config.h>
32 #endif
33 
34 #include <microsim/MSVehicle.h>
35 #include <microsim/MSLane.h>
36 #include "MSCFModel_PWag2009.h"
38 
39 
40 // ===========================================================================
41 // method definitions
42 // ===========================================================================
43 MSCFModel_PWag2009::MSCFModel_PWag2009(const MSVehicleType* vtype, double accel, double decel,
44  double emergencyDecel,
45  double dawdle, double headwayTime, double tauLast, double apProb) :
46  MSCFModel(vtype, accel, decel, emergencyDecel, decel, headwayTime), myDawdle(dawdle),
47  myTauDecel(decel * headwayTime),
48  myDecelDivTau(decel / headwayTime),
49  myTauLastDecel(decel * tauLast),
50  myActionPointProbability(apProb) {
51 }
52 
53 
55 
56 
57 double
58 MSCFModel_PWag2009::moveHelper(MSVehicle* const veh, double vPos) const {
59  const double vNext = MSCFModel::moveHelper(veh, vPos);
61  double apref = SPEED2ACCEL(vNext - veh->getSpeed());
62  vars->aOld = apref;
63  return vNext;
64 }
65 
66 // in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle
67 // myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be
68 // more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have
69 // seen so far in data ...
70 
71 double
72 MSCFModel_PWag2009::followSpeed(const MSVehicle* const veh, double speed, double gap, double predSpeed, double /*predMaxDecel*/) const {
73  if (predSpeed == 0 && gap < 0.01) {
74  return 0;
75  }
76  const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
77  const double asafe = SPEED2ACCEL(vsafe - speed);
79  double apref = vars->aOld;
80  if (apref <= asafe && RandHelper::rand() <= myActionPointProbability * TS) {
81  apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
82  apref = MIN2(apref, myAccel);
83  apref = MAX2(apref, -myDecel);
84  apref += myDawdle * RandHelper::rand((double) - 1., (double)1.);
85  }
86  if (apref > asafe) {
87  apref = asafe;
88  }
89  return MAX2(0., speed + ACCEL2SPEED(apref));
90 }
91 
92 // uses the safe speed and preferred acceleration with the same NORMAL tau to compute stopSpeed
93 double
94 MSCFModel_PWag2009::stopSpeed(const MSVehicle* const /* veh */, const double speed, double gap) const {
95  if (gap < 0.01) {
96  return 0.;
97  }
98  const double vsafe = -myTauDecel + sqrt(myTauDecel * myTauDecel + 2.0 * myDecel * gap);
99  const double asafe = SPEED2ACCEL(vsafe - speed);
100 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
101  double apref = myDecelDivTau * (gap - 2 * speed * myHeadwayTime) / (speed + myTauDecel);
102  if (apref <= asafe) {
103  apref = MIN2(apref, myAccel);
104  apref = MAX2(apref, -myDecel);
105  } else {
106  apref = asafe;
107  }
108  return MAX2(0., vsafe + ACCEL2SPEED(apref));
109 }
110 
111 // this method should not do anything, since followSpeed() has taken care of dawdling already...
112 double
113 MSCFModel_PWag2009::dawdle(double speed) const {
114  return speed;
115 // return MAX2(0., speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
116 }
117 
118 // eventually, this method isn't needed anymore
119 //double
120 //MSCFModel_PWag2009::_v(const MSVehicle* const veh, double speed, double gap, double predSpeed) const {
121 // if (predSpeed == 0 && gap < 0.01) {
122 // return 0;
123 // }
124 // const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
125 // const double asafe = SPEED2ACCEL(vsafe - speed);
126 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
127 // double apref = vars->aOld;
128 // if (apref <= asafe && RandHelper::rand() <= myActionPointProbability * TS) {
129 // apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
130 // if (apref>myAccel)
131 // apref = myAccel;
132 // if (apref<-myDecel)
133 // apref = -myDecel;
134 // apref += myDawdle * RandHelper::rand((double) - 1., (double)1.);
135 // }
136 // if (apref > asafe)
137 // apref = asafe;
138 // return MAX2(0, vsafe+ACCEL2SPEED(apref));
139 //}
140 //
141 
142 MSCFModel*
145 }
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:83
double myTauDecel
The precomputed value for myDecel*myTau.
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle&#39;s car following model variables.
Definition: MSVehicle.h:805
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:61
The car-following model abstraction.
Definition: MSCFModel.h:60
~MSCFModel_PWag2009()
Destructor.
double myAccel
The vehicle&#39;s maximum acceleration [m/s^2].
Definition: MSCFModel.h:466
T MAX2(T a, T b)
Definition: StdDefs.h:70
virtual double moveHelper(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
Definition: MSCFModel.cpp:147
#define TS
Definition: SUMOTime.h:52
#define SPEED2ACCEL(x)
Definition: SUMOTime.h:63
The car-following model and parameter.
Definition: MSVehicleType.h:74
static double rand()
Returns a random real number in [0, 1)
Definition: RandHelper.h:62
double myDecelDivTau
The precomputed value for myDecel/myTau.
T MIN2(T a, T b)
Definition: StdDefs.h:64
double myDecel
The vehicle&#39;s maximum deceleration [m/s^2].
Definition: MSCFModel.h:469
double myTauLastDecel
The precomputed value for (minimum headway time)*myDecel.
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
double stopSpeed(const MSVehicle *const veh, const double speed, double gap2pred) const
Computes the vehicle&#39;s safe speed for approaching a non-moving obstacle (no dawdling) ...
double myEmergencyDecel
The vehicle&#39;s maximum emergency deceleration [m/s^2].
Definition: MSCFModel.h:471
double dawdle(double speed) const
Applies driver imperfection (dawdling / sigma)
MSCFModel_PWag2009(const MSVehicleType *vtype, double accel, double decel, double emergencyDecel, double dawdle, double headwayTime, double tauLast, double apProb)
Constructor.
double myActionPointProbability
The probability for any action.
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel) const
Computes the vehicle&#39;s safe speed (no dawdling)
double myHeadwayTime
The driver&#39;s desired time headway (aka reaction time tau) [s].
Definition: MSCFModel.h:476
double getSpeed() const
Returns the vehicle&#39;s current speed.
Definition: MSVehicle.h:442
double moveHelper(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.