SUMO - Simulation of Urban MObility
MSCFModel_PWag2009.cpp
Go to the documentation of this file.
00001 /****************************************************************************/
00009 // Scalable model based on Krauß by Peter Wagner
00010 /****************************************************************************/
00011 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00012 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
00013 /****************************************************************************/
00014 //
00015 //   This file is part of SUMO.
00016 //   SUMO is free software: you can redistribute it and/or modify
00017 //   it under the terms of the GNU General Public License as published by
00018 //   the Free Software Foundation, either version 3 of the License, or
00019 //   (at your option) any later version.
00020 //
00021 /****************************************************************************/
00022 
00023 
00024 // ===========================================================================
00025 // included modules
00026 // ===========================================================================
00027 #ifdef _MSC_VER
00028 #include <windows_config.h>
00029 #else
00030 #include <config.h>
00031 #endif
00032 
00033 #include <microsim/MSVehicle.h>
00034 #include <microsim/MSLane.h>
00035 #include "MSCFModel_PWag2009.h"
00036 #include <utils/common/RandHelper.h>
00037 
00038 
00039 // ===========================================================================
00040 // method definitions
00041 // ===========================================================================
00042 MSCFModel_PWag2009::MSCFModel_PWag2009(const MSVehicleType* vtype,  SUMOReal accel, SUMOReal decel,
00043                                        SUMOReal dawdle, SUMOReal headwayTime, SUMOReal tauLast, SUMOReal apProb)
00044     : MSCFModel(vtype, accel, decel, headwayTime), myDawdle(dawdle),
00045       myTauDecel(decel* headwayTime), myDecelDivTau(decel / headwayTime), myTauLastDecel(decel* tauLast),
00046       myActionPointProbability(apProb) {
00047 }
00048 
00049 
00050 MSCFModel_PWag2009::~MSCFModel_PWag2009() {}
00051 
00052 
00053 SUMOReal
00054 MSCFModel_PWag2009::moveHelper(MSVehicle* const veh, SUMOReal vPos) const {
00055     const SUMOReal vNext = MSCFModel::moveHelper(veh, vPos);
00056     const SUMOReal speed = veh->getSpeed();
00057     VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
00058     // model should re-use acceleration from previous time-step:
00059     SUMOReal apref = vars->aOld;
00060     const SUMOReal asafe = SPEED2ACCEL(vNext - speed);
00061     if (apref <= asafe && RandHelper::rand() > myActionPointProbability * TS) {
00062         std::pair<MSVehicle* const, SUMOReal> l = veh->getLane()->getLeaderOnConsecutive(100., 0., speed, *veh, veh->getBestLanesContinuation(veh->getLane()));
00063         if (l.first) {
00064             apref = myDecelDivTau * (l.second + (l.first->getSpeed() - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
00065             apref += myDawdle * RandHelper::rand((SUMOReal) - 1., (SUMOReal)1.);
00066         }
00067     }
00068     if (apref > asafe) {
00069         apref = asafe;
00070     }
00071     vars->aOld = apref;  // save this value for the next time-step
00072     return MAX2((SUMOReal)0, speed + ACCEL2SPEED(apref));
00073 }
00074 
00075 
00076 SUMOReal
00077 MSCFModel_PWag2009::followSpeed(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal /*predMaxDecel*/) const {
00078     return _v(veh, speed, gap, predSpeed);
00079 }
00080 
00081 
00082 SUMOReal
00083 MSCFModel_PWag2009::stopSpeed(const MSVehicle* const veh, SUMOReal gap) const {
00084     return _v(veh, veh->getSpeed(), gap, 0);
00085 }
00086 
00087 
00088 SUMOReal
00089 MSCFModel_PWag2009::dawdle(SUMOReal speed) const {
00090     return MAX2(SUMOReal(0), speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
00091 }
00092 
00093 // in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle
00094 // myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be
00095 // more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have
00096 // seen so far in data ...
00097 SUMOReal
00098 MSCFModel_PWag2009::_v(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed) const {
00099     if (predSpeed == 0 && gap < 0.01) {
00100         return 0;
00101     }
00102     const SUMOReal vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
00103     return MAX2((SUMOReal)0, vsafe);
00104 }
00105 
00106 
00107 MSCFModel*
00108 MSCFModel_PWag2009::duplicate(const MSVehicleType* vtype) const {
00109     return new MSCFModel_PWag2009(vtype, myAccel, myDecel, myDawdle, myHeadwayTime, myTauLastDecel / myDecel, myActionPointProbability);
00110 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines