SUMO - Simulation of Urban MObility
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
MSCFModel_PWag2009.cpp
Go to the documentation of this file.
1
/****************************************************************************/
10
// Scalable model based on Krauß by Peter Wagner
11
/****************************************************************************/
12
// SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
13
// Copyright (C) 2010-2014 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
"
37
#include <
utils/common/RandHelper.h
>
38
39
40
// ===========================================================================
41
// method definitions
42
// ===========================================================================
43
MSCFModel_PWag2009::MSCFModel_PWag2009
(
const
MSVehicleType
* vtype,
SUMOReal
accel,
SUMOReal
decel,
44
SUMOReal
dawdle,
SUMOReal
headwayTime,
SUMOReal
tauLast,
SUMOReal
apProb)
45
:
MSCFModel
(vtype, accel, decel, headwayTime), myDawdle(dawdle),
46
myTauDecel(decel* headwayTime), myDecelDivTau(decel / headwayTime), myTauLastDecel(decel* tauLast),
47
myActionPointProbability(apProb) {
48
}
49
50
51
MSCFModel_PWag2009::~MSCFModel_PWag2009
() {}
52
53
54
SUMOReal
55
MSCFModel_PWag2009::moveHelper
(
MSVehicle
*
const
veh,
SUMOReal
vPos)
const
{
56
const
SUMOReal
vNext =
MSCFModel::moveHelper
(veh, vPos);
57
VehicleVariables
* vars = (
VehicleVariables
*)veh->
getCarFollowVariables
();
58
SUMOReal
apref =
SPEED2ACCEL
(vNext - veh->
getSpeed
());
59
vars->aOld = apref;
60
return
vNext;
61
}
62
63
// in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle
64
// myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be
65
// more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have
66
// seen so far in data ...
67
68
SUMOReal
69
MSCFModel_PWag2009::followSpeed
(
const
MSVehicle
*
const
veh,
SUMOReal
speed,
SUMOReal
gap,
SUMOReal
predSpeed,
SUMOReal
/*predMaxDecel*/
)
const
{
70
if
(predSpeed == 0 && gap < 0.01) {
71
return
0;
72
}
73
const
SUMOReal
vsafe = -
myTauLastDecel
+ sqrt(
myTauLastDecel
*
myTauLastDecel
+ predSpeed * predSpeed + 2.0 *
myDecel
* gap);
74
const
SUMOReal
asafe =
SPEED2ACCEL
(vsafe - speed);
75
VehicleVariables
* vars = (
VehicleVariables
*)veh->
getCarFollowVariables
();
76
SUMOReal
apref = vars->aOld;
77
if
(apref <= asafe &&
RandHelper::rand
() <=
myActionPointProbability
*
TS
) {
78
apref =
myDecelDivTau
* (gap + (predSpeed - speed) *
myHeadwayTime
- speed *
myHeadwayTime
) / (speed +
myTauDecel
);
79
apref =
MIN2
(apref,
myAccel
);
80
apref =
MAX2
(apref, -
myDecel
);
81
apref +=
myDawdle
*
RandHelper::rand
((
SUMOReal
) - 1., (
SUMOReal
)1.);
82
}
83
if
(apref > asafe) {
84
apref = asafe;
85
}
86
return
MAX2
((
SUMOReal
)0, speed +
ACCEL2SPEED
(apref));
87
}
88
89
// uses the safe speed and preferred acceleration with the same NORMAL tau to compute stopSpeed
90
SUMOReal
91
MSCFModel_PWag2009::stopSpeed
(
const
MSVehicle
*
const
/* veh */
,
const
SUMOReal
speed,
SUMOReal
gap)
const
{
92
if
(gap < 0.01) {
93
return
0;
94
}
95
const
SUMOReal
vsafe = -
myTauDecel
+ sqrt(
myTauDecel
*
myTauDecel
+ 2.0 *
myDecel
* gap);
96
const
SUMOReal
asafe =
SPEED2ACCEL
(vsafe - speed);
97
// VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
98
SUMOReal
apref =
myDecelDivTau
* (gap - 2 * speed *
myHeadwayTime
) / (speed +
myTauDecel
);
99
if
(apref <= asafe) {
100
apref =
MIN2
(apref,
myAccel
);
101
apref =
MAX2
(apref, -
myDecel
);
102
}
else
{
103
apref = asafe;
104
}
105
return
MAX2
((
SUMOReal
)0, vsafe +
ACCEL2SPEED
(apref));
106
}
107
108
// this method should not do anything, since followSpeed() has taken care of dawdling already...
109
SUMOReal
110
MSCFModel_PWag2009::dawdle
(
SUMOReal
speed)
const
{
111
return
speed;
112
// return MAX2(SUMOReal(0), speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
113
}
114
115
// eventually, this method isn't needed anymore
116
//SUMOReal
117
//MSCFModel_PWag2009::_v(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed) const {
118
// if (predSpeed == 0 && gap < 0.01) {
119
// return 0;
120
// }
121
// const SUMOReal vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
122
// const SUMOReal asafe = SPEED2ACCEL(vsafe - speed);
123
// VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
124
// SUMOReal apref = vars->aOld;
125
// if (apref <= asafe && RandHelper::rand() <= myActionPointProbability * TS) {
126
// apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
127
// if (apref>myAccel)
128
// apref = myAccel;
129
// if (apref<-myDecel)
130
// apref = -myDecel;
131
// apref += myDawdle * RandHelper::rand((SUMOReal) - 1., (SUMOReal)1.);
132
// }
133
// if (apref > asafe)
134
// apref = asafe;
135
// return MAX2((SUMOReal)0, vsafe+ACCEL2SPEED(apref));
136
//}
137
//
138
139
MSCFModel
*
140
MSCFModel_PWag2009::duplicate
(
const
MSVehicleType
* vtype)
const
{
141
return
new
MSCFModel_PWag2009
(vtype,
myAccel
,
myDecel
,
myDawdle
,
myHeadwayTime
,
myTauLastDecel
/
myDecel
,
myActionPointProbability
);
142
}
tmp
buildd
sumo-0.21.0+dfsg
src
microsim
cfmodels
MSCFModel_PWag2009.cpp
Generated on Thu Nov 20 2014 19:49:54 for SUMO - Simulation of Urban MObility by
1.8.1.2