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_Krauss.cpp
Go to the documentation of this file.
1
/****************************************************************************/
11
// Krauss car-following model, with acceleration decrease and faster start
12
/****************************************************************************/
13
// SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
14
// Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
15
/****************************************************************************/
16
//
17
// This file is part of SUMO.
18
// SUMO is free software: you can redistribute it and/or modify
19
// it under the terms of the GNU General Public License as published by
20
// the Free Software Foundation, either version 3 of the License, or
21
// (at your option) any later version.
22
//
23
/****************************************************************************/
24
25
26
// ===========================================================================
27
// included modules
28
// ===========================================================================
29
#ifdef _MSC_VER
30
#include <
windows_config.h
>
31
#else
32
#include <
config.h
>
33
#endif
34
35
#include <
microsim/MSVehicle.h
>
36
#include <
microsim/MSLane.h
>
37
#include <
microsim/MSGlobals.h
>
38
#include "
MSCFModel_Krauss.h
"
39
#include <
microsim/MSAbstractLaneChangeModel.h
>
40
#include <
utils/common/RandHelper.h
>
41
42
43
// ===========================================================================
44
// method definitions
45
// ===========================================================================
46
MSCFModel_Krauss::MSCFModel_Krauss
(
const
MSVehicleType
* vtype,
SUMOReal
accel,
SUMOReal
decel,
47
SUMOReal
dawdle,
SUMOReal
headwayTime)
48
:
MSCFModel_KraussOrig1
(vtype, accel, decel, dawdle, headwayTime) {
49
}
50
51
52
MSCFModel_Krauss::~MSCFModel_Krauss
() {}
53
54
55
SUMOReal
56
MSCFModel_Krauss::followSpeed
(
const
MSVehicle
*
const
veh,
const
SUMOReal
speed,
SUMOReal
gap,
SUMOReal
predSpeed,
SUMOReal
predMaxDecel)
const
{
57
return
MIN2
(
_vsafe
(gap, predSpeed, predMaxDecel),
maxNextSpeed
(speed, veh));
58
}
59
60
61
SUMOReal
62
MSCFModel_Krauss::stopSpeed
(
const
MSVehicle
*
const
veh,
const
SUMOReal
speed,
SUMOReal
gap)
const
{
63
return
MIN2
(
_vsafe
(gap, 0, 0),
maxNextSpeed
(speed, veh));
64
}
65
66
67
SUMOReal
68
MSCFModel_Krauss::dawdle
(
SUMOReal
speed)
const
{
69
// generate random number out of [0,1]
70
SUMOReal
random =
RandHelper::rand
();
71
// Dawdle.
72
if
(speed <
myAccel
) {
73
// we should not prevent vehicles from driving just due to dawdling
74
// if someone is starting, he should definitely start
75
// (but what about slow-to-start?)!!!
76
speed -=
ACCEL2SPEED
(
myDawdle
* speed * random);
77
}
else
{
78
speed -=
ACCEL2SPEED
(
myDawdle
*
myAccel
* random);
79
}
80
return
MAX2
(
SUMOReal
(0), speed);
81
}
82
83
85
SUMOReal
86
MSCFModel_Krauss::_vsafe
(
SUMOReal
gap,
SUMOReal
predSpeed,
SUMOReal
predMaxDecel)
const
{
87
if
(predSpeed < predMaxDecel) {
88
// avoid discretization error at low speeds
89
predSpeed = 0;
90
}
91
if
(predSpeed == 0) {
92
if
(gap < 0.01) {
93
return
0;
94
}
95
return
(
SUMOReal
)(-
myTauDecel
+ sqrt(
myTauDecel
*
myTauDecel
+ 2. *
myDecel
* gap));
96
}
97
// follow the leader
98
// g=gap, t=myHeadwayTime, a=predMaxDecel, b=myDecel, v=predSpeed, x=vSafe
99
// Solution approach: equal distances after leader and follower have stopped (partly discretized).
100
// g + (v^2 - a*v)/(2*a) = x*t + (x^2 - b*x)/(2*b) + 0.5
101
// The term (+ 0.5) gives an upper bound for the follower stopping distance to handle discretization errors.
102
// Unfortunately, the solution approach is not correct when b > a since the
103
// follower path may cross the leader path even with equal stopping distances.
104
// As a workaround we lower the value of b to get a collision free model
105
// This approach should be refined to get a higher (still safe) following speed.
106
const
SUMOReal
egoDecel =
MIN2
(
myDecel
, predMaxDecel);
107
const
SUMOReal
result = (
SUMOReal
)(0.5 * sqrt(
108
4.0 * egoDecel * (2.0 * gap + predSpeed * predSpeed / predMaxDecel - predSpeed - 1.0)
109
+ (egoDecel * (2.0 *
myHeadwayTime
- 1.0))
110
* (egoDecel * (2.0 *
myHeadwayTime
- 1.0)))
111
+
myDecel
* (0.5 -
myHeadwayTime
));
112
if
(
ISNAN
(result)) {
113
return
0;
114
}
else
{
115
return
result;
116
}
117
}
118
119
120
MSCFModel
*
121
MSCFModel_Krauss::duplicate
(
const
MSVehicleType
* vtype)
const
{
122
return
new
MSCFModel_Krauss
(vtype,
myAccel
,
myDecel
,
myDawdle
,
myHeadwayTime
);
123
}
124
125
126
//void MSCFModel::saveState(std::ostream &os) {}
127
build
buildd
sumo-0.18~dfsg
src
microsim
cfmodels
MSCFModel_Krauss.cpp
Generated on Wed Oct 23 2013 01:15:09 for SUMO - Simulation of Urban MObility by
1.8.4