SUMO - Simulation of Urban MObility

MSCFModel_PWag2009.cpp

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