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.sourceforge.net/
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 "
MSCFModel_Krauss.h
"
38
#include <
microsim/MSAbstractLaneChangeModel.h
>
39
#include <
utils/common/RandHelper.h
>
40
41
42
// ===========================================================================
43
// method definitions
44
// ===========================================================================
45
MSCFModel_Krauss::MSCFModel_Krauss
(
const
MSVehicleType
* vtype,
SUMOReal
accel,
SUMOReal
decel,
46
SUMOReal
dawdle,
SUMOReal
headwayTime)
47
:
MSCFModel_KraussOrig1
(vtype, accel, decel, dawdle, headwayTime) {
48
}
49
50
51
MSCFModel_Krauss::~MSCFModel_Krauss
() {}
52
53
54
SUMOReal
55
MSCFModel_Krauss::followSpeed
(
const
MSVehicle
*
const
veh,
SUMOReal
speed,
SUMOReal
gap,
SUMOReal
predSpeed,
SUMOReal
predMaxDecel)
const
{
56
return
MIN2
(
_vsafe
(gap, predSpeed, predMaxDecel),
maxNextSpeed
(speed, veh));
57
}
58
59
60
SUMOReal
61
MSCFModel_Krauss::stopSpeed
(
const
MSVehicle
*
const
veh,
SUMOReal
gap)
const
{
62
return
MIN2
(
_vsafe
(gap, 0, 0),
maxNextSpeed
(veh->
getSpeed
(), veh));
63
}
64
65
66
SUMOReal
67
MSCFModel_Krauss::dawdle
(
SUMOReal
speed)
const
{
68
// generate random number out of [0,1]
69
SUMOReal
random =
RandHelper::rand
();
70
// Dawdle.
71
if
(speed <
myAccel
) {
72
// we should not prevent vehicles from driving just due to dawdling
73
// if someone is starting, he should definitely start
74
// (but what about slow-to-start?)!!!
75
speed -=
ACCEL2SPEED
(
myDawdle
* speed * random);
76
}
else
{
77
speed -=
ACCEL2SPEED
(
myDawdle
*
myAccel
* random);
78
}
79
return
MAX2
(
SUMOReal
(0), speed);
80
}
81
82
84
SUMOReal
85
MSCFModel_Krauss::_vsafe
(
SUMOReal
gap,
SUMOReal
predSpeed,
SUMOReal
predMaxDecel)
const
{
86
if
(predSpeed < predMaxDecel) {
87
// avoid discretization error at low speeds
88
predSpeed = 0;
89
}
90
if
(predSpeed == 0) {
91
if
(gap < 0.01) {
92
return
0;
93
}
94
return
(
SUMOReal
)(-
myTauDecel
+ sqrt(
myTauDecel
*
myTauDecel
+ 2. *
myDecel
* gap));
95
}
96
// follow the leader
97
// g=gap, t=myHeadwayTime, a=predMaxDecel, b=myDecel, v=predSpeed, x=vSafe
98
// Solution approach: equal distances after leader and follower have stopped (partly discretized).
99
// g + (v^2 - a*v)/(2*a) = x*t + (x^2 - b*x)/(2*b) + 0.5
100
// The term (+ 0.5) gives an upper bound for the follower stopping distance to handle discretization errors.
101
// Unfortunately, the solution approach is not correct when b > a since the
102
// follower path may cross the leader path even with equal stopping distances.
103
// As a workaround we lower the value of b to get a collision free model
104
// This approach should be refined to get a higher (still safe) following speed.
105
const
SUMOReal
egoDecel =
MIN2
(
myDecel
, predMaxDecel);
106
return
(
SUMOReal
)(0.5 * sqrt(
107
4.0 * egoDecel * (2.0 * gap + predSpeed * predSpeed / predMaxDecel - predSpeed - 1.0)
108
+ (egoDecel * (2.0 *
myHeadwayTime
- 1.0))
109
* (egoDecel * (2.0 *
myHeadwayTime
- 1.0)))
110
+
myDecel
* (0.5 -
myHeadwayTime
));
111
}
112
113
114
MSCFModel
*
115
MSCFModel_Krauss::duplicate
(
const
MSVehicleType
* vtype)
const
{
116
return
new
MSCFModel_Krauss
(vtype,
myAccel
,
myDecel
,
myDawdle
,
myHeadwayTime
);
117
}
118
119
120
//void MSCFModel::saveState(std::ostream &os) {}
121
build
buildd
sumo-0.17.1~dfsg
src
microsim
cfmodels
MSCFModel_Krauss.cpp
Generated on Sun Jun 16 2013 17:30:16 for SUMO - Simulation of Urban MObility by
1.8.3.1