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
/****************************************************************************/
9
// Scalable model based on Krauß by Peter Wagner
10
/****************************************************************************/
11
// SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
12
// Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
13
/****************************************************************************/
14
//
15
// This file is part of SUMO.
16
// SUMO is free software: you can redistribute it and/or modify
17
// it under the terms of the GNU General Public License as published by
18
// the Free Software Foundation, either version 3 of the License, or
19
// (at your option) any later version.
20
//
21
/****************************************************************************/
22
23
24
// ===========================================================================
25
// included modules
26
// ===========================================================================
27
#ifdef _MSC_VER
28
#include <
windows_config.h
>
29
#else
30
#include <
config.h
>
31
#endif
32
33
#include <
microsim/MSVehicle.h
>
34
#include <
microsim/MSLane.h
>
35
#include "
MSCFModel_PWag2009.h
"
36
#include <
utils/common/RandHelper.h
>
37
38
39
// ===========================================================================
40
// method definitions
41
// ===========================================================================
42
MSCFModel_PWag2009::MSCFModel_PWag2009
(
const
MSVehicleType
* vtype,
SUMOReal
accel,
SUMOReal
decel,
43
SUMOReal
dawdle,
SUMOReal
headwayTime,
SUMOReal
tauLast,
SUMOReal
apProb)
44
:
MSCFModel
(vtype, accel, decel, headwayTime), myDawdle(dawdle),
45
myTauDecel(decel* headwayTime), myDecelDivTau(decel / headwayTime), myTauLastDecel(decel* tauLast),
46
myActionPointProbability(apProb) {
47
}
48
49
50
MSCFModel_PWag2009::~MSCFModel_PWag2009
() {}
51
52
53
SUMOReal
54
MSCFModel_PWag2009::moveHelper
(
MSVehicle
*
const
veh,
SUMOReal
vPos)
const
{
55
const
SUMOReal
vNext =
MSCFModel::moveHelper
(veh, vPos);
56
VehicleVariables
* vars = (
VehicleVariables
*)veh->
getCarFollowVariables
();
57
SUMOReal
apref =
SPEED2ACCEL
(vNext - veh->
getSpeed
());
58
vars->
aOld
= apref;
59
return
vNext;
60
}
61
62
// in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle
63
// myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be
64
// more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have
65
// seen so far in data ...
66
67
SUMOReal
68
MSCFModel_PWag2009::followSpeed
(
const
MSVehicle
*
const
veh,
SUMOReal
speed,
SUMOReal
gap,
SUMOReal
predSpeed,
SUMOReal
/*predMaxDecel*/
)
const
{
69
if
(predSpeed == 0 && gap < 0.01) {
70
return
0;
71
}
72
const
SUMOReal
vsafe = -
myTauLastDecel
+ sqrt(
myTauLastDecel
*
myTauLastDecel
+ predSpeed * predSpeed + 2.0 *
myDecel
* gap);
73
const
SUMOReal
asafe =
SPEED2ACCEL
(vsafe - speed);
74
VehicleVariables
* vars = (
VehicleVariables
*)veh->
getCarFollowVariables
();
75
SUMOReal
apref = vars->
aOld
;
76
if
(apref <= asafe &&
RandHelper::rand
() <=
myActionPointProbability
*
TS
) {
77
apref =
myDecelDivTau
* (gap + (predSpeed - speed) *
myHeadwayTime
- speed *
myHeadwayTime
) / (speed +
myTauDecel
);
78
apref =
MIN2
(apref,
myAccel
);
79
apref =
MAX2
(apref, -
myDecel
);
80
apref +=
myDawdle
*
RandHelper::rand
((
SUMOReal
) - 1., (
SUMOReal
)1.);
81
}
82
if
(apref > asafe) {
83
apref = asafe;
84
}
85
return
MAX2
((
SUMOReal
)0, speed +
ACCEL2SPEED
(apref));
86
}
87
88
// uses the safe speed and preferred acceleration with the same NORMAL tau to compute stopSpeed
89
SUMOReal
90
MSCFModel_PWag2009::stopSpeed
(
const
MSVehicle
*
const
veh,
SUMOReal
gap)
const
{
91
if
(gap < 0.01) {
92
return
0;
93
}
94
const
SUMOReal
vsafe = -
myTauDecel
+ sqrt(
myTauDecel
*
myTauDecel
+ 2.0 *
myDecel
* gap);
95
const
SUMOReal
speed = veh->
getSpeed
();
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
}
build
buildd
sumo-0.16.0~dfsg
src
microsim
cfmodels
MSCFModel_PWag2009.cpp
Generated on Tue Apr 16 2013 01:32:17 for SUMO - Simulation of Urban MObility by
1.8.3.1